700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 第四章 朴素贝叶斯-垃圾邮件过滤

第四章 朴素贝叶斯-垃圾邮件过滤

时间:2023-04-28 13:25:05

相关推荐

第四章 朴素贝叶斯-垃圾邮件过滤

#朴素贝叶斯之垃圾邮件过滤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 dataSetdataSet=get_dataSet()print(dataSet)#----------------------2、使用SKlearn对训练集进行特征值抽取-----------------------'''TfidfVectorizer = TfidfTransformer + CountVectorizerCountVectorizer 的用途就是将文本文档转换为计数矩阵,TfidfTransformer 的用途就是将计数矩阵转换为标准化的tf或tf-idf.feature_extraction:特征抽取Tf(term-frequency):词频,词语在文档中出现的频率idf(inverse document frequency):逆文档频率Tfidf:词频*逆文档频率'''from sklearn.feature_extraction.text import TfidfVectorizertf=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_splitxtrain,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_scoreimport matplotlibimport matplotlib.pyplot as plt# %matplotlib inlineplt.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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。