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

https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html?highlight=sklearn%20feature_extraction%20text%20tfidfvectorizer

sklearn.feature_extraction.text.TfidfVectorizer

https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html?highlight=sklearn%20feature_extraction%20text%20tfidfvectorizer#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可以削减高频没有意义的词汇,应用于实际更有意义,实际效果也会更好。

原文地址:https://www.cnblogs.com/linyanli/p/12929489.html