13-垃圾邮件分类2

1.读取

2.数据预处理

前两步请见:https://www.cnblogs.com/cyxxixi/p/12892357.html

3.数据划分—训练集和测试集数据划分

# new_data是要划分的样本特征集--邮件内容,sms_label是划分的样本结果集--垃圾邮件还是普通邮件
# test_size是样本占比,选20%来测试,random_state是随机参数,stratify是平衡比例的

1 emails=pd.read_csv("new_email.csv") #要import pandas as pd
2 data=emails.iloc[:,1] #邮箱文本样本
3 labels=emails.iloc[:,0]  #邮箱标签,垃圾邮件还是普通邮件
4 
5 from sklearn.model_selection import train_test_split
6 
7 x_train,x_test,y_train,y_test=train_test_split(data,labels,test_size=0.2,random_state=0,stratify=labels)
8 print('训练样本个数:',len(x_train),'测试样本个数:',len(x_test),'训练标签个数:',len(y_train),'测试标签个数:',len(y_test))

运行结果:

13-垃圾邮件分类2_第1张图片

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

 1 # 4、文本特征提取---词袋模型
 2 # TfidfVectorizer除了考虑词汇在本文中出现的频率,还考虑在别的文本中出现的频率
 3 from sklearn.feature_extraction.text import TfidfVectorizer
 4 
 5 tfdvect=TfidfVectorizer()
 6 X_train=tfdvect.fit_transform(x_train) #向量化
 7 X_test=tfdvect.transform(x_test) #向量化
 8 
 9 X_train.toarray().shape  #(4457, 6719)  6719是词汇表个数
10 X_test.toarray().shape
11 tfdvect.vocabulary_ #词汇表

运行结果:

13-垃圾邮件分类2_第2张图片

观察邮件与向量的关系

词汇表出来以后,每个邮件的shape变成了(1,len(tfdvect.vocabulary_)),所以变成了[0,0,0.....0,0]这样的形式,如果邮件中的单词在词汇表里有的话,就不为0。

13-垃圾邮件分类2_第3张图片

向量还原为邮件

13-垃圾邮件分类2_第4张图片

5.模型选择

from sklearn.naive_bayes import GaussianNB

from sklearn.naive_bayes import MultinomialNB

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

1 from sklearn.naive_bayes import MultinomialNB
2 
3 mnb=MultinomialNB() #构造模型
4 mnb.fit(X_train,y_train) #训练模型
5 y_pre=mnb.predict(X_test) #预测
6 print('预测值',y_pre,'\n',"真实值",y_test)
7 print('不符合预测值的个数:',(y_pre!=y_test).sum(),"符合预测的个数",(y_pre==y_test).sum())

运行结果:

13-垃圾邮件分类2_第5张图片

根据分类的特征来选模型

高斯朴素贝叶斯是呈正态分布的,更多的是当样本中数据特征相似时处于一个区间,而其他的特征出现的较少

垃圾邮件分类是单词对与文本的重要性,是单词变量出现次数在其文本中所占比例,以及在其他文本中所占比例,是n次独立重复实验中随机事件出现的次数分别为n1,n2,....,nk的概率符合多项式分布概率。

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

from sklearn.metrics import confusion_matrix

confusion_matrix = confusion_matrix(y_test, y_predict)

说明混淆矩阵的含义

from sklearn.metrics import classification_report

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

# 5、模型评估
from sklearn.metrics import confusion_matrix #混淆矩阵
from sklearn.metrics import classification_report #回归报告
import numpy as np

con_m=confusion_matrix(y_test,y_pre)
print("混淆矩阵",con_m)
print((con_m[0][0]+con_m[1][1])/np.sum(con_m))
c_r=classification_report(y_test,y_pre)
print("回归报告:\n",c_r)

 运行结果:

13-垃圾邮件分类2_第6张图片

说明混淆矩阵的含义

13-垃圾邮件分类2_第7张图片

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

13-垃圾邮件分类2_第8张图片

7.比较与总结

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

CountVectorizer()函数只考虑词汇在文本中出现的频率,属于词袋模型特征。

TfidfVectorizer()除了考量某词汇在文本出现的频率,还关注包含这个词汇的所有文本的数量。能够削减高频没有意义的词汇出现带来的影响, 挖掘更有意义的特征。属于Tfidf特征。

 1 from sklearn.feature_extraction.text import CountVectorizer
 2 cvect=CountVectorizer()
 3 XX_train=cvect.fit_transform(x_train)#向量化
 4 XX_test=cvect.transform(x_test)#向量化
 5 XX_train.toarray()[0]
 6 import numpy as np
 7 aa=np.flatnonzero(XX_train.toarray()[0])#非0元素对应的单词
 8 aa
 9 from sklearn.naive_bayes import MultinomialNB
10 mnb1=MultinomialNB() #构造模型
11 mnb1.fit(XX_train,y_train) #训练模型
12 yy_pre=mnb1.predict(XX_test) #预测
13 print('CountVectorizer的的预测值',yy_pre,'\n',"CountVectorizer的真实值",y_test)
14 print('CountVectorizer的不符合预测值的个数:',(yy_pre!=y_test).sum(),"CountVectorizer的符合预测的个数",(yy_pre==y_test).sum())
15 from sklearn.metrics import confusion_matrix #混淆矩阵
16 from sklearn.metrics import classification_report #回归报告
17 import numpy as np
18 con_m1=confusion_matrix(y_test,yy_pre)
19 print("CountVectorizer的混淆矩阵",con_m1)
20 print((con_m1[0][0]+con_m1[1][1])/np.sum(con_m1))
21 c_r1=classification_report(y_test,yy_pre)
22 print("CountVectorizer的回归报告:\n",c_r1)
View Code

13-垃圾邮件分类2_第9张图片

用CountVectorizer进行文本特征生成,与TfidfVectorizer相比,进行代码编写,结果运行后,发现CountVectorizer的效果似乎更好一点。

CountVectorizer在混淆矩阵中,正确的预测会比TfidfVectorizer更加少一点。

参考:https://blog.csdn.net/weixin_40547993/article/details/90296785?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-6
https://blog.csdn.net/u013063099/article/details/80964865

你可能感兴趣的:(13-垃圾邮件分类2)