首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
26 篇文章
1
机器学习(二十五) ——adaboost算法与实现
2
机器学习(二十四) ——从图像处理谈机器学习项目流程
3
机器学习(二十三) —— 大数据机器学习(随机梯度下降与map reduce)
4
机器学习(二十二) ——推荐系统基础理论
5
机器学习(二十一) ——高斯密度估计实现异常检测
6
机器学习(二十) ——PCA实现样本特征降维
7
机器学习(十九) ——K-均值算法理论
8
机器学习(十八) ——SVM实战
9
机器学习(十七) ——SVM进一步认识
10
机器学习(十六) ——SVM理论基础
11
机器学习(十五) ——logistic回归实践
12
机器学习(十四) ——朴素贝叶斯实践
13
机器学习(十四) ——朴素贝叶斯实现分类器
14
机器学习(十三) ——交叉验证、查准率与召回率
15
机器学习(十二) ——神经网络代价函数、反向传播、梯度检验、随机初始化
16
机器学习(十一) ——神经网络基础
17
机器学习(十) ——使用决策树进行预测(离散特征值)
18
​ 机器学习(九) ——构建决策树(离散特征值)
19
机器学习(八) ——过拟合与正则化
20
机器学习(七) ——logistic回归
21
机器学习(六) ——线性回归的多变量、特征缩放、标准方程法
22
机器学习(五) ——k-近邻算法进一步探究
23
机器学习(四) ——梯度下降算法解释以及求解θ
24
机器学习(三) ——k-近邻算法基础
25
机器学习(二) ——线性回归、代价函数与梯度下降基础
26
机器学习(一)——机器学习概述

机器学习(十四) ——朴素贝叶斯实践

机器学习(十四)——朴素贝叶斯实践

(原创内容,转载请注明来源,谢谢)

一、垃圾邮件分类

垃圾邮件分类,即通过读取邮件的内容,并打上标记其是垃圾邮件或者是正常的邮件,进而判断新的一个邮件是否是垃圾邮件。

1、读取内容和内容简单处理

这里已经有现成的邮件的正文内容,其中25篇正常的邮件,25篇垃圾邮件,存放成txt的格式。因此,首先需要读取文件内容,并且进行字符串的分割、去除标点符号、去除空格,另外英文单词中,小于3个字母的单词,通常是一些介词、量词等,没有实际意义,这类词语也会过滤掉。另外为了保证一致性,需要将单词全部转成小写。

看到这个return的内容,感慨一下python的便利性。其把for循环、字符串长度判断、字符串小写用一行全部概括进去。

但是另外也要吐槽一下python的版本问题,书上的是python2,我用的python3,导致文件读取那个内容一开始一直报错。后来才查到python3要用下图的codecs的方式来进行处理。

2、邮件分类

首先就是调用上一步的函数,循环读取全部的txt内容。这里由于文件名保存的很有规律性,所以可以用for循环直接来读取。

由于将正常邮件和垃圾邮件存放在两个路径下,因此读取的时候,可以来区分正常的邮件和垃圾邮件。

这里用到3个存放内容的数组。docList数组是由若干集合组成,每一个集合是一篇文章拆成的单词的集合,因此一个元素代表一篇文章;classList与docList对应,是给docList的每篇文章打上标签,1代表垃圾邮件,0代表正常邮件;fullText是所有邮件正文内容去重后的集合。

3、留存交叉验证

接下来,就用到交叉验证的思想。现在有50篇邮件正文,可以理解为50个样本,为了测试分类算法的正确性,这里随机预留了10个样本,不参与训练,用于最后的测试过程。

下面的这个del删除,是删除训练集对应的下标,使得后面遍历训练集的时候,就会跳过留作测试的样本,不参与训练。

剩余的样本,都参与训练,分类器采用之前写好的贝叶斯分类器,得到每个邮件是垃圾邮件的概率、不是垃圾邮件的概率,以及所有邮件中垃圾邮件所占的比重。

p(ci|w)=p(w|ci)*p(ci)/p(w),参考条件概率的这个公式,w表示的是一个向量,在这里就是所有邮件中的特征,c的值有两个,即c=0和c=1。

这里如果拷贝for循环的代码,多粘几次,实际上是加大训练的样本数量,对于本次的训练效果会更好一些。但是实际上还是需要更多的数据来分析。

4、测试训练结果

将刚才留下来的10个样本,放在这里参与测试,得到算法中计算的结果;对照刚开始拼接数据的时候,存留的数据,即实际上的数据。通过比较,就可以知道是否判断错误,并且可以计算错误率。

下面是实际运行结果。

二、从rss源中分析地区常用词语

1、需求

现在有两个rss的源,是两个地区的人发布的广告内容。现在要做的事情是读取这两个地区的rss源,分析各自对应的地区最常用的英文单词。

2、读取rss源

这里用到python的包feedparser。这个包可以通过官网下载后本地安装,不过我更推荐的是anaconda,通过它,只需要在命令行输入conda install feedparser,就可以自动下载并安装上对应的python版本的包,非常便捷。

通过parse,读取rss的内容,并且转化成数组。需要注意的是,rss的内容是一直在变化的,因此在一个完整的判断流程中,为了确认判断的效果,需要有一个稳定的内容,故在一个完整的流程中,只能读取1次rss源,确保后面的判断都是基于同一个内容。

3、根据内容判断词频

由于这个项目的需求是判断两个地区最常用的单词,但是英文单词中常常有介词、量词等,这些词所有说英语的人都会很常用,故会造成干扰,这里做的是找出前30个频率最高的词并返回,后面的内容对应的就是删掉这些高频的词。

4、分类

这里的分类和上面邮件的分类非常相似,下面只说一些区别的地方。

区别主要有三点:1、数据源来自rss而不是txt文档,这个上面已经有了读取方式;2、这里需要删除高频词汇;3、由于判断的是词频,因此必须要用前面提到的词带模型,而不能用词集模型,即不能仅仅记录每个单词是否出现,还需要记录每个单词出现的次数。

5、分析地区常用词汇

通过上面的计算的概率进行分类。由于这里计算概率是取对数的结果,对数中值为-6,反过来计算后会发现概率约等于0。因此这里用大于-6作为判断存在这个词汇。然后再通过概率进行排序,得到每个地区的最常用的词汇。

下面是运行结果。其实可以发现这样效果并不是很好,主要原因在于,第一步删除通用词汇,只通过取前30个高频词汇删除,实际这样还不够。

实际的做法,需要有一个英文常用词汇表,再把rss读取到的内容中,删除所有词汇表中包含的内容,这样才会更精确。

三、总结

这里的两个项目都有可以改进的地方。

1、对于邮件分类系统而言,最大的问题在于数据量太少,当出现其他词汇的时候,就无法进行判断,因此需要加大样本数量。

2、对于rss来区分地区常用词汇的系统而言,关键的内容在于英文常用词汇的判定,需要一个常用词汇表来进行。

3、对于朴素贝叶斯的算法,核心就在于理解贝叶斯计算的公式,其他内容实际上都是围绕着贝叶斯的公式进行的。

——written by linhxx 2018.01.14

下一篇
举报
领券