朴素贝叶斯分类——大道至简

分类问题

已知m个样本 (x^1,y^1), ...... (x^m,y^m),x是特征变量,y是对应的类别。
要求一个模型函数h,对于新的样本 x^t,能够尽量准确的预测出 y^t = h(x^t)

概率角度

很多机器学习算法从误差角度来构建模型函数h,也就是先假设一个h,然后定义一个h(x)与y的误差,通过逐步减少h(x)与y的误差来获得一个拟合的模型h。

现在我们从概率的角度来考虑一下。
假设y有m个类别,即 y_1,......y_n ∈ \{C_1,......C_m\}
对于样本 x^t,如果能计算出每个类别的条件概率 P(C_1|x^t),......P(C_m|x^t),那么可以认为概率最大的那个类别就是 x^t 所属的类别。(关于条件概率和贝叶斯定理请参考 理解贝叶斯定理)。即
h(x) = C_x = \operatorname{argmax} \limits_{k \in \{1,2,...K\}} \Big(P(C_k|x) \Big) \quad(1)

朴素贝叶斯分类器

已知m个样本 (x^1,y^1),(x^2,y^2), ...... (x^m,y^m)
x是n维特征变量,即 x=(x_1,x_2,......x_n)
y是对应的类别,设有K个类别,即 y^1,y^2,......y^m ∈ \{C_1,C_2,......C_K\}

对任一给定的x,我们需要分别计算出x属于各分类的概率 P(C_1|x),P(C_2|x),......P(C_K|x),其中有最大值的P(C_k|x),x即属于该分类C_k,即样本x属于分类
C_x = \operatorname{argmax} \limits_{k \in \{1,2,...K\}} \Big(P(C_k|x) \Big) \quad(2)

现在需要计算 P(C_k|x),应用贝叶斯定理:
P(C_k|x) = \frac{P(C_k)}{P(x)} P(x|C_k) \quad(3) \\ = \frac{P(C_k)}{P(x)} P(x_1,x_2,......x_n|C_k) \quad(4)

这里 P(x_1,x_2,......x_n|C_k) 是一个条件联合概率,意思是在分类 C_k 中,特征 (x_1,x_2,......x_n) 取一组特定值(也就是需要预测的样本x的各特征的值)的概率。这个概率不容易计算,为了方便,于是朴素贝叶斯(Naive Bayes) 隆重登场。在这里朴素的意思是,假定 x 的各特征 x_1,x_2,......x_n 是条件独立的。(参考维基百科 - 条件独立)。因此
P(x_1,x_2,......x_n|C_k) = P(x_1|C_k)P(x_2|C_k)......P(x_n|C_k) \quad(5)
这个转换其实就是 独立变量的联合分布 = 各变量先验分布的乘积(参考 维基百科 - 联合分布),只不过这里是条件概率,但是因为变换前后都有同样的条件 C_k,从样本空间 C_k 的角度看,其实就是联合分布转换成先验分布的乘积。(对样本空间的理解请参考 理解贝叶斯定理)。

将(5)带回(4)得
P(C_k|x) = \frac{P(C_k)}{P(x)} P(x_1|C_k)P(x_2|C_k)......P(x_n|C_k) \\ = \frac{P(C_k)}{P(x)} \prod_{j=1}^{n}P(x_j|C_k) \quad(6)

对任一给定的样本x的值是确定的,且x不依赖于C,所以P(x)可以看作常量。所以可以忽略 P(x)
P(C_k|x) \propto P(C_k) \prod_{j=1}^{n}P(x_j|C_k) \\ C_x = \operatorname{argmax} \limits_{k \in \{1,2,...K\}} \Big(P(C_k) \prod_{j=1}^{n}P(x_j|C_k) \Big) \quad(7)
这就是朴素贝叶斯分类的模型函数。

参数估计

上述公式中主要有两项,分别考察一下如何计算。

参数1:P(C_k)

上式中 P(C_k) 比较容易计算,用频率来估算概率,统计m个样本中属于 C_k 的样本的频率即可。设m个样本中有 m_k 个样本的类别是 C_k,则
P(C_k) = m_k / m \quad(8)

参数2:P(x_j|C_k)

P(x_j|C_k)的计算需要事先假设样本特征x_j的数据分布情况。对特征分布的假设,我们称之为事件模型,通常会采用以下三种假设。

  1. 多项式分布
    如果特征x_j是离散值,可以假设它符合 多项式分布。可以统计x_j的某个特征在样本中的频率来估算其概率。
    假设 特征x_jS_j 个可能的取值(比如天气有阴、晴、雨三种状态,则 S_j=3),并且在n个样本中,类别为 C_k、特征 x_j 取值为 s 的样本有 m_{kjs} 个。则

P(x_{js}|C_k) = m_{kjs} / m_k \quad(9)
有时候样本中某个特征的特定取值的样本数 m_{kjs} = 0,这将导致整个 P(C_k) \prod_{j=1}^{n}P(x_j|C_k) = 0,严重扭曲了该特征的概率值。因此,通常可以采用拉普拉斯平滑来避免这种情况发生。即
P(x_{js}|C_k) = (m_{kjs} + \lambda) \big/ (m_k + S_j \lambda) \quad(10)
通常取 \lambda = 1
将(8)和(10)带入贝叶斯分类器(7),得到

C_x = \operatorname{argmax} \limits_{k \in \{1,2,...K\}} \Big(P(C_k) \prod_{j=1}^{n}P(x_j|C_k) \Big) \\ k = \operatorname{argmax} \limits_{k \in \{1,2,...K\}} \Big( \frac{m_k}{m} \prod_{j=1}^{n} \frac{m_{kjs} + \lambda}{m_k + S_j \lambda} \Big) \quad(11)

用一个粗略的示意图来理解一下特征为离散值时,条件概率P(x_{js}|C_k)如何根据样本集来进行估算:

特征为离散值

图中表示整个样本空间,有两个类别
C_1, C_2
,每个样本有两个特征
x_1, x_2
,其中
x_1
有3个可取的离散值
S_{11}, S_{12}, S_{13}
x_2
有4个可取的离散值
S_{21}, S_{22}, S_{23}, S_{24}
。图中橙色部分就是
m_{111}
,即 类别=
C_1
,特征=
x_1
,特征值=
S_{11}
时(k=1,j=1,s=1)的样本数,蓝色部分就是
m_{123}
,即 类别=
C_1
,特征=
x_2
,特征值=
S_{23}
时(k=1,j=2,s=3)的样本数。整个灰色部分是
m_1
,即类别为
C_1
的样本数。

举例:根据天气情况决定是否打网球
本案例来自 朴素贝叶斯分类器

打网球样本

上面表格是某同学在不同天气情况下的打网球决策数据。
假设今天天气状况是:Outlook=sunny, Temperature=cool,Humidity=high,Wind=strong,该同学是否会去打网球呢?
这里的几个特征,天气、温度、湿度、风速都是离散型变量,适合采用上面的多项式贝叶斯分类方法。将上面的公式写在这里便于查看。
k = \operatorname{argmax} \limits_{k \in \{1,2,...K\}} \Big( \frac{m_k}{m} \prod_{j=1}^{n} \frac{m_{kjs} + \lambda}{m_k + S_j \lambda} \Big) \quad(11)

我们需要计算 k=\{yes, no\} 两种情况下,x=(sunny,cool,high,strong) 的估算概率。
统计上表中各种情况下的样本数量可知:
总样本数 m=14

打球(k=yes)的样本数 m_{yes} = 9
不打球(k=no)的样本数 m_{no} = 5

天气的取值 S_{Outlook}=3(Sunny/Overcast/Rain)
晴天打球(k=yes,j=Outlook,s=sunny)的样本数 m_{kjs}=2
晴天不打球(k=no,j=Outlook,s=sunny)的样本数 m_{kjs}=3

温度的取值 S_{Temperature}=3(Hot/Mild/Cool)
冷天打球(k=yes,j=Temperature,s=cool)的样本数 m_{kjs}=3
冷天不打球(k=no,j=Temperature,s=cool)的样本数 m_{kjs}=1

湿度的取值 S_{Humidity}=2(High/Normal)
潮湿天打球(k=yes,j=Humidity,s=high)的样本数 m_{kjs}=3
潮湿天不打球(k=no,j=Humidity,s=high)的样本数 m_{kjs}=4

风力的取值 S_{Wind}=2(Strong/Weak)
大风天打球(k=yes,j=Wind,s=strong)的样本数 m_{kjs}=3
大风天不打球(k=no,j=Wind,s=strong)的样本数 m_{kjs}=3

将上述数据代入公式(11),对于样本 x=(sunny,cool,high,strong) ,打球(k=yes)的概率
k=yes \\ \frac{m_k}{m} \prod_{j=1}^{n} \frac{m_{kjs} + \lambda}{m_k + S_j \lambda} \\ = \frac{9}{14} \Big( \frac{2 + 1}{9 + 3} \Big) \Big( \frac{3 + 1}{9 + 3} \Big) \Big( \frac{3 + 1}{9 + 2} \Big) \Big( \frac{3 + 1}{9 + 2} \Big) \\ = 0.007084
不打球(k=nos)的概率
k=no \\ \frac{m_k}{m} \prod_{j=1}^{n} \frac{m_{kjs} + \lambda}{m_k + S_j \lambda} \\ = \frac{5}{14} \Big( \frac{3 + 1}{5 + 3} \Big) \Big( \frac{1 + 1}{5 + 3} \Big) \Big( \frac{4 + 1}{5 + 2} \Big) \Big( \frac{3 + 1}{5 + 2} \Big) \\ = 0.01822

这里 0.01822 > 0.007084,所以该同学可能不会去打球。经过归一化,
不打球的概率 = 0.01822 / (0.01822 + 0.007084) = 72%
(注:这里计算结果与原案例中的数值不同,因为这里有做拉普拉斯平滑,原案例中没有。本案例中其实没有出现特定特征的样本数为0的情况,可以不用做拉普拉斯平滑,不过这里是按照公式写下来的,就按公式计算了)

  1. 伯努利分布
    如果特征x_j是稀疏二项离散值,可以假设它符合 伯努利分布。上面打网球的案例中,湿度取值是 {high,normal},风力取值是 {strong,weak},这两个特征都是二项离散值。
    伯努利分布只有两种可能的取值,我们将其编码为 {0,1},则
    P(x_{js}|C_k) = \begin{cases} P(x_{js}=1|C_k) \\ P(x_{js}=0|C_k) = 1 - P(x_{js}=1|C_k) \end{cases} \quad(12)

另外注意到伯努利分布其实是多项式分布的特例,所以我们可以用上面公式(12)计算,也可以用之前多项式分布公式(11)计算。

垃圾邮件分类等涉及文本的任务中可以采用伯努利分布,比如构造一个5000个不同单词的向量作为输入特征x,对于一段文本,其中有出现的单词,在x中对应单词的位置设为1,其它位置为0,这样x中的每个特征(单词)的取值为1或0,符合伯努利分布。

  1. 高斯分布
    如果特征x_j是连续变量,可以假设它符合 高斯分布(正态分布)。准确点说,是假设每个类别 C_k 下的 x_{kj} 符合高斯分布。这样,我们可以通过高斯分布的概率密度函数来计算样本中 x_j 某个特定值的条件概率 P(x_{js}|C_k)。高斯分布的概率密度函数为:
    f(x;\mu,\sigma) = \frac{1}{\sigma \sqrt{2 \pi}} exp \Big( - \frac{(x-\mu)^2}{2 \sigma ^2} \Big)
    其中 \mu 是均值,\sigma^2是方差。
    假设在类别 C_k 中,特征 x_j 的均值为 \mu_{kj},方差为 \sigma_{kj}^2(这两项可以通过样本数据统计出来)。则
    P(x_{j}|C_k) = \frac{1}{\sigma_{kj} \sqrt{2 \pi}} exp \Big( - \frac{(x_j-\mu_{kj})^2}{2 \sigma_{kj} ^2} \Big)

案例请参考 维基百科 - 案例 - 性别分类

处理连续数值问题的另一种常用的技术是通过离散化连续数值的方法。通常,当训练样本数量较少或者是精确的分布已知时,通过概率分布的方法是一种更好的选择。
而在大量样本的情形下离散化的方法表现更优,因为大量的样本可以学习到数据的实际分布,而不用“朴素”的假设其分布。典型情况下很多任务都会提供大量的样本,所以这时选择离散化方法会比概率分布估计的方法更好。

题外话

顺便说一句,每次看到朴素这个词,我就仿佛看到贝叶斯穿着一身打满补丁衣服的样子。而naive意思是缺乏经验的;幼稚的;无知的;轻信的。从公式推导过程来看,朴素贝叶斯分类器采用了一些简化条件的假设,比如假设 x 的各特征 x_1,x_2,......x_n 是条件独立的,假设样本特征数据符合多项式分布、伯努利分布、高斯分布等,这些假设都可能不完全符合实际情况,因为对险恶的现实世界的无知从而采用了一些天真的假设。
不过,朴素还有一层含义是专一、纯粹,在这个意义上,贝叶斯分类也算大道至简,大智若愚了。

优缺点

朴素贝叶斯的主要优点有:

1)算法简单,有稳定的分类效率。
2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
3)对缺失数据不太敏感。

朴素贝叶斯的主要缺点有:   
1)“朴素”的假设如果与实际情况不符,会影响模型效果。
2)输入特征数据的表现形式,比如是连续特征,离散特征还是二元特征,会影响概率计算和模型的分类效果。

参考

朴素贝叶斯算法原理小结
朴素贝叶斯分类器
维基百科 - Naive Bayes classifier
理解贝叶斯定理

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,646评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,979评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,391评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,356评论 0 215
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,740评论 3 293
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,836评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,022评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,764评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,487评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,728评论 2 252
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,200评论 1 263
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,548评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,217评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,134评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,921评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,919评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,766评论 2 274

推荐阅读更多精彩内容

  • 朴素贝叶斯很直观,计算量也不大,在很多领域有广泛的应用,这里我们就对朴素贝叶斯算法原理做一个小结。 朴素贝叶斯相关...
    蛐蛐囍阅读 868评论 0 2
  • 在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,KNN,逻...
    云时之间阅读 1,850评论 6 24
  • 忘光了概率统计的知识还想学朴素贝叶斯算法?这一篇就是为你准备的。虽然如此,作为初学者,别指望 5 分钟就能完全理解...
    kamidox阅读 2,555评论 4 7
  • 腾讯云IM的sdk中主要提供了 以下几个消息类 TIMTextElem (文本消息) TIMImageElem (...
    进阶的蚊子阅读 6,140评论 2 0
  • 正确本身,其实很可能并没有什么价值。 大多数人习惯性地“一根筋”,只会单维度思考,从来不去想事物的另外一个维度。 ...
    青茶_2619阅读 203评论 0 0