13-垃圾邮件分类2 1.读取 2.数据预处理 3.数据划分—训练集和测试集数据划分 4.文本特征提取 4.模型选择 5.模型评价:混淆矩阵,分类报告 6.比较与总结

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)

13-垃圾邮件分类2
1.读取
2.数据预处理
3.数据划分—训练集和测试集数据划分
4.文本特征提取
4.模型选择
5.模型评价:混淆矩阵,分类报告
6.比较与总结

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()

观察邮件与向量的关系

向量还原为邮件

(1)用TfidfVectorizer提取

13-垃圾邮件分类2
1.读取
2.数据预处理
3.数据划分—训练集和测试集数据划分
4.文本特征提取
4.模型选择
5.模型评价:混淆矩阵,分类报告
6.比较与总结

TfidfVectorizer的提取结果:

13-垃圾邮件分类2
1.读取
2.数据预处理
3.数据划分—训练集和测试集数据划分
4.文本特征提取
4.模型选择
5.模型评价:混淆矩阵,分类报告
6.比较与总结

 (2)用CountVectorizer提取

13-垃圾邮件分类2
1.读取
2.数据预处理
3.数据划分—训练集和测试集数据划分
4.文本特征提取
4.模型选择
5.模型评价:混淆矩阵,分类报告
6.比较与总结

 提取结果:

 13-垃圾邮件分类2
1.读取
2.数据预处理
3.数据划分—训练集和测试集数据划分
4.文本特征提取
4.模型选择
5.模型评价:混淆矩阵,分类报告
6.比较与总结

 提取第一份邮件时两种方法提取的邮件内容并无差别

4.模型选择

from sklearn.naive_bayes import GaussianNB

from sklearn.naive_bayes import MultinomialNB

说明为什么选择这个模型?

因为高斯贝叶斯适用于正态分布数据,而从词袋中抽出单词,统计某一单词出现的频率属于n次独立重复试验,属于多项式分布概率,应该用多项式贝叶斯,所以选择MultinomialNB模型

13-垃圾邮件分类2
1.读取
2.数据预处理
3.数据划分—训练集和测试集数据划分
4.文本特征提取
4.模型选择
5.模型评价:混淆矩阵,分类报告
6.比较与总结

5.模型评价:混淆矩阵,分类报告

from sklearn.metrics import confusion_matrix

confusion_matrix = confusion_matrix(y_test, y_predict)

说明混淆矩阵的含义

from sklearn.metrics import classification_report

说明准确率、精确率、召回率、F值分别代表的意义 

 (1)混淆矩阵

13-垃圾邮件分类2
1.读取
2.数据预处理
3.数据划分—训练集和测试集数据划分
4.文本特征提取
4.模型选择
5.模型评价:混淆矩阵,分类报告
6.比较与总结

ham的预测个数(0

spam的预测个数(1

邮件实际类型个数统计

ham的真实个数(0

966TP

0FN

966

spam的真实个数(1

49FP

100TN

149

邮件类型预测统计

1015

109

1115

TP(True Positive): 真实为0,预测也为0即真实为ham,预测也为ham的邮件个数;

FN(False Negative): 真实为0,预测为1即真实为ham,预测为spam的邮件个数;

FP(False Positive): 真实为1,预测为0,即真实为spam,预测为ham的邮件个数;

TN(True Negative): 真实为1,预测也为1即真实为span预测也为spam的邮件个数;

(2)分类报告

13-垃圾邮件分类2
1.读取
2.数据预处理
3.数据划分—训练集和测试集数据划分
4.文本特征提取
4.模型选择
5.模型评价:混淆矩阵,分类报告
6.比较与总结

精确率:预测为正类0的准确率,Precision=TP/(TP+FP)

召回率:真实为0预测也为0的准确率,recall=TP/(TP+FN)

准确率:所有样本中被预测正确的样本比例,accuracy=TP+TN/(TP+FN+FP+TN)

F值:用来衡量二分类模型精确度的一种指标,他同时兼顾了分类模型的精确率和召回率。

6.比较与总结

如果用CountVectorizer进行文本特征生成,与TfidfVectorizer相比,效果如何?

在给训练集第一封邮件生成文本特征时,并无明显区别,当从整体上看,他们俩还是有所区别的

(1)CountVectorizer与TfidfVectorizer的区别

CountVectorizer:只考虑了词汇在文本中出现的概率

TfidfVectorizer:除了考虑某词汇在本文本出现的概率,还关注包含这个词语的其他文本的数量,计算他们的TF-IDF,找出文字中的关键词,它能够削减掉那些高频但是在整个文本当做不是具有十分意义的词汇,从而挖掘出更具代表性的词语

TF-IDF的计算公式:TF-IDF=TF*IDF

其中:

13-垃圾邮件分类2
1.读取
2.数据预处理
3.数据划分—训练集和测试集数据划分
4.文本特征提取
4.模型选择
5.模型评价:混淆矩阵,分类报告
6.比较与总结

 

 如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)

(2)TfidfVectorizer生成的文本特征训练模型得出的结果如下图所示:


13-垃圾邮件分类2
1.读取
2.数据预处理
3.数据划分—训练集和测试集数据划分
4.文本特征提取
4.模型选择
5.模型评价:混淆矩阵,分类报告
6.比较与总结

(3)CountVectorizer生成的文本特征训练模型得出的结果如下图所示:

13-垃圾邮件分类2
1.读取
2.数据预处理
3.数据划分—训练集和测试集数据划分
4.文本特征提取
4.模型选择
5.模型评价:混淆矩阵,分类报告
6.比较与总结

由结果可见,在此次使用CountVectorizer生成的文本特征训练模型比使用TfidfVectorizer生成特征的模型准确率略高点,CountVectorizer生成的文本模型,预测结果:实际邮件是spam预测也为spam的数量比TfidfVectorizer生成的模型多,但是实际是

ham,预测为ham的数量就比TfidfVectorizer生成的模型数量少点,两者相比,CountVectorizer生成的文本构成训练的模型自然就比TfidfVectorizer准确率高了点。