英文垃圾邮件分类机器学习篇——带你一次看个爽

Posted 猫猫头丁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了英文垃圾邮件分类机器学习篇——带你一次看个爽相关的知识,希望对你有一定的参考价值。

英文垃圾邮件分类机器学习篇——带你一次看个爽——朴素贝叶斯、SVM、逻辑回归、随机森林、XGBoost

今天我们开始数据挖掘的一个经典分类项目,垃圾邮件分类,话不多说,我们直接开始吧。
首先我们导入一些用到的包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from collections import Counter
from sklearn import feature_extraction, model_selection, naive_bayes, metrics, svm
from IPython.display import Image
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline 
from nltk.corpus import stopwords
from nltk.stem import PorterStemmer
import jieba
import re
from sklearn.model_selection import train_test_split

我们读入数据,一起来看一下数据是什么样子的

data = pd.read_csv('spam.csv', encoding = "ISO-8859-1")
data.head(n=10)

csv文件里总共有五列数据,第一列数据是标签ham就是正常邮件,spam就是垃圾邮件;第二列是邮件内容;之后的三列都是空的,是我们用不到的内容。

因为用不到后三列,所以将后三列去掉,只保留前两列。

# 去除无用数据,后3列是无用数据
data = data[['v1', 'v2']]
data.head()

接下来,为了不影响特征提取,将标点符号都去掉

# 去除标点符号及两个以上的空格
data['v2'] = data['v2'].apply(lambda x:re.sub('[!@#$:).;,?&]', ' ', x.lower()))
data['v2'] = data['v2'].apply(lambda x:re.sub(' ', ' ', x))
data.head()

将单词都转化为小写形式

# 单词转换为小写
data['v2'] = data['v2'].apply(lambda x:" ".join(x.lower() for x in x.split()))
data.head()

使用词袋模型进行特征提取,也就是说一个词就是一个特征,去除停用词。

#词袋模型处理
f = feature_extraction.text.CountVectorizer(stop_words = 'english')
X = f.fit_transform(data["v2"])
np.shape(X)

划分训练集和测试集,前5000为训练集,后面的为测试集

data["v1"]=data["v1"].map('spam':1,'ham':0)
X_train=X[:5000]
X_test=X[5000:]
y_train=data['v1'][:5000]
y_test=data['v1'][5000:]

朴素贝叶斯

直接调用MultinomialNB进行训练

from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import confusion_matrix
# 利用贝叶斯的方法
clf = MultinomialNB()
clf.fit(data_train_cnt, y_train)
score = clf.score(data_test_cnt,y_test)
print('朴素贝叶斯准确率:',score)
result_clf = clf.predict(data_test_cnt)
print('朴素贝叶斯混淆矩阵:','\\n',confusion_matrix(y_test, result_clf))

调整朴素贝叶斯的平滑参数

#多项式模型的贝叶斯 调整平滑参数 将每次模型的预测结果评价放入数组中
list_alpha = np.arange(1/100000, 20, 0.11)
score_train = np.zeros(len(list_alpha))
score_test = np.zeros(len(list_alpha))
recall_test = np.zeros(len(list_alpha))
precision_test= np.zeros(len(list_alpha))
count = 0
for alpha in list_alpha:
    bayes = naive_bayes.MultinomialNB(alpha=alpha)
    bayes.fit(X_train, y_train)
    score_train[count] = bayes.score(X_train, y_train)
    score_test[count]= bayes.score(X_test, y_test)
    recall_test[count] = metrics.recall_score(y_test, bayes.predict(X_test))
    precision_test[count] = metrics.precision_score(y_test, bayes.predict(X_test))
    count = count + 1 

大致看一下各个模型的效果如何

matrix = np.matrix(np.c_[list_alpha, score_train, score_test, recall_test, precision_test])
models = pd.DataFrame(data = matrix, columns = 
             ['alpha', 'Train Accuracy', 'Test Accuracy', 'Test Recall', 'Test Precision'])
models.head(12)


将准确率画一下图看看

plt.plot(models['alpha'], models['Test Accuracy'])
plt.show()

#找到训练集预测准确度最高的模型
best_index = models['Test Accuracy'].idxmax()
models.iloc[best_index, :]

SVM

直接调用sklearn.svm.LinearSVC

from sklearn.svm import LinearSVC
# 利用SVM的方法
svm = LinearSVC()
svm.fit(data_train_cnt, y_train)
score = svm.score(data_test_cnt,y_test)
print('SVM准确率:',score)

result_svm = svm.predict(data_test_cnt)
print('SVM混淆矩阵:','\\n',confusion_matrix(y_test, result_svm))

也是调整一下惩罚系数

list_C = np.arange(1, 10, 1) #100000
score_train = np.zeros(len(list_C))
score_test = np.zeros(len(list_C))
recall_test = np.zeros(len(list_C))
precision_test= np.zeros(len(list_C))
count = 0
for C in list_C:
    svc = svm.SVC(C=C)
    svc.fit(X_train, y_train)
    score_train[count] = svc.score(X_train, y_train)
    score_test[count]= svc.score(X_test, y_test)
    recall_test[count] = metrics.recall_score(y_test, svc.predict(X_test))
    precision_test[count] = metrics.precision_score(y_test, svc.predict(X_test))
    count = count + 1 
matrix = np.matrix(np.c_[list_C, score_train, score_test, recall_test, precision_test])
models = pd.DataFrame(data = matrix, columns = 
             ['C', 'Train Accuracy', 'Test Accuracy', 'Test Recall', 'Test Precision'])
models.head(n=10)
matrix = np.matrix(np.c_[list_C, score_train, score_test, recall_test, precision_test])
models = pd.DataFrame(data = matrix, columns = 
             ['C', 'Train Accuracy', 'Test Accuracy', 'Test Recall', 'Test Precision'])
models.head(n=10)

plt.plot(models['C'], models['Test Accuracy'])
plt.show()

best_index = models['Test Accuracy'].idxmax()
models.iloc[best_index, :]

逻辑回归

from sklearn.linear_model import LogisticRegression
# 利用逻辑回归的方法
lr = LogisticRegression()
lr.fit(data_train_cnt, y_train)
score = lr.score(data_test_cnt,y_test)
print('逻辑回归准确率:',score)

result_lr = lr.predict(data_test_cnt)
print('逻辑回归混淆矩阵:','\\n',confusion_matrix(y_test, result_lr))

随机森林

from sklearn.ensemble import RandomForestClassifier
# 利用随机森林的方法
frc = RandomForestClassifier()
frc.fit(data_train_cnt, y_train)
score = frc.score(data_test_cnt,y_test)
print('随机森林准确率:',score)

result_frc = frc.predict(data_test_cnt)
print('随机森林混淆矩阵:','\\n',confusion_matrix(y_test, result_frc))

XGBoost

from xgboost import XGBClassifier
# 利用XGBoost的方法
xg = XGBClassifier()
xg.fit(data_train_cnt, y_train)
score = xg.score(data_test_cnt,y_test)
print('XGBoost准确率:',score)

result_xg = xg.predict(data_test_cnt)
print('XGBoost混淆矩阵:','\\n',confusion_matrix(y_test, result_xg))

完整的数据集和代码已经上传资源喽,欢迎大家来下载!
链接: https://download.csdn.net/download/weixin_46570668/19685853.

以上是关于英文垃圾邮件分类机器学习篇——带你一次看个爽的主要内容,如果未能解决你的问题,请参考以下文章

时序数据预测机器学习篇——带你一次看个爽——以JetRail高铁的乘客数量为例

时序数据预测机器学习篇——带你一次看个爽——以JetRail高铁的乘客数量为例

用Python爬取笔趣网小说,一次看个爽

车牌识别知多少,让你一次看个够

精彩CS:GO赛事不停歇,火猫直播邀你一次看个够!

Python:20行代码爬取高质量帅哥美女视频,让你一次看个够