如何使用Scikit-Learn建立一个垃圾邮件检测模型

220 阅读9分钟

使用Scikit-Learn构建垃圾邮件检测模型

垃圾邮件是指大量不请自来的信息,它们被发送给大量的人。这些信息可能是为了广告、欺诈性目的或恶意软件的传播。垃圾邮件可以被告知在个人网站上留下的评论或大量发送的电子邮件。

垃圾邮件检测有助于检测这些垃圾信息和评论。垃圾邮件检测模型过滤掉不需要的信息和评论。这确保个人收到对他们至关重要的信息或通知。在建立垃圾邮件检测模型时,我们将向该模型提供一个由垃圾邮件和非垃圾邮件评论组成的数据集。该模型将从这个数据集中学习并找到相关的模式,以帮助它区分垃圾邮件和非垃圾邮件的评论。

本教程将演示如何建立一个机器学习模型,以检测Youtube上的评论是垃圾邮件还是非垃圾邮件。我们将使用一个包含流行的Youtube频道的评论列表的数据集来训练我们的模型。最后,我们将使用Naive Bayes算法实现该模型。

前提条件

读者应了解以下内容以清楚地理解本教程。

  • 充分掌握[Python编程]技巧。
  • 理解[机器学习]的概念[。]
  • 有一些关于[自然语言处理]的知识。
  • 知道如何使用[Scikit-learn]的一些算法。
  • 知道如何使用[Google Colab笔记本]建立一个机器学习模型。

数据集准备

所用的数据集包含一个来自流行的Youtube频道的评论列表。我们将使用从五个Youtube频道收集的数据集。我们需要准备这个数据集以备使用。数据准备包括正确格式化我们的数据集,使其在训练过程中易于被模型使用。

首先,我们需要将这些数据集加载到我们的机器中。让我们导入将加载我们的数据集的包。

import pandas as pd
import numpy as np

我们将使用Pandas 来读取数据集,使用Numpy 来对这些数据集进行数学运算。我们将有五个数据集,因为我们已经从五个Youtube频道收集了数据集。

提取各个数据集,我们将把它们加载到我们的机器上。

要加载这五个数据集,请使用以下代码。

df1 = pd.read_csv("Youtube01-Channel1.csv")
df2 = pd.read_csv("Youtube02-Channel2.csv")
df3 = pd.read_csv("Youtube03-Channel3.csv")
df4 = pd.read_csv("Youtube04-Channel4.csv")
df5 = pd.read_csv("Youtube05-Channel5.csv")

现在我们有五个数据集,我们需要将它们连接或合并。我们将把这五个数据集连接起来,形成一个单一的数据框架。

数据集串联

我们为这些数据集创建一个单一的数据框架,然后应用concat 方法将它们连接起来。

frames = [df1,df2,df3,df4,df5]
df_merged = pd.concat(frames)

要查看我们合并的数据集,请使用以下代码。

df_merged

输出结果如下图所示。

Merged dataset

从上面的图片来看,我们的数据集有五列。COMMENT_ID,AUTHOR,DATE,CONTENT, 和CLASS 。我们最感兴趣的列是CONTENTCLASS 列。

CONTENT 列代表实际的Youtube评论。 列被标记为 或 。 代表非垃圾邮件评论,而 代表垃圾邮件评论。CLASS 0 1 0 1

合并后的数据集包含五个数据集。我们需要给合并后的数据集分配键,以区分每个数据集。

分配键值

分配键值使模型能够知道一个数据集所属的Youtube频道。我们将有五个键来代表五个数据集,如下图所示。

keys = ["Channel1","Channel2","Channel3","Channel4","Channel5"]

在初始化这五个键之后,我们需要用下面的代码将这些键连接到我们的数据集。

df_with_keys = pd.concat(frames,keys=keys)

上面的代码将把这些键添加到数据集中。它还将根据Youtube频道对数据集进行分组。这使得模型很容易理解和操作数据集。

在训练期间,模型将很容易从数据集中识别出有用的见解和模式。要查看这个添加了密钥的数据集,请使用这个代码。

df_with_keys

输出结果如下图所示。

Merged dataset with keys

我们可以将数据集保存到一个新的变量,df

df = df_with_keys

要检查数据集的大小,运行以下代码。

df.size

输出如下所示。

9780

合并五个数据集后,我们有9780 Youtube评论。

让我们检查一下我们的数据集中是否有缺失的值。

检查缺失值

要检查缺失值,请使用以下代码。

df.isnull().isnull().sum()

输出显示如下。

COMMENT_ID    0
AUTHOR        0
DATE          0
CONTENT       0
CLASS         0
dtype: int64

从上面的输出来看,没有缺失值。因此,我们的数据集已经可以使用了。

提取重要列

我们需要从我们的数据集中提取重要的列。如前所述,我们只对两列感兴趣,CONTENTCLASS

CONTENT 列包含实际的Youtube评论。这一列将被用作模型的输入。CLASS 列包含01 标签。这一列将被用作模型的输出或目标。

要提取这两列,请使用这段代码。

df_data = df[["CONTENT","CLASS"]]

我们现在需要指定哪一列将被用作输入,哪一列将被用作输出。这可以用下面的代码来完成。

df_x = df_data['CONTENT']
df_y = df_data['CLASS']

从上面的代码中,df_x 是输入变量,df_y 是输出或目标变量。在指定了我们的输入和输出变量后,让我们来执行特征提取。

从文本中提取特征

特征提取是指从原始文本中获取重要特征的过程。机器学习模型不理解文本,不能直接使用文本。这就是为什么我们必须进行特征提取。现在,提取的特征将被用作模型的输入。

在特征提取过程中,我们必须将原始文本转换成数值向量。数字值向量代表原始文本。机器学习模型很容易理解数值,可以直接使用它们。

这个将原始文本转换为数值向量的过程将使用CountVectorizer Python包来完成。CountVectorizerScikit-learn库中的一个强大的工具,可以加速这个从文本中提取特征的过程。

让我们导入CountVectorizer

from sklearn.feature_extraction.text import CountVectorizer

然后我们将使用CountVectorizer ,对我们的输入变量df_x ,进行特征提取。

corpus = df_x
cv = CountVectorizer()
X = cv.fit_transform(corpus)

在上面的代码中,我们把输入变量保存到一个新的变量中,corpusfit_transform ,确保CountVectorizer 完全适合我们的输入数据集,没有任何数据点被遗漏。因此,所有的原始文本将被转换为数值向量。

要查看这些数值向量,请使用这段代码。这段代码将把数字值转换成一个数字数组。

X.toarray()

输出结果如下所示。

Converted text

我们现在可以使用这个数字向量来建立模型。

构建模型

为了建立我们的机器学习模型,我们需要导入在这个过程中有用的包。

from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split

MultinomialNB

这是从Naive Bayes算法中导入的分类方法。Naive Bayes算法还有其他的方法,比如GaussianNB,但是MultinomialNB是最适合的,因为我们正在处理文本。

我们将使用MultinomialNB方法来建立我们的垃圾邮件检测模型。

train_test_split

我们将使用这个包把我们的数据集分成两组。该模型将使用第一组进行训练,而第二组则用于测试。

我们将从拆分数据集开始。

数据集拆分

要分割数据集,请使用以下代码。

X_train, X_test, y_train, y_test = train_test_split(X, df_y, test_size=0.30, random_state=42)

从上面的代码中,我们有一个test_size=0.30 。这意味着算法使用70%的数据来训练模型,而30% ,将用于测试模型。

现在让我们使用MultinomialNB 方法建立模型。首先,我们初始化MultinomialNB 方法,如下所示。

clf = MultinomialNB()

初始化这个方法后,我们将模型拟合到我们的数据集中。这使得模型能够通过从数据集中识别有用的见解和模式来学习。

模型拟合

clf.fit(X_train,y_train)

我们模型的准确度得分

要计算这个训练有素的模型的准确度分数,请使用这个代码。

print("Accuracy of Model",clf.score(X_test,y_test)*100,"%")

准确率得分如下所示。

Accuracy of Model 91.95046439628483 %

这是一个非常高的准确性分数,该模型有很高的机会做出准确的预测。我们现在可以使用测试数据集来评估这个模型。

模型评估

我们将使用这个模型将测试数据集中的Youtube评论分类为垃圾邮件或非垃圾邮件。

clf.predict(X_test)

我们使用predict 方法来对测试数据集中的所有Youtube评论进行分类。输出结果显示如下。

Model evaluation

从上面的图片中,我们可以看到模型给我们的测试数据集分配了标签。这些标签是:01

我们可以用这个模型来做一个预测。

做一个单一的预测

我们将使用输入文本进行预测,如下图所示。

comment = ["Check this out I will be giving 50% offer on your first purchase"]
vect = cv.transform(comment).toarray()

输入的文本是 "看看这个"。我们将使用该模型将该文本分类为垃圾邮件(1)或非垃圾邮件(0)。我们还需要使用cv.transform 方法将输入文本转换为数值向量。最后,数字值将使用toarray() 方法转换为一个数字数组。

为了进行这种预测,请运行这段代码。

clf.predict(vect)

预测结果如下所示。

array([1], dtype=int64)

预测结果是1 ,这表明上面的Youtube评论是spam 。我们可以用这个模式来做另一个预测。

进行另一次预测

我们将按照上面的步骤来进行第二次预测。

comment1 = ["Great song Friend, it has really touched my heart"]
vect = cv.transform(comment1).toarray()
clf.predict(vect)

预测结果如下所示。

array([0], dtype=int64)

预测结果是0 ,这表明该评论是non-spam 。使用这两个预测,我们可以看到,我们的模型可以区分垃圾邮件和非垃圾邮件的评论。

总结

在本教程中,我们已经学会了如何建立一个垃圾邮件检测模型。我们首先准备了我们的数据集,以正确格式化我们的数据集。我们有五个数据集,是从流行的Youtube频道收集的。准备好数据集后,我们用它来建立我们的垃圾邮件检测模型。该模型能够区分垃圾邮件和非垃圾邮件的评论。这就是本教程的目标,我们已经成功建立了一个垃圾邮件检测模型。