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

英文垃圾邮件分类机器学习篇——带你一次看个爽——朴素贝叶斯、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.

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
很抱歉,垃圾邮件分类问题不涉及回归问题。垃圾邮件分类问题是一个二分类问题,需要使用分类算法进行解决。以下是一个基于Python垃圾邮件分类机器学习项目示例: ## 项目概述 该项目旨在使用Python机器学习算法来构建一个垃圾邮件分类器。该分类器可以将输入的电子邮件标记为垃圾邮件或非垃圾邮件。我们将使用Kaggle上的Spam or Ham数据集来训练和测试我们的分类器。 ## 数据集 Spam or Ham数据集包含5,572封电子邮件,其中包括垃圾邮件和非垃圾邮件。该数据集可以从以下链接下载:https://www.kaggle.com/venky73/spam-mails-dataset ## 项目步骤 ### 步骤1:加载数据集 我们将使用Pandas库来加载Spam or Ham数据集。以下是加载数据集的代码: ``` import pandas as pd # Load the dataset data = pd.read_csv('spam_or_ham.csv') ``` ### 步骤2:数据清洗 在数据清洗步骤中,我们将对数据进行预处理和清洗。以下是数据清洗的代码: ``` import re import nltk nltk.download('stopwords') from nltk.corpus import stopwords from nltk.stem.porter import PorterStemmer # Clean the text corpus = [] for i in range(0, len(data)): review = re.sub('[^a-zA-Z]', ' ', data['text'][i]) review = review.lower() review = review.split() ps = PorterStemmer() review = [ps.stem(word) for word in review if not word in set(stopwords.words('english'))] review = ' '.join(review) corpus.append(review) ``` 在上述代码中,我们使用了正则表达式来过滤掉除英文字母以外的所有字符。我们还将所有字母转换为小写,并使用Porter词干提取器来提取单词的基本形式。最后,我们还使用NLTK库中的停用词列表来过滤停用词。 ### 步骤3:创建文本向量 在这一步骤中,我们将使用CountVectorizer来创建文本向量。以下是创建文本向量的代码: ``` from sklearn.feature_extraction.text import CountVectorizer # Create the bag of words model cv = CountVectorizer(max_features = 5000) X = cv.fit_transform(corpus).toarray() y = data.iloc[:, 0].values ``` 在上述代码中,我们使用了CountVectorizer来将文本转换为向量。我们还使用了5000个特征来创建向量。 ### 步骤4:拆分数据集 在这一步骤中,我们将数据集分成训练集和测试集。以下是拆分数据集的代码: ``` from sklearn.model_selection import train_test_split # Split the dataset into the Training set and Test set X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 0) ``` 在上述代码中,我们使用train_test_split函数将数据集拆分为训练集和测试集。 ### 步骤5:训练模型 在这一步骤中,我们将使用逻辑回归算法来训练模型。以下是训练模型的代码: ``` from sklearn.linear_model import LogisticRegression # Train the model classifier = LogisticRegression(random_state = 0) classifier.fit(X_train, y_train) ``` 在上述代码中,我们使用了逻辑回归算法来训练模型。 ### 步骤6:评估模型 在这一步骤中,我们将评估模型的性能。以下是评估模型的代码: ``` from sklearn.metrics import confusion_matrix, accuracy_score # Predict the Test set results y_pred = classifier.predict(X_test) # Evaluate the model cm = confusion_matrix(y_test, y_pred) print(cm) print('Accuracy: {:.2f}%'.format(accuracy_score(y_test, y_pred) * 100)) ``` 在上述代码中,我们使用混淆矩阵和准确率来评估模型的性能。 ## 总结 以上就是一个基于Python垃圾邮件分类机器学习项目示例,该项目使用了Spam or Ham数据集来训练和测试分类器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫头丁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值