- 简述
LDA线性判别分析(linear discriminant analysis, LDA)是最直接和最快的分类模型之一,是一种有监督的算法。模型的训练可分为3步:
(1)计算某个类(如垃圾短消息类)中所有TF-IDF向量的平均位置(质心);
(2)计算不在该类(如非垃圾短消息类)中的所有TF-IDF向量的平均位置(质心);
(3)计算上述两个质心之间的向量差(即连接这两个向量的直线)。
- 例子
下面是一个例子:
import pandas as pd
from nlpia.data.loaders import get_data
pd.options.display.width = 120
sms = get_data('sms-spam')
下面是sms的样子:
"""
将DataFrame的index设置成方便看的形式
可以看到在DataFrame里面spam为0的表示非垃圾信息,为1的表示垃圾信息
变换之后index带!的表示垃圾信息
"""
index = ['sms{}{}'.format(i, '!'*j) for (i, j) in zip(range(len(sms)), sms.spam)]
sms = pd.DataFrame(sms.values, columns=sms.columns, index=index)
sms['spam'] = sms.spam.astype(int)
sms['spam'] = sms.spam
接下来对这些短消息进行分词,并将他们转换为TF-IDF向量(关于TF-IDF参考这里):
from sklearn.feature_extraction.text import TfidfVectorizer
from nltk.tokenize.casual import casual_tokenize
tfidf_model = TfidfVectorizer(tokenizer=casual_tokenize)
tfidf_docs = tfidf_model.fit_transform(raw_documents=sms.text).toarray()
这里的4837代表sms有4837个消息,9232代表sms里面有9232个不同的单词即词汇表的大小为9232。词汇表的规模是标注垃圾信息的10倍,通常词汇表的规模远远大于标注样本数量时朴素贝叶斯分类器就不是很奏效了,但是LDA会比较有效。
可以看到TF-IDF矩阵是很稀疏的矩阵,但里面的值肯定不都是0,比如:
下面是计算两类的质心:
"""
计算质心
"""
mask = sms.spam.astype(bool).values
spam_centroid = tfidf_docs[mask].mean(axis=0)
ham_centroid = tfidf_docs[~mask].mean(axis=0)
spam_centroid.round(2)
ham_centroid.round(2)
spamminess_score = tfidf_docs.dot(spam_centroid - ham_centroid)
spamminess_score.round(2)
我们所得到的质心之间的向量就是分类模型了,用一个文档的tfidf向量与分类向量点乘可以得到一个score,当然垃圾信息和非垃圾信息得到的score会有比较明显的差别,我们设置一个阈值然后就可以把信息分为两个类了。
我们还想使score分布在0到1之间,这样就可以作为一个置信分数了:
from sklearn.preprocessing import MinMaxScaler
sms['lda_score'] = MinMaxScaler().fit_transform(spamminess_score.reshape(-1,1))
sms['lda_predict'] = (sms.lda_score > .5).astype(int)
sms['spam lda_predict lda_score'.split()].round(2).head(6)
输出:
spam lda_predict lda_score
sms0 0 0 0.23
sms1 0 0 0.18
sms2! 1 1 0.72
sms3 0 0 0.18
sms4 0 0 0.29
sms5! 1 1 0.55
Original: https://blog.csdn.net/comli_cn/article/details/123297133
Author: comli_cn
Title: 使用LDA分类器对邮件进行分类
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/678351/
转载文章受原作者版权保护。转载请注明原作者出处!