Python机器学习之垃圾短信分类(用朴素贝叶斯算法的伯努利模型和多项式模型分类垃圾短信数据集SMSSpamCollection.txt)

一. 数据集下载地址
SMSSpamCollection.txt

二. 打开下载的.txt文件,可以看到数据集长这样,标签(ham和spam,spam就是指垃圾短信)与文本之间的分隔符是一个tab键,也就是‘\t’
在这里插入图片描述
三. 首先用pd.read_csv函数读取该数据集时要注意设置分隔符sep=’\t’,然后用replace方法把“ham”标签用0替代,“spam”用1替代,方便看预测结果。

data=pd.read_csv(path,sep='\t', header=None, names=Cnames)
data=data.replace({'ham':0,'spam':1})  #替换标签值
print('数据集展示:')
print(data)

读取出来像这样:
在这里插入图片描述
朴素贝叶斯算法分类垃圾短信,就是要找出哪些单词最常出现在垃圾短信中,将这些最常出现的单词,作为特殊单词,用来过滤短信。接下来就是用词袋方法处理文本信息,也就是统计一大段话里的不同单词的出现次数,最后得到一个频率矩阵,矩阵的行就是数据集里的每一行短信,矩阵的列就是短信里每个单词,元素值就是该单词的出现频率。有了频率,那么特殊单词也就能找到了。可以用sklearn库提供的CountVectorizer()方法实现词袋处理。

from sklearn.feature_extraction.text import CountVectorizer
#random_state等于哪个正整数随意
x_train,x_test,y_train,y_test=train_test_split(X,y,train_size=0.8,random_state=123)
vector_nomial=CountVectorizer()  #实现词袋模型
train_matrix=vector_nomial.fit_transform(x_train)
test_matrix=vector_nomial.transform(x_test)

四. 将训练数据和测试数据输入到词袋模型里,就可以得到对应的频率矩阵。最后分别运用sklearn提供的伯努利模型和多项式模型对垃圾短信进行分类。

from sklearn.naive_bayes import BernoulliNB,MultinomialNB

polynomial=MultinomialNB()
clm_nomial=polynomial.fit(train_matrix,y_train)
result_nomial=clm_nomial.predict(test_matrix)

两个模型返回的分类结果都是长度为1115(我设置的训练集占比为80%),类型为ndarray的列表。最终,多项式模型的R²分值(决定系数)为0.986,伯努利模型的R²分值为0.980。二者的分类结果几乎是相同的。

在这里插入图片描述
五. 完整代码

from sklearn.naive_bayes import BernoulliNB,MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
import pandas as pd

path = 'E:/Python_file/zuoye/SMSSpamCollection.txt'  
Cnames=['labels','messages']
data = pd.read_csv(path,sep='\t', header=None, names=Cnames)  #读取数据集,分隔符是\t
data=data.replace({'ham':0,'spam':1})  #替换标签值
print('数据集展示:')
print(data)
print('\n----------------------------------\n')
X=data['messages']
y=data['labels']
x_train,x_test,y_train,y_test=train_test_split(X,y,train_size=0.8,random_state=123)
vector_nomial=CountVectorizer()  #实现词袋模型
vector_bernou=CountVectorizer()

#多项式模型分类垃圾短信
train_matrix=vector_nomial.fit_transform(x_train)
test_matrix=vector_nomial.transform(x_test)
polynomial=MultinomialNB()
clm_nomial=polynomial.fit(train_matrix,y_train)
result_nomial=clm_nomial.predict(test_matrix)

#伯努利模型分类垃圾短信
train_matrix=vector_bernou.fit_transform(x_train)
test_matrix=vector_bernou.transform(x_test)
Bernoulli=BernoulliNB()
clm_bernoulli=Bernoulli.fit(train_matrix,y_train)
result_bernou=clm_bernoulli.predict(test_matrix)


print('多项式模型的预测结果,类型,长度:')
print(result_nomial,type(result_nomial),result_nomial.shape)
print('多项式模型的前一百个预测结果:')
print(result_nomial[0:100])
print('多项式模型模型R²评分:'+ str(clm_nomial.score(test_matrix,y_test))) 
print('\n----------------------------------\n')

print('伯努利模型的预测结果,类型,长度:')
print(result_bernou,type(result_bernou),result_bernou.shape)
print('伯努利模型的前一百个预测结果:')
print(result_bernou[0:100])
print('伯努利模型R²评分:'+ str(clm_bernoulli.score(test_matrix,y_test)))
  • 30
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程,如有问题或建议,请及时私信沟通,帮助解答。 2.主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 基于机器学习贝叶斯算法实现垃圾邮件分类python源码+项目说明+数据集.zip Python3 - pandas - 用于保存自定义测试集下训练邮件内的单词 - pyecharts>=1.0.0 - 个人喜欢用pyecharts来做图,如果你希望使用其他作图工具,可以自动修改draw_result()函数,如果您不希望作图,可以手动注释掉bayesian.draw_result()这条语句,位于751行。注意的是,pyecharts最后保存出来的是html文件 - snapshot_selenium - 将pyecharts保存的html文件生成图片,您需要使用到chromedriver,请手动下载,如果不下载的话,您可以注释掉所有make_snapshot()语句,或者忽略终端报出来的错误 - skleran - 贝叶斯分类器是自己实现的,但SVM调用的是现成的库函数 - nltk - 用于去停用词和词性还原,需要下载一些包,您可以去官网下载,或者在百度云里下载:链接:https://pan.baidu.com/s/1_eU5sTe2bMWMJaqxA7IO8w 提取码:0pc9 ,您可以不用下载所有的包,只需要下载corpora的stopwords和wordnet、stemmers的porter_test和rslp、taggers的averaged_perceptron_tagger。然后将这些文件放于C:\Users\xxxxx\AppData\Roaming\nltk_data即可) 参数解释: ``` --model:模型的选择,默认为5 - 单使用伯努利模型为1 - 单使用多项式模型为2 - 单使用SVM为3 - 三个模型同时测试,并且你已经将邮件的测试集和训练集准备好的,为4 - 三个模型同时测试,并且邮件的训练集和测试集为随机生成,为5 --train_path:训练集(或总文件)的路径,默认为'train' --test_path:测试集路径,默认为'test' --test_times:测试的次数,每次测试随机生成的测试集均不一样,默认为1 --test_file_num:每一类进行测试的邮件数目,默认为5 注意,train和test文件夹下,各自建立子文件spam和ham来分别存放垃圾邮件和正常邮件 ``` - 使用方法为: ``` python bayes.py --model 5 --test_times 70 ``` ```python python bayes.py --model 5 --train_path 'train' --test_times 70 --test_file_num 5 ``` ```python python bayes.py --model 5 --train_path 'train' --test_path 'test' --test_file_num 5 ``` - 结果: 如果你使用第一条命令来进行训练和测试,那么你将会得到三个模型测试后的正确率、错误邮件个数,以及三个模型对应的识别错误的邮件分布情况,如下所示: ![正确率](README.assets/正确率.png) ![错误邮件个数](README.assets/错误邮件个数.png) ![SVM-邮件错误识别](README.assets/SVM-邮件错误识别.png) ![伯努利模型-邮件错误识别](README.assets/伯努利模型-邮件错误识别.png) ![多项式模型-邮件错误识别](README.assets/多项式模型-邮件错误识别.png) 除此之外,在终端上,你可以看到用来作出这些图片的数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值