Naive Bayes Classifier

Table of Contents

1. 朴素贝叶斯分类器简介

朴素贝叶斯分类器(Naive Bayes classifier)是一种基于贝叶斯定理的常用分类方法,它的实现比较简单。

参考:
统计学习方法,李航,第四章

1.1. 贝叶斯定理(贝叶斯公式)

A,B 是两个事件,P(B|A) 表示事件 A 已经发生的前提下,事件 B 发生的概率(称为条件概率)。贝叶斯公式为:
P(B|A)=P(A|B)P(B)P(A)=P(A|B)P(A)P(B)

上式中, P(B) 往往由历史数据可以得到,叫做 先验概率(Priori Probability)P(B|A) 称为 后验概率(Posteriori Probability)

2. 朴素贝叶斯分类器

朴素贝叶斯分类器的思想很简单: 将实例分到后验概率最大的类中。

朴素贝叶斯分类的正式描述如下:
假设有 N 条训练数据 T={(x1,y1),(x2,y2),,(xN,yN)} ,其中 yiY={c1,c2,,ck} ,即数据共分为 k 类。

假设给定的待分类数据为: x=(x(1),x(2),,x(N))T ,如何求它所属的分类 y 呢?
朴素贝叶斯分类器采用的方法是先计算下面所有条件概率(后验概率):
P(c1x),P(c2x),,P(ckx)
然后,把待分类数据 x 分到上面 k 个概率中较大的那个对应的分类:
y=argmaxciYP(cix)
上式就是朴素贝叶斯分类器的决策函数的原始形式,后文将对它进行化简。

2.1. 求解决策函数(用“特征条件独立”的假设来简化计算)

如何求 y=argmaxciYP(cix) 呢?
由贝叶斯公式有: P(cix)=P(xci)P(ci)P(x) ,由于分母 P(x) 对于所有类别是不变的,不影响比较大小,所以无需理会它。式中, P(ci) 往往是历史已知数据,或者由训练数据集可直接统计出来(即训练数据中出现 ci 的次数除以训练数据的总数 N 即可),

剩下 P(xci)=P(x(1),x(2),,x(N)ci) 需要计算,它比较难计算。如果假设 分类的特征在类确定的条件下都是条件独立的 ,那么有:
P(xci)=P(x(1),x(2),,x(N)ci)=j=1NP(x(j)ci)

上面这个假设是比较强的假设(所以认为它是朴素的,称为朴素贝叶斯分类器),这可能会牺牲分类的准确性,但它大大简化了计算。

所以,朴素贝叶斯分类器的决策函数可以写为:
y=argmaxciYP(ci)j=1NP(x(j)ci)

2.2. 简单实例

这个例子摘自:统计学习方法,李航,第四章

有表 1 所示训练数据。

Table 1: 一些训练数据
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
X(1) 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
X(2) S M M S S S M M L L L M M L L
Y -1 -1 1 1 -1 -1 -1 1 1 1 1 1 1 1 -1

其中, X(1)X(2) 为数据的两个特征(都是离散值), Y 为类标记。求数据 (2,S)T 的分类。

解:
我们直接按照公式 y=argmaxciYP(ci)j=1NP(x(j)ci) 来对数据进行分类。为表述更清晰,我们把 P(ci) 完整地写为 P(Y=ci) ,把 P(x(j)ci) 完整地写为 P(X(j)Y=ci) 。由于给定的训练数据都是一些离散的值,直接统计出现的次数,可得到:
P(Y=1)=915,P(Y=1)=615P(X(1)=1Y=1)=29,P(X(1)=2Y=1)=39,P(X(1)=3Y=1)=49P(X(2)=SY=1)=19,P(X(2)=MY=1)=49,P(X(2)=LY=1)=49P(X(1)=1Y=1)=36,(X(1)=2Y=1)=26,P(X(1)=3Y=1)=16P(X(2)=SY=1)=36,P(X(2)=MY=1)=26,P(X(2)=LY=1)=16
对于给定的数据 x=(2,S)T ,计算:
P(Y=1)P(X(1)=2Y=1)P(X(2)=SY=1)=9153919=145P(Y=1)P(X(1)=2Y=1)P(X(2)=SY=1)=6152636=115
由于 115>145 ,所以 y=1

说明:这个例子不太好,没有指定例子的真实生活背景,且待分类的数据存在于训练数据中;但它很简单,足够说明朴素贝叶斯分类器的基本原理。

3. 处理“特征连续”的情况

前面的例子中,由于特征都是离散值,可以方便地从训练数据中计算出相应的概率。但如果特征是连续值时,怎么办呢?
有两种常用技巧,一是把连续值划分为几个区间,计算区间的概率,从而离散化连续值;另一种技巧是假设是这些连续数值为正态分布,通过样本计算出均值和方差,从而得到正态分布的密度函数,把值代入密度函数从而可以算出某一点的密度函数的值。

训练数据集大时,采用计算区间的概率,从而离散化连续值的技巧更好,因为它可以体现训练数据的分布;当样本很小时,可以采用假设是这些连续数值为正态分布的技巧。

下面通过两个实例分别演示这些技巧。

3.1. 实例:检测“社交网站不真实账号”

这个例子摘自:算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)

我们选取下面三个特征属性来判断社交网站的账号是否真实:
X(1) :日志数量/注册天数, X(2) :好友数量/注册天数, X(3) :是否使用真实头像。

运维人员曾经人工检测过的 10000 个账号作为训练样本,得到该站 10000 个账号中有 8900 个为真实账号(记为 c0 ),1100 个为虚假账号(记为 c1 )。从而有: P(Y=c0)=0.89,P(Y=c1)=0.11
对于 X(3) 可以用 0 和 1 表示“没有使用/使用”了真实头像。但在这里 X(1)X(2) 是连续变量,无法按照某个特定值计算概率。一个技巧是将连续值变为离散值,计算区间的概率。比如将 X(1) 分解成 [0,0.05),[0.05,0.2),[0.2,+) 三个区间,将 X(2) 分解成 [0,0.1),[0.1,0.8),[0.8,+) 三个区间 ,然后计算每个区间的概率。

从 10000 个样本中,运维人员统计得到每个类别条件下各个特征属性划分的频率:
P(X(1)<0.05Y=c0)=0.3,P(0.05X(1)<0.2Y=c0)=0.5,P(X(1)0.2Y=c0)=0.2P(X(1)<0.05Y=c1)=0.8,P(0.05X(1)<0.2Y=c1)=0.1,P(X(1)0.2Y=c1)=0.1P(X(2)<0.1Y=c0)=0.1,P(0.1X(2)<0.8Y=c0)=0.7,P(X(2)0.8Y=c0)=0.2P(X(2)<0.1Y=c1)=0.7,P(0.1X(2)<0.8Y=c1)=0.2,P(X(2)0.8Y=c0)=0.1P(X(3)=0Y=c0)=0.2,P(X(3)=1Y=c0)=0.8P(X(3)=0Y=c1)=0.9,P(X(3)=1Y=c1)=0.1

现在有一个账号的这三个属性为: (X(1),X(2),X(3))T=(0.1,0.2,0)T ,那么它是真实账号还是虚假账号呢?
X(1)=0.1 属于区间 [0.05,0.2)X(2)=0.2 属于 [0.1,0.8) ,我们计算:
P(Y=c0)P(0.05X(1)<0.2Y=c0)P(0.1X(2)<0.8Y=c0)P(X(3)=0Y=c0)=0.89×0.5×0.7×0.2=0.0623P(Y=c1)P(0.05X(1)<0.2Y=c1)P(0.1X(2)<0.8Y=c1)P(X(3)=0Y=c1)=0.11×0.1×0.2×0.9=0.00198

由于 0.0623>0.00198 ,所以归为 c0 类。可以看到,虽然这个用户没有使用真实头像,但是通过朴素贝叶斯分类器的鉴别,更倾向于将此账号归入真实账号类别。

3.2. 实例:预测性别

下面例子摘自:https://zh.wikipedia.org/wiki/%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%88%86%E7%B1%BB%E5%99%A8

假设有表 2 所示的统计数据。

Table 2: 关于“性别/身高/体重/脚掌大小”的一些统计数据
性别 身高(英尺) 体重(磅) 脚掌(英寸)
6 180 12
5.92 190 11
5.58 170 12
5.92 165 10
5 100 6
5.5 150 8
5.42 130 7
5.75 150 9

已知某人身高 6 英尺、体重 130 磅,脚掌 8 英寸,请问该人是男还是女?

身高、体重、脚掌都是连续变量,不能采用离散变量的方法计算概率。而且由于样本太少,所以也无法分成区间计算。怎么办?
这时,可以假设男性和女性的身高、体重、脚掌都是正态分布,通过样本计算出均值和方差,也就是得到正态分布的密度函数。有了密度函数,就可以把值代入,算出某一点的密度函数的值。

我们假设训练集样本的特征满足高斯分布,从训练集可以得到表 3

Table 3: 假设前面样本的特征满足高斯分布
性别 均值(身高) 方差(身高) 均值(体重) 方差(体重) 均值(脚的尺寸) 方差(脚的尺寸)
男性 5.855 3.5033e-02 176.25 1.2292e+02 11.25 9.1667e-01
女性 5.4175 9.7225e-02 132.5 5.5833e+02 7.5 1.6667e+00

从表 3 知,男性的身高是均值 5.855、方差 0.035 的正态分布。所以,男性身高为 6 英尺的概率的相对值等于:
P(heightmale)=12πσ2e(6μ)22σ21.5789,μ=5.855,σ2=0.035
说明:大于 1 并没有关系,因为这里是密度函数的值,只用来反映各个值的相对可能性。

类似地,我们可以计算出:
男性体重 130 磅的概率的相对值为 5.9881e6
男性脚掌 8 英寸的概率的相对值为 1.3113e3
女性身高为 6 英尺的概率的相对值为 2.2346e1
女性体重 130 磅的概率的相对值为 1.6789e2
女性脚掌 8 英寸的概率的相对值为 2.8669e1

可以假设 P()=P()=0.5

计算:
P()×P(身高=6|)×P(体重=130|)×P(脚掌=8|)=6.1984e9P()×P(身高=6|)×P(体重=130|)×P(脚掌=8|)=5.3778e4

由于女性后验概率的分子比较大,所以我们预计这个样本是女性。

4. Laplace 校准

如果当某个类别下某个特征没有出现时,可能会出现概率为 0 的情况,这会令分类器质量大大降低。为了解决这个问题,我们引入 Laplace 校准。

Laplace 校准的思想很简单:就是对每个类别下所有特征的计数加 1,这样如果训练样本集数量充分大时,并不会对结果产生影响(可称为“加一”平滑)。

参考:https://en.wikipedia.org/wiki/Laplacian_smoothing

5. 下一步:贝叶斯信念网络

朴素贝叶斯分类器中假设输入变量都是条件独立的,如果假设它们之间存在概率依存关系,则模型就变成了贝叶斯信念网络(Bayesian network)。

Author: cig01

Created: <2015-05-30 Sat>

Last updated: <2018-01-02 Tue>

Creator: Emacs 27.1 (Org mode 9.4)