R语言︱贝叶斯网络语言实现及与朴素贝叶斯区别(笔记)

2019-05-26 10:21:32 浏览数 (1)

版权声明:博主原创文章,微信公众号:素质云笔记,转载请注明来源“素质云博客”,谢谢合作!! https://blog.csdn.net/sinat_26917383/article/details/51569573

一、贝叶斯网络与朴素贝叶斯的区别

朴素贝叶斯的假设前提有两个第一个为:各特征彼此独立;第二个为且对被解释变量的影响一致,不能进行变量筛选。但是很多情况这一假设是无法做到的,比如解决文本分类时,相邻词的关系、近义词的关系等等。彼此不独立的特征之间的关系没法通过朴素贝叶斯分类器训练得到,同时这种不独立性也给问题的解决方案引入了更多的复杂性[1]。

此时,更具普遍意义的贝叶斯网络在特征彼此不独立情况下,可进行建模。但是贝叶斯网络并不放宽第二个假设,故不能对变量进行筛选,因为视解释变量的作用一致。

贝叶斯分类方法是一种展现已知数据集属性分布的方法,其最终计算结果完全依赖于训练样本中类别和特征的分布。与SVM等分类方法不同,它只是对事实进行展现。

贝叶斯网络

朴素贝叶斯

假设前提

各变量都是离散型的 各特征有依赖(不确定的因果推理)关系(变量无关) 每一个节点在其直接前驱节点的值制定后,这个节点条件独立于其所有非直接前驱前辈节点。 P(v|par(v),x1,x2...,xn) = P(v|par(v)) 贝叶斯网络放宽了每个变量独立的假设

各特征彼此独立 朴素贝叶斯中对于若干条件概率值不存在的问题,一般通过将所有的概率值加1来解决 且对被解释变量的影响一致,不能进行变量筛选

应用案例

在信息不完备的情况下通过可以观察随机变量推断不可观察的随机变量[1] 解决文本分类时,相邻词的关系、近义词的关系

分类

缺点

不能对变量进行筛选,因为不能放宽对被解释变量影响一致的假设

彼此不独立的特征之间建立朴素贝叶斯,反而加大了模型复杂性

优点

贝叶斯原理和图论相结合,建立起一种基于概率推理的数学模型,对于解决复杂的不确定性和关联性问题有很强的优势 对缺失数据不敏感 可以学习因果关系,加深对数据的理解 能将先验知识融入建模 避免了过度拟合问题,不需要保留数据进行检验【4】

简单,对于给出的待分类项,会选择条件概率最大的类别,这就是朴素贝叶斯的思想基础

  • 对缺失数据不敏感
  • 可以学习因果关系,加深对数据的理解
  • 能将先验知识融入建模
  • 避免了过度拟合问题,不需要保留数据进行检验【4】

简单,对于给出的待分类项,会选择条件概率最大的类别,这就是朴素贝叶斯的思想基础

_______________________________________________________________________________

在python scikit-learn中(20180808更新):

 朴素贝叶斯是一类比较简单的算法,scikit-learn中朴素贝叶斯类库的使用也比较简单。相对于决策树,KNN之类的算法,朴素贝叶斯需要关注的参数是比较少的,这样也比较容易掌握。在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNB,MultinomialNB和BernoulliNB。

其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。

    这三个类适用的分类场景各不相同,一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。如果如果样本特征的分大部分是多元离散值,使用MultinomialNB比较合适。而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。

________________________________________________________________________________________________________________

二、贝叶斯网络概念

贝叶斯网络基本概念有两个:引入了一个有向无环图(Directed Acyclic Graph)和一个条件概率表集合。

DAG。DAG的结点V包括随机变量(类别和特征),有向连接E(A->B)表示结点A是结点B的parent,且B与A是有依赖关系的(不独立)。

条件概率表集合。同时引入了一个条件性独立(conditional independence)概念:即图中任意结点v在给定v的parent结点的情况下,与图中其它结点都是独立的,也就是说P(v|par(v),x1,x2...,xn) = P(v|par(v))。这里par(v)表示v的parent结点集,x1,x2,...,xn表示图中其它结点。

我们清楚,如果已知所有联合概率值(joint distribution),那么任何形式的概率问题都可以迎刃而解。而现实是当特征集合过大(>10)时你几乎无法通过统计得到。而特征集合的大小在"一定程度上"与最终的分类效果是一个正反馈关系。

所以,这个问题的解决就是通过条件独立的概念来对各条件概率值进行优化。具体可以参见参考文件的bayesian net的tutorial,我这里不再阐述了(来自博客分类算法之朴素贝叶斯(Naive Bayes)和贝叶斯网络(Bayesian Networks))。

贝叶斯网络中连线是如何产生的?

本内容来源于CDA DSC,L2-R课程,第11讲。

贝叶斯网络,不再表示因果关系,而是变量之间的相关依赖关系。 X,y之间线代表的就是条件概率,p(y︱x1)︱x2x3x4...=p(y),等于则不连线, 不等于,说明在控制了x2下,两者不是独立,而是相关的,则会连线。

________________________________________________________________________________________________________________

三、贝叶斯网络简单案例

贝叶斯网络原理较为简单,所以在实际应用中较为广泛。比如垃圾邮件的处理,先对垃圾邮件分词,一些垃圾词“培训”、“打折”...,只需要做每个单词在每个文档中出现的频次就可以用贝叶斯网络推断哪一些是垃圾邮件;

也可以用在社会调查中的量表题,

下图表示特征属性之间的关联:

图1

上图是一个有向无环图,其中每个节点代表一个随机变量,而弧则表示两个随机变量之间的联系,表示指向结点影响被指向结点。不过仅有这个图的话,只能定性给出随机变量间的关系,如果要定量,还需要一些数据,这些数据就是每个节点对其直接前驱节点的条件概率,而没有前驱节点的节点则使用先验概率表示。

例如,通过对训练数据集的统计,得到下表(R表示账号真实性,H表示头像真实性):

纵向表头表示条件变量,横向表头表示随机变量。上表为真实账号和非真实账号的概率,而下表为头像真实性对于账号真实性的概率。这两张表分别为“账号是否真实”和“头像是否真实”的条件概率表。有了这些数据,不但能顺向推断,还能通过贝叶斯定理进行逆向推断。例如,现随机抽取一个账户,已知其头像为假,求其账号也为假的概率:

也就是说,在仅知道头像为假的情况下,有大约35.7%的概率此账户也为假。如果觉得阅读上述推导有困难,请复习概率论中的条件概率、贝叶斯定理及全概率公式。如果给出所有节点的条件概率表,则可以在观察值不完备的情况下对任意随机变量进行统计推断。上述方法就是使用了贝叶斯网络。

________________________________________________________________________________________________________________

四、贝叶斯网络实施步骤

[算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)]

1、步骤

构造与训练贝叶斯网络分为以下两步:

1、确定随机变量间的拓扑关系,形成DAG。这一步通常需要领域专家完成,而想要建立一个好的拓扑结构,通常需要不断迭代和改进才可以。

2、训练贝叶斯网络参数——估计出各节点的条件概率表。这一步也就是要完成条件概率表的构造,如果每个随机变量的值都是可以直接观察的,像我们上面的例子,那么这一步的训练是直观的,方法类似于朴素贝叶斯分类。但是通常贝叶斯网络的中存在隐藏变量节点,那么训练方法就是比较复杂,例如使用梯度下降法。由于这些内容过于晦涩以及牵扯到较深入的数学知识,在此不再赘述,有兴趣的朋友可以查阅相关文献。

2、案例

还是SNS社区中不真实账号检测的例子,我们的模型中存在四个随机变量:账号真实性R,头像真实性H,日志密度L,好友密度F。其中H,L,F是可以观察到的值,而我们最关系的R是无法直接观察的。这个问题就划归为通过H,L,F的观察值对R进行概率推理。推理过程可以如下表示:

1、使用观察值实例化H,L和F,把随机值赋给R。 2、计算

(如图1)。其中相应概率值可以查条件概率表。由于上述例子只有一个未知随机变量,所以不用迭代。 ________________________________________________________________________________________________________________

五、TAN树增强朴素贝叶斯

TAN是贝叶斯网络的简化版本。先构造所有变量两两之间的连线(如左图);然后进行剪枝。特点就是,解释变量是平行的,不对变量进行筛选,看做是一致的。(第五点内容的补充来自于CDA DSC L2-R语言课程第11讲内容)

5.1 相对熵

要介绍TAN先从相对熵开始说起。从信息量的角度出发,统计学上认为方差代表数据的信息量;而物理学中,认为熵代表物质的信息量。

相对熵就是度量两个随机变量的距离的一种指标。

其最大的特点就是:可以做到衡量p-q,q-p的影响,可以度量两个随机变量的“距离”、相互之间的影响力。

5.2 TAN贝叶斯网络结构的学习

贝叶斯网络先构造所有变量两两之间的连线(如左图);然后进行剪枝。特点就是,解释变量是平行的,不对变量进行筛选,看做是一致的。

5.3 TAN贝叶斯网络的特点

1、全考虑。在未知关系之前,TAN会建立所有输入变量X与输出变量Y之间的全联系,考虑了所有因素对输出变量Y的影响;

2、X之间非独立。输入变量X之间也会存在弧线,意味着变量之间并非全部条件独立,允许具有相互依赖的关系,突破了朴素贝叶斯的假设;

3、调节效应。输入变量X之间的有向弧线,代表对Y的调节效应,X1对Y的作用,不仅仅是X1,还可能有X1X2之间对Y的作用。

________________________________________________________________________________________________________________

六、R语言-贝叶斯网络/朴素贝叶斯

朴素贝叶斯分类对于缺失值并不敏感。R语言中的e1071包中就有可以实施朴素贝叶斯分类的函数,但在本例我们使用klaR包中的NaiveBayes函数,因为该函数较之前者增加了两个功能,一个是可以输入先验概率,另一个是在正态分布基础上增加了核平滑密度函数[4]。

R语言中可以使用bnlearn包来对贝叶斯网络进行建模。但要注意的是,bnlearn包不能处理混合数据,所以先将连续数据进行离散化(因子型),再进行建模训练。

1、bnlearn包介绍

网上有一个bnlearn包的教程,但是有点乱,笔者看了之后就是一头雾水。所以整理了一下:

该包包含贝叶斯网络的结构学习、参数学习和推理三个方面的功能,其中结构学习包含基于约束的算法、 基于得分的算法和混合算法, 参数学习包括最大似然估计和贝叶斯估计两种方法。

此外还有自助法(bootstrap),交叉验证(cross-validation)和随机模拟(stochastic simulation)等功能,附加的绘图功能需要调用前述的 Rgraphviz and lattice 包。

2、R语言实现案例

博客《朴素贝叶斯分类与贝叶斯网络》有一个案例:数据准备环节

代码语言:javascript复制
# 加载扩展包和数据
library(caret)
data(PimaIndiansDiabetes2,package='mlbench')
# 对缺失值使用装袋方法进行插补
preproc <- preProcess(PimaIndiansDiabetes2[-9],method="bagImpute")
data <- predict(preproc,PimaIndiansDiabetes2[-9])
data$Class <- PimaIndiansDiabetes2[,9]

贝叶斯网络建模

代码语言:javascript复制
# 加载包
library(bnlearn)
# 数据离散化
data2 <- discretize(data[-9],method='quantile')
data2$class <- data[,9]
# 使用爬山算法进行结构学习
bayesnet <- hc(data2)
# 显示网络图
plot(bayesnet)
# 修改网络图中的箭头指向
bayesnet<- set.arc(bayesnet,'age','pregnant')
# 参数学习
fitted <- bn.fit(bayesnet, data2,method='mle')
# 训练样本预测并提取混淆矩阵
pre <- predict(fitted,data=data2,node='class')
confusionMatrix(pre,data2$class)
# 进行条件推理
cpquery(fitted,(class=='pos'),(age=='(36,81]'&mass=='(34.8,67.1]'))

还有一个可以实现的包——pcalg包,来自博客R语言做贝叶斯网络结构学习

该博客主要介绍拓扑结构的构建,贴一个案例:

代码语言:javascript复制
suffStat <-list(C = cor(iris[,1:4]), n = nrow(iris))
pc.fit <- pc(suffStat, indepTest = gaussCItest,
             alpha = 0.01,labels =names(iris[1:4]),verbose = TRUE)
pc.fit
plot(pc.fit)

________________________________________________________________________________________________________________

参考文献:

[1]算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)

[3]算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)

[4]朴素贝叶斯分类与贝叶斯网络:http://www.r-bloggers.com/lang/chinese/1065

0 人点赞