此文通过朴素贝叶斯在垃圾邮件分类中的实践进行说明机器学习的一般流程。文章参考了 带你彻彻底底搞懂朴素贝叶斯公式 建议读者可以去阅读了解。
一朴素贝叶斯(Naive Bayesian)说明
朴素贝叶斯的朴素一词来源是假设各特征之间相互独立,这一假设使得朴素贝叶斯算法变得简单,但同时也牺牲了一定的分类准确率。
Naive Bayesian公式:(P(B|A)=frac{P(A|B)P(B)}{P(A)})
折换成分类任务的表达:(P( ext{类别}| ext{特征})=frac{P( ext{特征}| ext{类别})P( ext{类别})}{P( ext{特征})})
我们最终求得 (P( ext{类别}| ext{特征}))即可,即完成了我们最终的分类任务。
通过上述的分析,我们得到最终的朴素贝叶斯分类公式如下所示:
注意到上式分母对所有的(c_k)都是一致的,故上式也可以转写为如下形式:
二实例解析
首先给出数据如下
邮件内容 | 垃圾与否? |
---|---|
点击 获得 更多 信息 | 垃圾 |
购买 最新 产品 获得 优惠 | 垃圾 |
优惠 信息 点击 链接 | 垃圾 |
明天 一起 开会 | 正常 |
开会 信息 详见 邮件 | 正常 |
最新 竞品 信息 | 正常 |
新来一封邮件内容如下:
最新 产品 实惠 点击 链接
对其判断是否是垃圾邮件。
建模过程:
①计算先验概率 (p( ext{垃圾})=3/6)、(p( ext{正常})=3/6)
②构建词库,将垃圾邮件与正常邮件出现的单词作为词库 (V={ ext{点击 获得 更多 信息 购买 最新 产品 优惠 链接 明天 一起 开会 详见 邮件 竞品} }),词库大小为(|V|=15)
③计算上述每个单词在正常邮件和垃圾邮件分别出现的概率是多少
(p( ext{点击} | ext{垃圾})=2/13)
为了保证在计算中某些单词出现概率为0的情况,我们采用Add-1的平滑方法,故上述概率可以修正为如下:
(p( ext{点击} | ext{垃圾})=frac{2+1}{13+15})
备注:其中2位单词’点击‘在垃圾文件中出现的次数,13为垃圾邮件中总的词个数。
按照上述方法,计算每一个单词的概率即可。
④计算新邮件的概率
计算 (p( ext{垃圾} | ext{邮件}))与(p( ext{正常} | ext{邮件}))的大小。按照我们上文对贝叶斯公式的分析,可以将上述大小比较转化为(p( ext{邮件} | ext{垃圾})p( ext{垃圾}))与(p( ext{邮件} | ext{正常})p( ext{正常}))的大小。
其中先验概率已经求出了 (p( ext{垃圾}))、(p( ext{正常}))。根据朴素贝叶斯的朴素特点,各个特征间相互独立,故
上述的公式都已经在步骤③中计算得到,故这里直接拿值获得结果即可。
⑤上述计算过程中,我们可以发现,连乘积之后,值非常的小,这种情况下会发生underflow下溢问题,为了防止这种情况发生,针对概率的连乘一般两边取 (log)处理,一是取(log)后可以将连乘转化为相加操作,另一个是取(log)是严格递增的函数,不影响我们计算的结果。
经过上述过程后,即可根据计算结果对新邮件进行判断,判断是垃圾邮件还是正常邮件。
三朴素贝叶斯的优缺点
优点
- 算法逻辑简单,易于实现
- 分类过程中时空开销小,条件假设了特征相互独立,存储仅涉及二维存储
缺点
- 朴素贝叶斯假设特征间相互独立,这种假设在实际情况下往往不成立。这就会导致实际过程中特征之间关联越大,分类误差也就越大