乐趣区

关于人工智能:电子邮件分类的最佳机器学习算法

作者 |Mahnoor Javed
编译 |VK
起源 |Towards Data Science

电子邮件分类是一个机器学习问题,属于监督学习领域。

这个电子邮件分类的小我的项目的灵感来自 J.K.Rowling 以笔名出版的一本书。Udacity 的“机器学习简介”提供了算法和我的项目的全面钻研:https://www.udacity.com/cours…

几年前,罗琳写了一本书《布谷鸟的召唤》,作者名是罗伯特·加尔布雷思。这本书受到了一些好评,然而没有人关注它,直到 Twitter 上的一位匿名线人说这是 J.K. 罗琳。伦敦《星期日泰晤士报》邀请了两位专家,将“布谷鸟”的语言模式与罗琳的《长期空缺》以及其余几位作者的著述进行了比拟。在他们的剖析后果强烈指向罗琳是作者之后,《泰晤士报》间接询问出版商他们是否是同一个人,出版商证实了这一点。这本书一夜之间大受欢迎。

电子邮件分类工作在雷同的基本概念上。通过浏览电子邮件的文本,咱们将应用机器学习算法来预测电子邮件是由一个人写的还是另一个人写的。


数据集

数据集能够从以下 GitHub 存储库获取:https://github.com/MahnoorJav…

在这个数据集中,咱们有一组电子邮件,其中一半由同一公司的一个人(Sara)编写,另一半由另一个人(Chris)编写。数据基于字符串列表。每个字符串都是电子邮件的文本,通过一些根本的预处理。

咱们将依据邮件的文本对邮件进行分类。咱们将逐个应用以下算法:奢侈贝叶斯、反对向量机、决策树、随机森林、KNN 和 AdaBoost 分类器。

存储库有 2 个 pickle 文件:word_data 和 email_authors。

email_preprocess python 文件用于解决 pickles 文件中的数据。它将数据拆分为 10% 测试数据和 90% 的训练数据。


奢侈贝耶斯

奢侈贝耶斯办法是一组基于 Bayes 定理的有监督学习算法,在给定类变量值的状况下,假如每对特色之间条件独立且奉献相等。Bayes 定理是计算条件概率的一个简略的数学公式。

高斯奢侈贝叶斯是一种奢侈贝叶斯,其中特色的可能性被假设为高斯。假如与每个特色相关联的间断值依照高斯分布进行散布。在绘制时,它给出了一条对于特征值平均值对称的钟形曲线。

咱们将应用 scikit 学习库中的 Gaussian-naivebayes 算法对两位作者的邮件进行分类。

上面是你能够在任何 python 的 ide 上实现的 python 代码,确保你的零碎上装置了所需的库。

import sys
from time import time
sys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")
from email_preprocess import preprocess
import numpy as np

# 利用高斯贝叶斯算法对邮件进行分类
# 算法是从 sklearn 库导入的
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score

# 初始化测试和训练集
# 函数 preprocess 是从 email_preprocess.py 导入的
features_train, features_test, labels_train, labels_test = preprocess()

# 定义分类器
clf = GaussianNB()

# 训练和测试工夫的预测
t0 = time()
clf.fit(features_train, labels_train)
print("\nTraining time:", round(time()-t0, 3), "s\n")
t1 = time()
pred = clf.predict(features_test)
print("Predicting time:", round(time()-t1, 3), "s\n")

# 计算并打印算法的准确度
print("Accuracy of Naive Bayes:", accuracy_score(pred,labels_test))

运行该代码将失去以下后果:

0.9203 的准确度。不错吧?即便是算法的训练次数和预测次数也相当正当。


反对向量机

反对向量机也是一种用于分类、回归和异样检测的有监督学习。通过一个立体将数据点划分为两类,利用 SVM 算法将数据点分类为 2 类。SVM 具备一个间接的决策边界。SVM 算法具备通用性,可为决策函数指定不同的核函数。

SVM 算法是基于超平面的两类拆散,距离越大,分类越好(也称为距离最大化)。

咱们的分类器是线性核的 C 反对向量分类,值为 C =1

import sys
from time import time
sys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")
from email_preprocess import preprocess
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

### features_train 和 features_test 是训练集和测试集的特色
### labels_train 和 labels_test 是对应的标签
features_train, features_test, labels_train, labels_test = preprocess()

# 定义分类器
clf = SVC(kernel = 'linear', C=1)

# 训练和测试工夫的预测
t0 = time()
clf.fit(features_train, labels_train)
print("\nTraining time:", round(time()-t0, 3), "s\n")
t1 = time()
pred = clf.predict(features_test)
print("Predicting time:", round(time()-t1, 3), "s\n")

# 计算并打印算法的准确度
print("Accuracy of SVM Algorithm:", clf.score(features_test, labels_test))

SVM 算法的准确度为 0.9596。咱们能够看到在准确性和训练工夫之间有显著的折衷。算法的准确性进步是训练工夫较长(22.7s,奢侈贝叶斯是 0.13s)的后果。咱们能够缩小训练数据,这样能够在较少的训练工夫内取得很好的准确率!

咱们将首先将训练数据集宰割到原始大小的 1%,以开释 99% 的训练数据。在代码的其余部分不变的状况下,咱们能够看到训练工夫显著缩短,然而升高了准确性。

应用以下代码将训练数据宰割为 1%:

features_train = features_train[:len(features_train)//100]
labels_train = labels_train[:len(labels_train)//100]

可见,在 1% 的训练数据下,算法的训练工夫缩短到 0.01s,精度升高到 0.9055。

10% 的训练数据,训练工夫 0.47s,准确度为 0.9550。

咱们也能够扭转 scikit-learn 的 C 和核。

在训练数据 100%,RBF 核,C 值为 10000 的状况下,训练工夫为 14.718s,失去了 0.9891 的精度。


决策树

决策树是一种用于分类和回归的非参数监督学习办法。决策树能够在数据集上执行多类分类。利用从数据特色推断出的决策规定,对每个节点上的数据进行逐渐分类。决策树很容易可视化。咱们能够通过可视化数据集通过树来了解算法,并在各个节点做出决定。

让咱们看看这个算法是如何在咱们的数据集上工作的。

import sys
from time import time
sys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")
from email_preprocess import preprocess
from sklearn import tree

from sklearn.metrics import accuracy_score

### features_train 和 features_test 是训练集和测试集的特色
### labels_train 和 labels_test 是对应的标签
features_train, features_test, labels_train, labels_test = preprocess()

# 定义分类器
clf = tree.DecisionTreeClassifier()

print("\nLength of Features Train", len(features_train[0]))

# 训练和测试工夫的预测
t0 = time()
clf.fit(features_train, labels_train)
print("\nTraining time:", round(time()-t0, 3), "s\n")
t1 = time()
pred = clf.predict(features_test)
print("Predicting time:", round(time()-t1, 3), "s\n")

# 计算并打印算法的准确度
print("Accuracy of Decision Trees Algorithm:", accuracy_score(pred,labels_test))

运行上述代码,咱们的准确度为 0.9880,训练工夫为 6.116s,这是一个十分好的准确性分数,不是吗?咱们有 100% 的训练数据用于训练模型。


随机森林

随机森林是一种基于决策树的集成监督学习算法。随机森林用于回归和分类工作。该算法的名字来源于随机抉择的特色。

咱们能够在咱们的数据集上应用 sklearn 库中的随机森林算法:RandomForestClassifier。

上面是在咱们的电子邮件分类问题上运行随机森林算法的代码。

import sys
from time import time
sys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")
from email_preprocess import preprocess
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

### features_train 和 features_test 是训练集和测试集的特色
### labels_train 和 labels_test 是对应的标签
features_train, features_test, labels_train, labels_test = preprocess()

# 定义分类器
clf = RandomForestClassifier(max_depth=2, random_state=0)

# 训练和测试工夫的预测
t0 = time()
clf.fit(features_train, labels_train)
print("\nTraining time:", round(time()-t0, 3), "s\n")
t1 = time()
pred = clf.predict(features_test)
print("Predicting time:", round(time()-t1, 3), "s\n")

# 计算并打印算法的准确度
print("Accuracy of Random Forest Algorithm:", accuracy_score(pred,labels_test))

该算法的精度很低,即 0.7707。训练工夫是 1.2 秒,这是正当的,但总的来说,它并不是解决咱们问题的好工具。特征选择的随机性是造成精度低的起因,而随机是随机森林的一种个性。


KNN

K 近邻是一种有监督的机器学习算法,可用于分类和回归预测问题。KNN 是懈怠学习。它依赖于间隔进行分类,因而对训练数据进行规范化能够大大提高分类精度。

让咱们看看应用 sklearn 库的 KNeighborsClassifier 的 KNN 算法对电子邮件进行分类的后果,该算法有 5 个最近邻和应用欧几里德度量。

import sys
from time import time
sys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")
from email_preprocess import preprocess
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

### features_train 和 features_test 是训练集和测试集的特色
### labels_train 和 labels_test 是对应的标签
features_train, features_test, labels_train, labels_test = preprocess()

# 定义分类器
clf = KNeighborsClassifier(n_neighbors=5, metric='euclidean')

# 训练和测试工夫的预测
t0 = time()
clf.fit(features_train, labels_train)
print("\nTraining time:", round(time()-t0, 3), "s\n")
t1 = time()
pred = clf.predict(features_test)
print("Predicting time:", round(time()-t1, 3), "s\n")

# 计算并打印算法的精度
print("Accuracy of KNN Algorithm:", accuracy_score(pred,labels_test))

该算法的精度为 0.9379,训练工夫为 2.883s,然而能够留神到,模型工具预测类的工夫要长得多。


AdaBoost 分类器

Ada-boost 或自适应 Boosting 也是一种集成 Boosting 分类器。它是一种元预计器,首先在原始数据集上拟合一个分类器,而后在同一个数据集上拟合该分类器的附加正本,然而在这种状况下,谬误分类实例的权重被调整,以便后续分类器更关注艰难的状况。

咱们将应用 scikit 库中的分类器。代码如下:

import sys
from time import time
sys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")
from email_preprocess import preprocess
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score

### features_train 和 features_test 是训练集和测试集的特色
### labels_train 和 labels_test 是对应的标签
features_train, features_test, labels_train, labels_test = preprocess()

# 定义分类器
clf = AdaBoostClassifier(n_estimators=100, random_state=0)

# 训练和测试工夫的预测
t0 = time()
clf.fit(features_train, labels_train)
print("\nTraining time:", round(time()-t0, 3), "s\n")
t1 = time()
pred = clf.predict(features_test)
print("Predicting time:", round(time()-t1, 3), "s\n")

# 计算并打印算法的精度
print("Accuracy of Ada Boost Classifier:", accuracy_score(pred,labels_test))

该分类器的训练工夫为 17.946s,精度为 0.9653,但训练工夫稍长。

论断

在本文中,咱们应用了几种机器学习算法来对 Chris 和 Sara 之间的电子邮件进行分类。这些算法在 0.77-0.98 的范畴内产生了不同的准确度得分。从下表中能够看出,模型是通过进步准确度排列的:

  • 随机森林算法的准确度得分最低
  • 反对向量机算法训练工夫最长
  • 参数优化为 C =10000 和 RBF 核的反对向量机算法的精度得分最高
  • naivebayes 算法的预测工夫最快

尽管有许多其余分类算法可用于咱们的工作,但通过对数据集上运行的根本算法的比拟得出结论,对于咱们的特定问题,反对向量机是最精确的,因为它的参数是依据咱们所解决的工作优化的。

原文链接:https://towardsdatascience.co…

欢送关注磐创 AI 博客站:
http://panchuang.net/

sklearn 机器学习中文官网文档:
http://sklearn123.com/

欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/

退出移动版