关于土豆哥
一只文艺型码农
大数据与机器学习 基础篇 分类 朴素贝叶斯
大数据与机器学习 基础篇 分类 朴素贝叶斯

分类算法是机器学习中的一个重点,也是人们常说的“有监督的学习”。这是一种利用一系列已知类别的样本来对模型进行训练调整分类器的参数,使其达到所要求性能的过程,也成为监督训练或有教师学习。

注:本文中用到的Python及其模块安装教程参见


朴素贝叶斯

贝叶斯决策理论是主观贝叶斯派归纳理论的重要组成部分。

贝叶斯决策理论方法是统计模型决策中的一个基本方法,基本思想如下:

  1. 已知类条件概率参数表达式和先验概率。
  2. 利用贝叶斯公式转换成后验概率。
  3. 根据后验概率大小进行决策分析。

我们先给出贝叶斯公式:

  • 设\(D_1,D_2,……,D_n\)为样本空间S的一个划分,如果以\(P(D_i)\)表示\(D_i\)发生的概率,且\(P(D_i)>0(i=1,2,……,n)\)。对于任何一个事件\(x\),\(P(x)>0\),则有:
\( P(D_j|x)=\frac{P(x|D_j)P(D_j)}{\sum_{i=1}^nP(x|D_i)P(D_i)}\)

最后等式两边都化简为:

\( P(D_j|x)P(x)=P(x|D_j)P(D_j)\)

贝叶斯分类器通常是基于这样一个假定:“给定目标值的属性之间相互条件独立”。

基于这种“朴素”的假定,贝叶斯公式一般简写为:

\(P(A|B)P(B)=P(B|A)P(A)\)

也称为朴素贝叶斯公式——Naive Bayesian。

  • \(P(A)\)叫做\(A\)事件的先验概率,就是一般情况下,认为\(A\)发生的概率。
  • \(P(B|A)\)叫做似然度,是假设\(A\)条件成立的情况下发生\(B\)的概率。
  • \(P(A|B)\)叫做后验概率,在\(B\)发生的情况下发生\(A\)的概率,也就是要计算的概率。
  • \(P(B)\)叫做标准化常量,和\(A\)的先验概率定义类似,就是一般情况下,\(B\)的发生概率。

天气的预测

天气预报一般是基于天气图,卫星云图和雷达图来做的,预报的内容很多,如降水情况,风力,风向等。

大气变化是混沌的(Chaotic)——这一瞬间的天气情况会由于之后一系列不可预测的扰动行为而变得不可预测。也可以说,即便两个完全一模一样的瞬时大气状况,由于之后一系列不可预测的行为不断进行干扰而产生完全两种截然不同的天气结果。

在长期的研究天气变化的过程中,会发现极端的变化还是少数,大部分的天气变化有一定的规律可循。虽然确实不知道未来大气变化的具体情况,但是还是有一些经验可以借鉴的。如今天天气非常阴沉,那下雨的可能性就是比晴天的时候大很多。

利用统计学知识和手段,从大量的历史数据中可以尝试做出一个贝叶斯分类模型,从而判断出降水概率——依据现在的大气状况,未来24小时降水概率为多少。

为了简化说明过程,示意性只列出一个地区10天中每一天的天气状况。

  • 一个地区10天中每天的天气情况表:
日期天气情况
1
2
3降水
4
5降水
6
7
8多云
9降水
10降水

根据这10天的天气情况来看,10天里面降水4次,也就是降水概率是20%。但是如果当天是阴天呢?阴天的日期为2,4两天,它们的第二天都是降水,所以当天是阴天的情况下,降水概率是100%。如果当天是晴天呢?晴天的日期是1,6,7,而晴天的第二天的天气情况分别是阴,晴,多云,降水概率是0%。

在Python的Scikit-learn库中虽然对朴素贝叶斯分类算法做了实现,但是对于建模针对性的问题,分别做了以下几种贝叶斯分类的变种模型封装:

  1. 高斯朴素贝叶斯(Gaussian Naive Bayes);
  2. 多项式朴素贝叶斯(Multinomial Naive Bayes);
  3. 伯努利朴素贝叶斯(Bernoulli Naive Bayes)。

这三种训练的方式非常相近,引用时所写的代码也非常简短。其中,高斯朴素贝叶斯是利用高斯概率密度公式来进行拟合的。多项式朴素贝叶斯多用于高维度向量分类,最常用的场景是文章分类。伯努利朴素贝叶斯一般是这针对布尔类型特征值的向量做分类的过程。

综上所诉,这里采用高斯朴素贝叶斯为宜,下面给出示例代码:

#高斯朴素贝叶斯预测天气
from sklearn.naive_bayes import GaussianNB

#0:晴 1:阴 2:降水 3:多云
weather={0:'晴',1:'阴',2:'降水',3:'多云'}
data_table=[["date","weather"],
[1,0],
[2,1],
[3,2],
[4,1],
[5,2],
[6,0],
[7,0],
[8,3],
[9,2],
[10,2]]

next=len(data_table)

#当天的天气
X=[]
for i in range(1,(len(data_table)-1)):
    X.append([data_table[i][1]])

#当天的天气对应的后一天的天气
y=[]
for i in range(2,len(data_table)):
    y.append(data_table[i][1])

#把训练数据和对应的分类放入分类器中进行训练
for i in range(3):
    clf=GaussianNB().fit(X,y)
    #由最近一天的天气情况预测明天的天气情况
    p=[[y[len(y)-1]]]
    tmp=clf.predict(p)
    tmp=tmp[0]
    X.append([y[len(y)-1]])
    y.append(tmp)
    data_table.append([next,tmp])
    next+=1

for i in range(1,len(data_table)):
    print(data_table[i][0],end=' ')
    print(':',end=' ')
    print(weather[data_table[i][1]])

预测最近三天的天气,输出结果如下:

预测结果
keyboard_arrow_down


1 : 晴
2 : 阴
3 : 降水
4 : 阴
5 : 降水
6 : 晴
7 : 晴
8 : 多云
9 : 降水
10 : 降水
11 : 降水
12 : 降水
13 : 降水

由此可见,此模型预测未来3天都将下雨。

为了更好的说明问题,下面我们考虑一个更简单化的模型。

  • 一个地区10天中每天的天气情况表:
日期天气情况
1
2
3降水
4多云
5
6
7降水
8多云
9
10

可以看出这个地区的天气情况具有比较明显的规律性。将天气数据带入上述代码,输出结果为:

预测结果
keyboard_arrow_down


1 : 晴
2 : 阴
3 : 降水
4 : 多云
5 : 晴
6 : 阴
7 : 降水
8 : 多云
9 : 晴
10 : 阴
11 : 降水
12 : 多云
13 : 晴
14 : 阴
15 : 降水
16 : 多云
17 : 晴
18 : 阴
19 : 降水
20 : 多云

可以看出,高斯朴素贝叶斯训练很好地找到了样本之间的联系,并准确的预测出了未来10天的天气状况。

在实际的天气预测中,参数要复杂很多,不仅是当天的天气这么一个简单的变量,而且还有温度,湿度,季节,风速等因素,而且统计的日期也是长期的天气样本信息,这些因素的多少直接决定了模型的复杂程度。


疾病的预测

关于罹患疾病的预测——罹患冠心病的概率为20%,罹患阿尔兹海默综合征的概率为5%,罹患帕金森式病的概率为12%等。这些都是通过基因测序得到的预测结论。

这个预测过程也是一个分类过程,训练样本就是大量的个体基因信息和个人的疾病信息。然后通过建模分析,最后得到一个基因片段和罹患疾病之间的概率转换关系,这也是一个比较典型的朴素贝叶斯分类模型。

示意性地做一个训练过程,训练样本如表所示。

  • 训练样本表:
样本人员编号基因片段A基因片段B高血压胆结石
1‘1’‘1’
2‘0’‘0’
3‘0’‘1’
4‘1’‘0’
5‘1’‘1’
6‘1’‘0’
7‘0’‘1’
8‘0’‘0’
9‘1’‘0’
10‘0’‘1’

注意
这种记录是忽略其他建模因素的记录,如这位病患所生活的城市,所从事的工作,是否有烟酒习惯等,这些因素是没有参与建模的,直接假设罹患这些疾病只和基因状况有关。

如果之后有一个用户来做基因测序,测试结果为基因片段A,B分别为1,0,那么他罹患高血压和胆结石这两种疾病的概率分别是多少?

运用朴素贝叶斯公式:

\( P(A|B)=\frac{P(B|A)P(A)}{P(B)}\)
  • 关于公式中的每个值分别代表什么?下面以计算高血压疾病的罹患概率为例:
    1. \(P(A)\)是先验概率,即全局性的高血压罹患概率,在10个人中有3个人患病,即概率为30%。
    2. \(P(B|A)\)是似然度,表示高血压患者中基因是“10”型的患者数量。在3位高血压患者中只有1位患者的基因是“10”型,即概率为33%。
    3. \(P(B)\)是标准化常量,是“10”型基因出现的概率,在10个人中出现了3例,即概率为30%。
    4. \(P(A|B)\)可以代入求解,得到33%。

交叉验证一下,全局中“10”型基因的有3位,即4号,6号和9号。的高血压的只有9号一人,所以高血压的罹患概率是33%。

下面给出训练和分类的代码示例:

#高斯朴素贝叶斯预测罹患概率
from sklearn.naive_bayes import GaussianNB

#基因片段A,基因片段B,高血压,胆结石
#1:是,0:否
data_table=[
[1,1,1,0],
[0,0,0,1],
[0,1,0,0],
[1,0,0,0],
[1,1,0,1],
[1,0,0,1],
[0,1,1,1],
[0,0,0,0],
[1,0,1,0],
[0,1,0,1]]

#基因片段
X=[[1,1],[0,0],[0,1],[1,0],[1,1],[1,0],[0,1],[0,0],[1,0],[0,1]]

#高血压
y1=[1,0,0,0,0,0,1,0,1,0]

#训练
clf=GaussianNB().fit(X,y1)

#预测
p=[[1,0]]
result=[]
result.append(clf.predict(p))

#胆结石
y2=[0,1,0,0,1,1,1,0,0,1]

#巡练
clf=GaussianNB().fit(X,y2)

#预测
result.append(clf.predict(p))

print("基因:",p,"\n罹患高血压:",result[0][0],"\n罹患胆结石:",result[1][0])

输出结果为:

预测结果
keyboard_arrow_down


基因: [[1, 0]]
罹患高血压: 0
罹患胆结石: 0
即表示基因型为[1,0]的这个用户罹患两种疾病的概率都小于50%。


小结

在我看来,贝叶斯的理论体系其实揭示的是一种非常典型的人类自身的推测逻辑行为。

例如,在黄昏的时候走在自己居住的小区里,光线很昏暗,前面突然闪过一个影子,从路一边的草丛蹿到另一边,速度较快体型较大,其他的信息都没有铺捉到。这时候大概会猜测,这有可能是一只较大的家犬。而如果是在非洲大草原上,从越野车里同样看到昏暗的草原上蹿过一个速度较快体型较大的动物,也许会猜测那是一头狮子,或一头猎豹。这两种猜测对于铺捉到的对象信息都是非常有限的,而且内容相近,但是得到的却是两种不同的推测。原因很简单,就是因为当时的环境不同,导致两种事件的概率不同,带有比较明确的倾向性。而这种推断的思路就是贝叶斯理论体系的核心内容。


想了解更多关于大数据和机器学习:

赞赏
本文原作者为Mortal,原文首发于作者CSDN博客。Mortal现已加入本站,本文为Mortal直接发布,如需转载请通过作者CSDN博客或本站联系表单申请授权。

发表评论

textsms
account_circle
email

CAPTCHAis initialing...

大数据与机器学习 基础篇 分类 朴素贝叶斯
分类算法是机器学习中的一个重点,也是人们常说的“有监督的学习”。这是一种利用一系列已知类别的样本来对模型进行训练调整分类器的参数,使其达到所要求性能的过程,也成为监督训练或有教…
扫描二维码继续阅读
2018-05-26