朴素贝叶斯分类器可以说是最经典的基于统计的机器学习模型了。首先,暂且不管贝叶斯是什么意思,朴素这个名字放在分类器中好像有所深意。
一查,发现这个分类器的英文是“Naïve Bayes”。Naïve(读作“哪义务”)即幼稚的、天真的(但是总不能叫“幼稚贝叶斯”阿),Bayes即贝叶斯。那么这里的naïve是什么意思呢?其实就是代表着简化问题复杂度,像一个小孩子一样,不考虑复杂的东西。
一句话描述naïve就是“特征独立性假设”。详细的说,这里的独立性有两个意思,一个是“条件独立性“,一个是“位置独立性”,分别是什么意思呢?
如果我们要识别一个人的肖像,要用到“身高”和“体重”这两个特征。然而“身高”和“体重”明明是有关系的,身高1米8的人是不太能体重低于100斤的,但是在朴素贝叶斯分类器的眼里,身高和体重没有关系。这个例子的数学表达就是P(B|A)=P(A)*P(B),意思即特征A与特征B相互独立(毫无关系)。这种假设就叫“条件独立性假设”。
位置独立性的意思是先考虑特征A再考虑特征B,跟先考虑特征B再考虑特征A所带来的结果是完全一样的。很好理解,比如在文本挖掘中,“我|喜欢|狗”中有三个特征,分别是“我”“喜欢”“狗”,如果我们按照先后顺序来考虑这三个特征的话,就能得出你喜欢狗这个事实。但是如果按照“狗”“喜欢”“我”这样的顺序的话,得到的意思就完全变了。显然,这里各个特征之间的先后顺序,即位置是很重要的。然而,朴素贝叶斯的假设就是位置之间是独立的,即毫无关系的。因此在朴素贝叶斯看来,“我|喜欢|狗”与“狗|喜欢|我”是同一个分类任务。
好,朴素的意思我们懂了,那么核心就是贝叶斯了。
显然,在统计理论中,与贝叶斯最相关的就是贝叶斯定理,也叫贝叶斯公式。不用管能不能看懂,先贴公式:
这个公式看似有点绕,其实如果我们把公式里的A看作我们已经知道的特征的值,(注意这里我们仅仅考虑一个特征,即仅考虑用一个特征对目标进行分类的任务)把B看作分类目标的一个类别,就会发现非常非常简单啦。所以呢,这个公式的意思就是,已知特征的值为A的情况下,目标类别为B的概率(P(B|A))就等于已知目标类别是B的情况下,特征的值为A的概率(P(A|B))乘以什么都不知道的情况下,目标类别为B的概率(P(B),专业说法叫B的先验概率),再除以什么都不知道的情况下,特征的值为A的概率。
诶?细心的读者有没有发现什么呢?相信此时肯定已经有人激动了!我们这里看一个栗子。
就是这个栗子。
哈哈,是下面的栗子啦。
假如小夕捕获了一批鱼,这批鱼中只有黑鱼和三文鱼。虽然小夕并不认识这两种鱼,但是小夕有设备可以测量出每条鱼肚皮的亮度等级(比如最白为10级,最黑为1级。然后有一位好心的粉丝送给了小夕一批标好类别的黑鱼和三文鱼。那么小夕借助上面这些已经知道的东西,用朴素贝叶斯分类器来给小夕捕的那些鱼的类别贴标签,怎么做呢?
诶?这里不是说鱼肚皮的亮度等级都能测出来嘛?那鱼肚皮的亮度等级不就是一个特征咯,每条鱼测出来的亮度等级不就是特征的值嘛。有没有灵光一现?
对!还记得贝叶斯定理的等式左边的P(B|A)的意思吗?假如某条鱼测得的亮度等级为2,那么我们只需要计算并比较 P(类别=黑鱼|特征=2) 与 P(类别=三文鱼|特征=2) 的大小不就可以啦!肯定是值更大的,也就是概率更大的,就是我们要输出的类别呀!专业说法叫取最大后验概率。
那么怎么计算呢?显然就是用等式右边那三坨(噗,好不文明的说)。为了方便阅读,在这里再贴一遍。
首先,这三坨中,除号底下的P(A)代表特征取某值的概率,然而我们要预测某一条鱼的类别,显然这条鱼的特征的值我们已经知道了,即定值,因此不管是求 P(类别=黑鱼|特征=2) 也好,求 P(类别=三文鱼|特征=2) 也好, P(A) 是相同的值,对于比较这两个概率的大小没有任何帮助。因此干脆不计算了。
然后,这三坨中的 P(B) 代表 P(类别取某类) ,也就是某类别的先验概率,怎么计算得到呢?还记得粉丝给了小夕一堆鱼吗?那我们直接用这一堆鱼来近似得到 P(B) 不就可以啦!
(按照概率论的大数定律的意思,当样本足够多时,样本的统计比率就可以近似真实概率。回想一下抛10000次均匀硬币时会有接近5000次正面向上,由此得到正面向上的概率为0.5)
因此,假如粉丝给了小夕10000条鱼,其中3000条是黑鱼,7000条是三文鱼,那显然 P(黑鱼)=3000/10000=0.3 ,同理 P(三文鱼)=0.7 。看,P(B) 解决了吧。
三坨中的最后一坨, P(A|B) ,也就是 P(特征为某值|已知类别为某类) 怎么得到呢?也很轻松啊,同样是利用粉丝给的10000条鱼,小夕用设备将这10000条鱼的亮度等级测出来后,只需要从每个类别的鱼群中,统计一下特征的每个取值下的鱼占该类别的鱼总数的比率就好啦。
比如黑鱼有3000条,其中亮度等级为8的鱼一共有1000条,那么 P(特征=8|类别=黑鱼)=1000/3000=0.3 。同理可以得到其他 P(A|B) 的值啦。
至此,等式右边全都解决了,因此等式左边也能算出来了。所以对于下面这种情况的话(粉丝给了小夕100来条鱼):
小夕做好的朴素贝叶斯分类器肯定会将亮度等级小于x*的鱼都认为是三文鱼(在此情况下,类别判定为三文鱼的概率总是比黑鱼的概率大),反之都认为是黑鱼。
那么我们也发现了,诶?这样的话,对于亮度等级为4-7之间的鱼,很难判定呀。怎么办呢?当然是增加特征啦!比如小夕又买了个尺子,可以测量鱼身的长度。
诶?那两个特征的情况下,怎么做呢?还记得本文开头时提到的独立性假设吗,就在这里派上用场了。对于多个特征的情况,只需要分别计算出每个特征的情况,然后将这些情况直接相乘就ok了~
也就是假设A为特征集合,包含M和N这两个特征,那么只需要将等式右边的这个 P(A|B) 展开成 P(M|B)*P(N|B) 就可以啦,也就是只需要在代码里迭代一下可以啦。看吧,naïve一点是可以避免很多麻烦的。
加上鱼长这个特征后,可能就成这样子了。
看,一下子好分多了吧~这样出来的朴素贝叶斯分类器的精度就高多啦。至此小夕成功完成了拣鱼任务!
喜欢小夕的文章可以关注小夕的微信订阅号“夕小瑶的卖萌屋”哦,这里的干货很好吃O(∩_∩)O