机器学习-朴素贝叶斯分类算法
1 前言
最近在学习机器学习里的分类算法的时候,看了很多人写的文档,但是发现完全理解文档里的公式和理论还是比较吃力。主要原因是这些算法其实都是有很多前置知识的,如果在不理解这些前置知识的情况下,直接去看这些算法原理会很费劲,理解起来也会很吃力。但是很多人在写文章的时候经常忽略这个,因为作者可能潜意识里把这些当作是"基本知识",认为读者应该都懂,结果把很多想入门的人拦在了门外。
所以本文在讲解朴素贝叶斯分类算法原理之前,会尽可能先把所有前置知识都解释清楚,让即使是从来没有接触过机器学习的人也能理解朴素贝叶斯分类器。
本文会先从几个常见的具体问题案例入手,引出朴素贝叶斯分类器要解决的问题;然后会介绍朴素贝叶斯分类器的一些前置的基础知识;最后给出朴素贝叶斯的分类器的原理和过程。
2 具体问题
先从几个现实中常见的问题开始,介绍下朴素贝叶斯分类器的应用场景,让大家有一个感性的认识:
问题1:虚假账号识别 虚假账号是很多网站都会面临的一个棘手的问题,大量的虚假账号会影响正常用户的体验,造成表面繁荣的假象,实际上则会长期的影响网站的健康发展。最近马斯克曾一度因为觉得Twitter的实际虚假账号比例大于Twitter官方公开的数字而拒绝收购Twitter,可见对一个平台而言治理虚假账号重要性。
治理虚假账号的第一步就是要识别出哪些是虚假账号,那么应该如何识别呢?一种常见的做法是先进行抽样统计,然后基于样本数据总结出来的规律来识别。
根据某社区网站的抽样统计,该站10000个账号中有89%为真实账号,11%为虚假账号。判断一个账号是否为虚假账号,主要就是依据该账号在网站上的历史行为特征来进行识别。假定改网站一个账号有下面3个特征:
- 特征1:日志数量/注册天数
- 特征2:好友数量/注册天数
- 特征3:是否用真实头像(1表示是,0表示否)
现在有一个账号的特征值分别是:
- 特征1:0.1
- 特征2:0.3
- 特征3:0
请根据之前抽样的10000个账号的样本数据,分析判断这个账号是不是虚假账号?
问题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 朴素贝叶斯简介
上面例子中的问题其实都是分类问题,类似的场景还有很多很多,我们可以将这类问题进行归纳抽象,用统一的数学语言来描述:
- 已知有一个数据集表示为$S$,这些数据可以分成n类,第i类记作$y_i$;
- 每一个数据有m个特征,第i个特征记作$f_i$;
- 数据集$S$中的数据都是已知分类的;
- 现在有一个新的数据,其特征为$(f_1, f_2, f_3,…,f_m)$,请问这个数据应该属于哪一类?
朴素贝叶斯分类算法是一个广泛使用的分类算法,可以比较好的解决上面的问题。朴素贝叶斯算法是基于贝叶斯公式和特征条件独立假设的分类方法,通过已知分类的数据集可以训练出一个朴素贝叶斯分类器,用于新的数据的分类。用一句话描述贝叶斯分类器就是:总结过去,预测未来。
4 前置知识
要想完全理解朴素贝叶斯的原理,需先了解下面几个前置知识(当然这些前置知识的前置知识是:你得有一些概率论的基础):
- 条件概率
- 相互独立事件
- 贝叶斯定理
- 全概率公式
- 贝叶斯公式
下文会逐个介绍,已经很熟悉的可以跳过。“姿势"掌握好了,理解朴素贝叶斯分类器就很简单。
4.1 条件概率
这其实是概率论中的很基础的概念,大家上学的时候应该都学过,但是时间久远若不常用,估计都还给老师了吧。 条件概率:事件A在另外一个事件B已经发生条件下的发生概率,表示为P(A|B),读作“在B条件下A的概率”。
4.2 相互独立事件
事件A(或B)是否发生对事件B(A)发生的概率没有影响,这样的两个事件叫做相互独立事件。 如果事件A、B相互独立,那么有:
- $P(AB) = P(A)p(B)$
- $P(A|B) = P(A)$
如果似事件A、B、C相互独立,那么有:
- $P(AB|C) = P(A|C)P(B|C)$
其中$P(AB|C)$表示在C发生的前提下,A和B都发生的概率
朴素贝叶斯分类器的前提就是各个特征之间相互独立。比如上面的例子中账号的日志数量和好友数量。
4.3 贝叶斯定理
通常,事件A在事件B发生的条件下的概率P(A|B),与事件B在事件A发生的条件下的概率P(B|A)是不一样的;然而,这两者是有确定的关系的,贝叶斯定理就是这种关系的陈述。
贝叶斯定理是由18世纪英国数学家托马斯·贝叶斯提出,是关于随机事件A和B的条件概率的一则定理:
那么如何理解和推倒这个定理呢?下面将通过一个投硬币的概率问题来理解和推倒贝叶斯定理:
假设有一张桌子π如下图,桌子上面有两个圈A和B,随机丢一个硬币到桌子上,请问硬币落到圈A、落到圈B、落到圈A和圈B交集的概率分别是多少?
很容易我们可以得出:
- 落到圈A的概率P(A) = 圈A的面积/桌子π的面积
- 落到圈B的概率P(B) = 圈B的面积/桌子π的面积
- 落到圈A和圈B交集概率P(A∩B) = 圈A和圈B交集面积/桌子π的面积
如果已知硬币落在圈A里,那么硬币恰好落在圈A和圈B交集的概率P(B|A)为:
同样的,已知硬币落在圈B里,那么硬币恰好落在圈B和圈A交集的概率P(A|B)为:
整理与合并两个方程式,我们可以得到:
从而可以推导出贝叶斯定理:
我们把$P(A)$称作先验概率,即在B事件发生之前,我们对A事件概率的一个判断。$P(A|B)$称为后验概率 也即事件B发生后,我们对A事件概率的重新评估。$\frac{P(B|A)}{P(B)}$称为"可能性函数”(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。
4.4 全概率公式
继续用投硬币的例子解释全概率公式,如下图,有一个桌子被分成n块,第i块用$B_i$表示,桌子上画了一个圈A,随机丢一个硬币到桌子上(硬币只能掉在桌子上,没有其他地方),请问硬币落在圈A中的概率是多少?
先不加证明的给出一个定理:
若有互不相容的事件$B_i(i=1,2,…,n)$,满足$P(B_i)>0$, $\sum_{i=1}^{n}P(B_i) = 1$ 且$A\subset\sum_{i=1}^{n}P(B_i)$,则事件A的概率可用下面的公式计算: $P(A)=\sum_{i=1}^{n}P(B_i)P(A|B_i)$。
最后计算事件A的概率的公式就是全概率公式。
这个可以理解为,硬币落在圈A的概率等于,硬币落在$B_1$前提上,落在圈A中的条件概率$P(A|B_1)$,加上硬币落在$B_2$前提上,落在圈A中的条件概率$P(A|B_2)$,…,加上硬币落在$B_n$前提上,落在圈A中的条件概率$P(A|B_n)$。
4.5 贝叶斯公式
继续参考上面的图,给出一个定理:
若有互不相容的事件$B_i(i=1,2,…,n)$,满足$P(B_i)>0$, $\sum_{i=1}^{n}P(B_i) = 1$ 且$A\subset\sum_{i=1}^{n}P(B_i)$,则有: $P(B_i|A) = \frac{P(B_i)P(A|B_i)}{\sum_{i=k}^{n}P(B_k)P(A|B_k)}$
这个公式就是贝叶斯(Bayes)公式,其意义是:假设导致事件A发生的“原因”有$B_i(i=1,2,…,n)$。它们互不相容,现已知事件A确已经发生了,若要估计它是由“原因”$B_i$所导致的概率,则可用贝叶斯公式求出。
5 详细原理和流程
终于可以开始介绍朴素贝叶斯分类器的原理和流程了。朴素贝叶斯分类器是以贝叶斯公式为理论基础的一个分类器,如果你理解了贝叶斯公式,那你就已经理解了朴素贝叶斯分类器的80%了。
朴素贝叶斯分类的定义:
- 有一个数据集,每个数据有$m$个特征,这些数据可以分为$n$类;
- 设$x=\lbrace{f_1,f_2,…,f_m}\rbrace$为其中的一个数据,$f_i$为x的一个特征的值;
- 类别集合$C=\lbrace{y_1,y_2,…,y_n}\rbrace$;
- 数据项$x$属于分类$y_i$的概率表示为:$P(y_i|x)$;
- 计算$P(y_1|x)$,$P(y_2|x)$,…,$P(y_n|x)$;
- 如果$P(y_k|x)=max\lbrace{P(y_1|x), P(y_2|x),…, P(y_n|x)}\rbrace$,则$x\in{y_k}$。
所以问题的关键就是第5步如何计算$x$属于每个分类的条件概率。接下来就会用到上面提到的前置知识了:
(1)根据贝叶斯定理有:
$P(y_i|x)=\frac{P(x|y_i)P(y_i)}{P(x)}$
(2)我们的目标是要求出$P(y_i|x)$的最大值,当i取值{1,2,3,…,n}时,上述公式的分母都是一样 的,所以只找出求出分子的最大值即可:
$P(x|y_i)P(y_i)$
(3)因为$x$的特征为$\lbrace{f_1,f_2,…,f_m}\rbrace$,我们可以把上式进行转化一下:
$P(x|y_i)P(y_i) = P(f_1f_2…f_m|y_i)P(y_i)$
(4)因为各特征是相互独立的,根据相互独立事件的推论,可以得出:
$P(f_1f_2…f_m|y_i)P(y_i)=P(f_1|y_i)P(f_2|y_i)…P(f_m|y_i)P(y_i)$ $=P(y_i)\prod_{k=1}^{m}P(f_k|y_i)$
(5)上式中,$P(y_i)$和$P(f_k|y_i)$就需要通过已知分类的样本数据(训练集)统计计算出来。假设我们有一个样本集$S$,样本数量为$num(S)$,$S$中每一个样本所属的分类都是已知的,总共可以分成$n$类,每个样本有$m$个特征。假设样本集中属于分类$y_i$的样本数量是$num(y_i)$,样本中属于分类$y_i$且有特征$f_k$的样本的数量是$num(y_if_k)$。关于$P(y_i)$和$P(f_k|y_i)$的计算,针对不同类型的特征(离散、连续、布尔),计算方式不同,常见的有下面三种模型:
- 多项式模型 当特征是离散变量的时候,使用多项式模型。 多项式模型在计算$P(y_i)$和$P(f_k|y_i)$的时候会做一些平滑处理。具体公式为:
$P(y_i)=\frac{num(y_i) + a}{num(S) + na}$ $P(f_k|y_i)=\frac{num(y_if_k) + a}{num(y_i) + ma}$
上式中,$a$是平滑值,当$a=1$时,称作Laplace平滑;当$0< a < 1$时称作Lidstone平滑;当$a=0$时称作不平滑。如果不做平滑,当某一个维度的特征$f_i$在训练样本中没有出现过,会导致$P(f_k|y_i)=0$,从而导致后验概率为0,加上平滑可以克服这个问题。
- 高斯模型 当特征是连续变量的时候,用高斯模型。 如果用多项式模型就会导致很多$P(f_k|y_i)=0$(不做平滑的情况下),此时即使做平滑,所得到的条件概率也难以描述真实情况。所以处理连续的特征变量,应该采用高斯模型。 高斯模型假设该特征的分布服从 高斯分布(正态分布) ,高斯分布的定义:
若随机变量X服从一个数学期望为μ、标准方差为σ2的高斯分布,则其概率密度函数为
我们只需要求出特征$f_k$在分组$y_i$中分布的数学期望和标准方差,即可求出$P(f_k|y_i)$。
- 伯努利模型 当特征是二值变量,如只能取值0、1的时候,用伯努利模型。 如果特征值$f_k$值为1,那么: $P(f_k|y_i)=P(f_k=1|y_i)$ 如果特征值xixi值为0,那么: $P(f_k|y_i)=1-P(f_k=1|y_i)$ 这意味着,“没有某个特征”也是一个特征。
(6)将上述通过统计训练样本得出来的计算结果带入到公式中既可以计算出x属于每一个分类的概率。取概率最大的分类即为x所属的分类。