一、实验问题
基于朴素贝叶斯的垃圾邮件识别
二、实验软件
Python编程语言
三、实验目的
- 熟悉sklearn模块朴素贝叶斯分类的问题求解过程;
- 熟悉朴素贝叶斯建模及模型评估方法;
四、实验数据及步骤:
- 问题要求:随着互联网的不断发展,电子邮件因其快速便捷的沟通方式也在人们生活和工作中扮演着不可替代的角色。与此同时,大量的垃圾邮件却不断充斥着我们的邮箱,严重影响了正常邮件的往来收发。来自于中国互联网协会(ISC)发布的《2011 年第四季度中国反垃圾邮件状况调查报告》的数据显示,中国网民每人每周平均收到垃圾邮件的数量为 16.4 封,垃圾邮件占比 35.5%。虽然与往年同期数据相比略有下降,但是反垃圾邮件的工作还任重而道远。在信息系统中,过滤垃圾邮件的方法主要有两种:第一种为规则法,即根据关键词和信息源等信息人工制定识别垃圾邮件的规则,这种方法简单易行也成本较低,但是其误判率往往较高。第二种方法为基于机器学习的方法,即基于大量正常邮件和垃圾邮件组成的邮件集合训练分类模型,根据分类模型自动进行垃圾邮件识别。这种方法时效性强,误判率低。本题目提供正常邮件和垃圾邮件的数据集,要求根据该数据集构建朴素贝叶斯分类模型,自动进行垃圾邮件识别
- 数据说明:该数据集一共包含57个相关属性(即57个指标变量),1个类别变量(即是否是垃圾邮件)。共有4601个样本,其中包括1813封垃圾邮件和2788封非垃圾邮件,spambase.names,文件中有关于属性的说明,要求导入数据, dataframe数据类型。再进一步完成实验内容。
-
import pandas as pd spambase = pd.read_csv('spambase.csv') spambase.head() spambase.info() spambase.describe() #数据标准化 from sklearn import preprocessing std_scale = preprocessing.StandardScaler().fit(spambase.iloc[:,:56]) spambase.iloc[:,:56] = std_scale.transform(spambase.iloc[:,:56]) #高斯朴素贝叶斯 #划分训练集和测试集 from sklearn.model_selection import train_test_split X=spambase.iloc[:,0:56] y=spambase['calss'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,random_state=107) from sklearn.naive_bayes import GaussianNB model=GaussianNB() model.fit(X_train,y_train) #模型预测 y_test_pred= model.predict(X_test) #分类正确率 print(model.score(X_test,y_test)) from sklearn import metrics metrics.confusion_matrix(y_test, y_test_pred) print (metrics.classification_report(y_test,y_test_pred)) #多项式朴素贝叶斯 from sklearn.naive_bayes import MultinomialNB X=spambase.iloc[:,0:56] y=spambase['calss'] X_train1, X_test1, y_train1, y_test1 = train_test_split(X, y, test_size=0.3, random_state=107) from sklearn.preprocessing import MinMaxScaler scaler=MinMaxScaler(feature_range=(0,1)) MinMaxScaler = MinMaxScaler() MinMaxScaler.fit(X_train1) X_train1 = MinMaxScaler.transform(X_train1) X_test1 = MinMaxScaler.transform(X_test1) print(X_train1) mnb = MultinomialNB(alpha=1.0) mnb.fit(X_train1, y_train1) #模型预测 y_test_pred1= mnb.predict(X_test1) #分类正确率 print(mnb.score(X_test1,y_test1)) from sklearn import metrics metrics.confusion_matrix(y_test1, y_test_pred1) print (metrics.classification_report(y_test1,y_test_pred1))