13 垃圾邮件分类2
1.读取
2.数据预处理
3.数据划分—训练集和测试集数据划分
from sklearn.model_selection import train_test_split
x_train,x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=0, stratify=y_train)
4.文本特征提取
sklearn.feature_extraction.text.CountVectorizer
sklearn.feature_extraction.text.TfidfVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf2 = TfidfVectorizer()
观察邮件与向量的关系
向量还原为邮件
4.模型选择
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
说明为什么选择这个模型?
高斯分布模型:正态分布,用于一般分类问题,可以将连续型变量(特征)转换成离散型的值。
多项式分布模型:适用于文本分类(特征是单词,值是单词的出现次数)。
所以选用多项式分布模型。
5.模型评价:混淆矩阵,分类报告
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_test, y_predict)
说明混淆矩阵的含义
混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。
每一列代表了预测类别,每一列的总数表示预测为该类别的数据的数目;
每一行代表了数据的真实归属类别,每一行的数据总数表示该类别的数据实例的数目;
每一列中的数值表示真实数据被预测为该类的数目。
TP:真正类(True positive),样本的真实类别是正类,并且模型识别的结果也是正类。
FN:假负类(False Negative),样本的真实类别是正类,但是模型将其识别成为负类
FP:假正类(False positive),样本的真实类别是负类,但是模型将其识别成为正类
TN:真负类(True Negative),样本的真实类别是负类,并且模型将其识别成为负类。
from sklearn.metrics import classification_report
说明准确率、精确率、召回率、F1值分别代表的意义
(参考:https://blog.csdn.net/u013063099/article/details/80964865)
准确率(Accuracy):所有的预测正确(正类负类)的占总的比重。
精确率(Precision):查准率,即正确预测为正的占全部预测为正的比例。
召回率(Recall):查全率,即正确预测为正的占全部实际为正的比例。
F1值(H-mean值):用来衡量二分类模型精确度的一种指标,同时兼顾了分类模型的精确率和召回率。
F1值为算数平均数除以几何平均数,且越大越好,将Precision和Recall的上述公式带入会发现,当F1值小时,True Positive相对增加,而false相对减少,即Precision和Recall都相对增加,即F1对Precision和Recall都进行了加权。
公式转化之后为:
6.比较与总结
如果用CountVectorizer进行文本特征生成,与TfidfVectorizer相比,效果如何?
CountVectorizer:
只考虑词汇在文本中出现的频率
TfidfVectorizer:
除了考量某词汇在本文本出现的频率,还关注包含这个词汇的其它文本的数量
能够削减高频没有意义的词汇出现带来的影晌,挖掘更有意义的特征
CountVectorizer与TfidfVectorizer相比:
混淆矩阵:真正类更少、假负类更多、假正类更少、真负类更多。
分类报告:准确率更高、综合精确率(查准率)更低、综合召回率(查全率)更高、F1值更高
模型准确率也更高。
通过上面的对比结果,感觉用CountVectorizer效果好,但是用TfidfVectorizer可以削减高频没有意义的词汇,应用于实际更有意义,实际效果也会更好。