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

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

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

Scikit-Learn的API设计很是合理和高效,对于初触机器学习的同窗来讲很是友好,值得你们尝试和使用。本人也常常在实验环境和工做环境中使用scikit-learn进行机器学习的建模。机器学习

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

导入短信数据

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

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

接着,咱们导入短信数据:3d

查看一下部分短信数据:orm

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

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

一共有七十余万条短信。

对短信进行分词

文本的分类,基本上是基于词袋模型,也就是一个文本中包含多少词以及各个词的频率。对于英文而已,其天生的句子空格能够很容易的分割单词出来,可是中文就得先进行分词处理,也就是将一个完整的中文分割为一个一个词。
在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%,很不错。

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

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

文章首发:zmister.com/archives/17…
Python爬虫、数据分析、机器学习、渗透测试、Web开发、GUI开发
州的先生:zmister.com/

相关文章
相关标签/搜索