Advertisement

贝叶斯网络python实现_朴素贝叶斯和贝叶斯网络算法及其R语言实现

阅读量:

原标题:朴素贝叶斯和贝叶斯网络算法及其R语言实现

作者:鲁伟

作为一位数据科学家实践者的学习笔记。作为一位认真践行的数据科学家,在探索数据分析技术的过程中发现了一种独特的平衡点——将理论知识与实际应用相结合,并非易事也非捷径。在探索过程中掌握了一定的数据分析能力,并将其转化为日常思考的一部分。个人公众号:数据科学家成长记 (微信ID:louwill12)

最近与数据挖掘领域积极互动,在过去几个月内始终致力于启动了一个 previously设定好的机器学习算法研究项目。鉴于未来的研究方向倾向于机器学习领域,扎实掌握算法实现细节对职业发展至关重要。其理论基础坚实且在实际应用中表现突出,在贝叶斯方向上起步较早的原因之一是因为贝叶斯分类器中的核心概念相对容易理解。然而经过长时间努力尝试后仍未完全掌握其中关键细节。这篇文章旨在系统地向读者介绍贝叶斯分类器中的两个核心方法:朴素贝叶斯与条件独立网络模型(Bayesian Network),并展示如何利用R语言实现这些方法的基本框架。

小编最近在怼的data mining:

目录

⊙ 朴素贝叶斯分类器及R实现

⊙ 贝叶斯网络及R实现

⊙ 朴素贝叶斯与贝叶斯网络的区别

朴素贝叶斯分类器

可以说成一种较为简单的机器学习算法。然而尽管听起来可能有些过于简化但它背后的基本思想却非常直接。这种算法的核心假定了数据集中的所有特征在模型中具有同等的重要性并且各特征之间相互独立。从理论层面来看在进行分类任务时我们需要计算在给定某特定属性条件下各类别出现的可能性并选择概率最大的那一类作为预测结果。举个例子如果我问你一位NBA球员在一场比赛中拿到了30个篮板球那么我们通常会认为他是哪种类型的球员呢?因为大多数情况下这样的表现力主显示了一位内线球员的能力尤其是中锋由于身材高大能够在内线位置上有较高的得分效率当然也有少数例外情况可能会有其他可能性但基于现有信息我们会选择条件概率最高的类别这就是朴素贝叶斯的基本思想依据。

朴素贝叶斯的分类过程如图所示,图片来自:

http://www.cnblogs.com/leoo2sk/archive/2010/09/17/naive-bayesian-classifier.html

通过查看图形可以看出,贝叶斯分类器包含三个主要步骤其包括:准备期、训练期和应用期。

该阶段的任务在于为朴素贝叶斯分类做好必要准备。主要工作包括根据具体情况识别特征属性,并对其做出合理划分。随后由人工对部分待分类项进行初步分类,生成训练样本集。该阶段的输入数据包括所有待分类项,输出结果包括识别出的特征属性和构建的训练样本集合。

在分类训练阶段的任务中,则旨在构建一个能够区分不同类别的模型。具体而言,在这一过程中需要完成两个主要任务:一是计算各分类别在训练集中的发生频率;二是分析各特征分割对于各类别条件概率的判别作用。其中准确估计各类的条件概率对于模型性能提升具有重要意义。其输入为特征属性与原始数据集信息;最终所得产物即为待建立的分类器。(公式不好打,则省略相关公式)

应用阶段就完全交给程序来运行吧,并将训练好的分类器用R或Python进行部署。

下面来看看朴素贝叶斯简单的在R语言中的实现。

在R语言中,位于机器学习领域的e1071和klaR两个软件包均提供了NaiveBayes函数以实现朴素贝叶斯分类功能。本文将重点探讨e1071软件包中的分类功能,并采用该软件包下的HouseVotes84数据集作为研究案例进行分析。该数据集源自mlbench库,并包含美国国会9种不同的投票类型记录

先简单看下它的数据结构:

使用naiveBayes( )函数进行朴素贝叶斯建模:

model

model

Naive Bayes Classifier for Discrete Predictors

Call:

naiveBayes.default(x = X, y = Y, laplace = laplace)

A-priori probabilities:(类先验概率)

Y

democrat republican

0.6137931 0.3862069

Conditional probabilities:(V1-V16的类条件概率)

V1

Y n y

democrat 0.3953488 0.6046512

republican 0.8121212 0.1878788

(V2-V16类条件概率省略)

#进行分类预测

predict(model,HouseVotes84[1:10,],type="raw")

democrat republican

[1,] 1.029209e-07 9.999999e-01

[2,] 5.820415e-08 9.999999e-01

[3,] 5.684937e-03 9.943151e-01

[4,] 9.985798e-01 1.420152e-03

[5,] 9.666720e-01 3.332802e-02

[6,] 8.121430e-01 1.878570e-01

[7,] 1.751512e-04 9.998248e-01

[8,] 8.300100e-06 9.999917e-01

[9,] 8.277705e-08 9.999999e-01

[10,] 1.000000e+00 5.029425e-11

由上面的预测概率表可知,前10个记录的预测分类为

第1个位置上的共和党连续出现三次并伴随民主党连续出现三次,在第7个位置上则呈现出一个共和党的单一实例

贝叶斯网络及R实现

贝叶斯网络(BNN)基本概念有两个:

一个有向无环图(Directed Acyclic Graph)和一个条件概率表集合。

DAG中的每个节点V代表随机变量(类别与特征),有向边E(A→B)表明节点A是节点B的父亲节点,并且这些节点之间存在依赖关系(不独立)。在构建模型时,在给定父节点的信息后(即已知父节 点的状态下),任何单个目标变量与其他所有非父变量均呈现条件独立性。其中父节 点集par(V)表示所有直接连接到V的所有父节 点;而X₁,X₂,…,Xₙ则代表图中的其他所有非父节 点。

贝叶斯网络的建模一般包括两个步骤:

(1) 构建网络架构;(2) 计算每个节点的概率数值。基于程序算法设计的网络拓扑结构能够被获取到。当确定合适拓扑结构后,相关节点的概率分布也就被确定下来了.其估计方法类似于朴素贝叶斯分类器的方法.

使用R语言中的bnlearn包可对贝叶斯网络进行建模。需要注意的是该包无法处理混合数据类型,请确保所有输入均为单一类型后再操作。因此需要先将连续变量转化为因子型数据后再开展建模过程。该软件包的主要功能涵盖结构学习、参数估计以及推理模块,并附有详细流程图说明。

本例基于mlbench包中的PimaIndiansDiabetes2数据集来探讨糖尿病诊断问题。考虑到该数据集中存在较多的缺失记录,在构建贝叶斯网络模型之前,我们采用袋装法来补充缺失样本。

#加载扩展包和数据

library(caret)

data(PimaIndiansDiabetes2,package="mlbench")

#装袋法对缺失值插补

preproc

data

data$Class

然后对填补后的数据集进行训练:

#贝叶斯网络建模

library(bnlearn)

#数据离散化

data2

data2$class

#爬山算法学习结构

bayesnet

#显示网络图

plot(bayesnet)

#修改网络图中的箭头指向

bayesnet

plot(bayesnet)

拓扑结构如图:

然后利用bn.fit( )函数进行参数学习:

#参数学习

fitted

#训练样本预测并提取混淆矩阵

pre

#进行条件推断

cpquery(fitted,(class=="pos"),(age=="(36,81]"&mass=="(34.8,67.1]"))

[1] 0.5934619

基于给定的条件和结果推导,在年龄介于36至81岁之间以及mass值落在34.8至67.1之间的个体患上糖尿病的概率为59.34619%

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

不想写了,一图流:

总结

贝叶斯分类器是一种基于属性集和类变量的概率关系建立模型的方法。在对类条件概率进行估计时,我们有两种贝叶斯分类器的具体实现方式:即朴素贝叶斯方法和贝叶斯网络模型。本文介绍了基本概念,并将其在R语言中进行了基本实现和测试验证。之后我会持续更新更多关于算法学习与编程实践的内容,欢迎关注。

文末放一张昨晚小编做贝叶斯分类题的草稿哈哈哈:

公众号后台回复关键字即可学习

回复 RR语言快速入门免费视频

回复 统计统计方法及其在R中的实现

回复 用户画像民生银行客户画像搭建与应用

回复 大数据大数据系列免费视频教程

回复 可视化利用R语言做数据可视化

回复 数据挖掘数据挖掘算法原理解释与应用

回复 机器学习R&Python机器学习入门 返回搜狐,查看更多

责任编辑:

全部评论 (0)

还没有任何评论哟~