Scikit-Learn机器学习实践:垃圾短信识别

机器学习与垃圾短信识别

前不久,我们使用NLTK的贝叶斯分类模型垃圾对短信数据进行机器学习的垃圾短信识别。

其实除了使用NLTK,我们还可以使用Scikit-Learn这个集成了诸多机器学习算法的模块进行上述的实验。

Scikit-Learn的API设计非常合理和高效,对于初触机器学习的同学来说非常友好,值得大家尝试和使用。本人也经常在实验环境和工作环境中使用scikit-learn进行机器学习的建模。

下面,我们就使用scikit-learn模块,通过其朴素贝叶斯算法API对短信数据进行一次垃圾短信的识别。

导入短信数据

首先,我们需要对原始的短信数据进行处理,导入pandas模块和jieba模块。

pandas模块用于读取和处理数据,jieba模块用于对短信进行分词。

接着,我们导入短信数据:

查看一下部分短信数据:

其中第一列为原始序号,第二列为短信的分类,0表示正常短信,1表示垃圾短信,第三列就是短信的正文。 我们只需要关注第二和第三列。

查看一下这个短信数据集的形状:

一共有七十余万条短信。

对短信进行分词

文本的分类,基本上是基于词袋模型,也就是一个文本中包含多少词以及各个词的频率。对于英文而已,其天生的句子空格可以很容易的分割单词出来,但是中文就得先进行分词处理,也就是将一个完整的中文分割为一个一个词。 在Python中,有第三方模块——jieba,结巴分词来提供对中文的分词。 我们使用jieba对短信的内容进行分词。

得到的结果如下:

提取特征和目标数据

我们需要分别提取出特征数据和目标数据,特征数据表示输入的数据,目标数据则是输入数据的属性,在这里,短信内容就是特征数据,短信的分类就是目标数据。

X中都是特征数据,y中都是目标数据,便于下一步的分割训练集和测试集。

分割训练集和测试集

使用sklearn的分割模块对训练集和测试集进行分割:

提取文本特征

从文本中提取特征,需要利用到scikit-learn中的CountVectorizer()方法和TfidfTransformer()方法。 CountVectorizer()用于将文本从标量转换为向量,TfidfTransformer()则将向量文本转换为tf-idf矩阵。

建立朴素贝叶斯分类器并进行训练

朴素贝叶斯是一个很经典同时准确率也很高的机器学习算法,用它来做分类器可以得到很好的效果。

在scikit-learn中,每一个模型都会有一个fit()方法用来模型训练,有一个predict()方法用来模型预测,在此我们就传入了训练特征和训练目标进行了模型的训练。

模型测试

模型训练好之后,我们可以使用模型的predict()方法来测试与预测数据。 在这之前,我们还得进行另外一步。 因为之前对文本提取特征只是针对于训练集,测试集并没有进行,所以我先对测试集进行文本特征提取:

再使用predict()方法进行预测:

变量predicted_categories中包含的就是所有的预测结果。

模型评估

scikit-learn模块中内置了很多模型评估的方法,对于分类问题,我们可以使用accuracy_score()方法,其返回一个数值,得分最高为1。

打印出来的结果显示:

这个分类器的准确率达到了0.98,比上一次使用NLTK的贝叶斯算法高出了10%,很不错。

可以打印部分测试的短信数据以及预测的结果来看:

基本上正常短信和垃圾短信都被正确识别出来了。

短信数据下载链接回复关键字“垃圾短信识别”可以获取。

原文发布于微信公众号 - 州的先生(zmister2016)

原文发表时间:2017-11-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据挖掘DT机器学习

用libsvm进行回归预测

作者:kongmeng http://www.cnblogs.com/hdu-2010/p 最近因工作需要,学习了台湾大学林智仁(Lin Chih-Jen)教授...

3497
来自专栏深度学习之tensorflow实战篇

N元分词算法

在自然语言处理中,我们经常需要用到n元语法模型。 其中,有关中文分词的一些概念是我们需要掌握的,譬如: unigram 一元分词,把句子分成一个一个的汉字 b...

3043
来自专栏应兆康的专栏

16. 清理贴错标签的开发集和测试集样本

1031
来自专栏Zephery

Adaboost

NaiveBayesSpamFilter 利用朴素贝叶斯算法实现垃圾邮件的过滤,并结合Adaboost改进该算法。 1 Naive Bayes spam fil...

2697
来自专栏瓜大三哥

face++人脸识别

该系统主要分为: 1.数据库:500万张图片和2000个人,而且删除了LFW中特有的人,其分布如下(网上搜集的图片有一个长尾效应:就是随着图片数量的增加不利于网...

2659
来自专栏云时之间

机器学习算法推导「代码已经更新」

在重新实现机器学习算法时,重新认识到理论和数学的可理解性,通过非常简单的编程就可以实现BP、Lagrange multiplier、Newton's metho...

3307
来自专栏林德熙的博客

C# 已知点和向量,求距离的点

已知一个点 P 和向量 v ,求在这个点P按照向量 v 运行距离 d 的点 B 。

823
来自专栏应兆康的专栏

16. 清理贴错标签的开发集和测试集样本

在错误分析期间,你可能会注意到开发集中的一些样本被错误标记(mislabeled)。当我说”dislabeled”时,我的意思是在模型训练之前,这个样本被错误的...

32210
来自专栏量化投资与机器学习

深度学习Matlab工具箱代码注释之MnistTest.m

%%========================================================================= %...

1947
来自专栏专知

【前沿】NIPS2017贝叶斯生成对抗网络TensorFlow实现(附GAN资料下载)

导读 今年五月份康奈尔大学的 Andrew Gordon Wilson 和 Permutation Venture 的 Yunus Saatchi 提出了一个贝...

4078

扫码关注云+社区