作者|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 sysfrom time import timesys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")from email_preprocess import preprocessimport numpy as np# 利用高斯贝叶斯算法对邮件进行分类# 算法是从sklearn库导入的from sklearn.naive_bayes import GaussianNBfrom 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 sysfrom time import timesys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")from email_preprocess import preprocessfrom sklearn.svm import SVCfrom 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 sysfrom time import timesys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")from email_preprocess import preprocessfrom sklearn import treefrom 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 sysfrom time import timesys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")from email_preprocess import preprocessfrom sklearn.ensemble import RandomForestClassifierfrom 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 sysfrom time import timesys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")from email_preprocess import preprocessfrom sklearn.neighbors import KNeighborsClassifierfrom 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 sysfrom time import timesys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")from email_preprocess import preprocessfrom sklearn.ensemble import AdaBoostClassifierfrom 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/