#朴素贝叶斯之垃圾邮件过滤
import os
#----------------------1、获取数据集-----------------------
import pandas as pd
'''
函数功能:创建实验数据集
参数:无参数
返回:
dataSet:带标签的实验数据集(DF格式)
'''
def get_dataSet():
ham=[]
#ham目录下25个都要读取 ham(非垃圾邮件)
for i in range(1,26):
file_path='../MLinAction_source/email/ham/%d.txt'%(i)
data=open(file_path,encoding='gbk',errors='ignore').read()
ham.append([data,'ham']) #前面是文本 后面是类别
df1=pd.DataFrame(ham) #变成DataFrame格式
spam=[]
#spam目录下的25个都录取 spam(垃圾邮件)
for i in range(1,26):
file_path='../MLinAction_source/email/spam/%d.txt'%(i)
data=open(file_path,encoding='gbk',errors='ignore').read()
spam.append([data,'spam'])
df2=pd.DataFrame(spam)
dataSet=pd.concat([df1,df2],ignore_index=True) #合并垃圾邮件和非垃圾邮件 ignore_index忽略索引 顺着前面的索引往后拼接
return dataSet
dataSet=get_dataSet()
print(dataSet)
#----------------------2、使用SKlearn对训练集进行特征值抽取-----------------------
'''
TfidfVectorizer = TfidfTransformer + CountVectorizer
CountVectorizer 的用途就是将文本文档转换为计数矩阵,
TfidfTransformer 的用途就是将计数矩阵转换为标准化的tf或tf-idf.
feature_extraction:特征抽取
Tf(term-frequency):词频,词语在文档中出现的频率
idf(inverse document frequency):逆文档频率
Tfidf:词频*逆文档频率
'''
from sklearn.feature_extraction.text import TfidfVectorizer
tf=TfidfVectorizer() #用来抽取文字的特征
tf.fit(dataSet[0]) #对所有内容进行学习 dataSet[0]-文本内容 dataSet[1]-标签
data_tf=tf.transform(dataSet[0]) #对学习的内容进行特征抽取
#----------------------3、切分训练集和测试集-----------------------
#调用Sklearn中的train_test_split函数来切分数据集
from sklearn.model_selection import train_test_split
xtrain,xtest,ytrain,ytest=train_test_split(data_tf,dataSet[1],test_size=0.2)
xtest.shape[0]
ytest
#----------------------4、训练模型-----------------------
#使用多项式朴素贝叶斯和伯努利分布朴素贝叶斯两种方法分别进行模型的训练
from sklearn.naive_bayes import GaussianNB,MultinomialNB,BernoulliNB
#多项式分布朴素贝叶斯
mnb=MultinomialNB() #获取模型
mnb.fit(xtrain,ytrain) #训练模型
acc=mnb.score(xtest,ytest) #查看准确率
print('多项式分布朴素贝叶斯准确率:',acc)
#伯努利分布朴素贝叶斯
bnb=BernoulliNB()
bnb.fit(xtrain,ytrain)
acc=bnb.score(xtest,ytest)
print('伯努利分布朴素贝叶斯准确率:',acc)
#----------------------5、交叉验证-----------------------
#导入必要的包
from sklearn.model_selection import cross_val_score
import matplotlib
import matplotlib.pyplot as plt
# %matplotlib inline
plt.rcParams['font.sans-serif']=['Simhei'] #显示中文
#进行10次十折交叉验证
mnbs=[]
bnbs=[]
for i in range(10):
mnb=MultinomialNB()
mnb_s=cross_val_score(mnb,data_tf,dataSet[1],cv=10).mean()
mnbs.append(mnb_s)
bnb=BernoulliNB()
bnb_s=cross_val_score(bnb, data_tf, dataSet[1], cv=10).mean()
bnbs.append(bnb_s)
plt.plot(range(1,11),mnbs,label="多项式朴素贝叶斯")
plt.plot(range(1,11),bnbs,label="伯努利朴素贝叶斯")
plt.legend()
plt.show()
Email数据集:
链接
提取码:k9n3