首页 > 编程语言 >贝叶斯网络python实战(以泰坦尼克号数据集为例,pgmpy库)

贝叶斯网络python实战(以泰坦尼克号数据集为例,pgmpy库)

时间:2023-08-02 23:07:45浏览次数:38  
标签:full pgmpy python Rareman 网络 贝叶斯 集为例 Rarewoman

贝叶斯网络python实战(以泰坦尼克号数据集为例,pgmpy库)

leida_wt 2019-03-24 23:05:36 

 16815 

 收藏 140

分类专栏: 机器学习 文章标签: pgmpy 贝叶斯网络 泰坦尼克 机器学习 图网络

版权

 

文章目录


本文的相关数据集,代码见文末百度云

 

贝叶斯网络简介

贝叶斯网络是一种置信网络,一个生成模型。(判别模型,生成模型的区分可以这样:回答p(label|x)即样本x属于某一类别的可能的,就是判别模型,而回答p(x,label) 和p(x|label)的,即回答在给定的类别中找样本x及样本分布情况的,即为生成模型。生成模型给出的联合分布比判别网络能给出更多的信息,对其求边缘分布即可得p(label|x) p(x|label))同时贝叶斯网络还是一个简单的白盒网络,提供了高可解释性的可能。相比于大热的几乎无所不能的深度神经网络,贝叶斯网络仍有他的优势和应用场景。比如在故障分析,疾病诊断里,我们不仅需要回答是不是,更重要的是回答为什么,并给出依据。这样的场景下,以贝叶斯网络为代表的一些可解释好的白盒网络更加有优势。

贝叶斯推断思路

与频率派直接从数据统计分析构建模型不同,贝叶斯派引入一个先验概率,表达对事件的已有了解,然后利用观测数据对先验知识进行修正,如通常把抛硬币向上的概率认为是0.5,这是个很朴素的先验知识,若是实验结果抛出了500-500的结果,那么证明先验知识是可靠的,合适的,若是出现100-900结果,那么先验知识会被逐渐修改(越来越相信这是个作弊硬币),当实验数据足够多的时候,先验知识就几乎不再体现,这时候得到与频率派几乎相同的结果。如图

贝叶斯网络python实战(以泰坦尼克号数据集为例,pgmpy库)_贝叶斯网络

具体例子推导可见here

贝叶斯网络

贝叶斯网络结构如下所示,其是有特征节点和链接构成的有向无环图。节点上是概率P(A),P(B)… 连接上是条件概率P(A|B) P(A|C) … 即若有A指向B的连接,则连接代表的就应为P(B|A),更多信息可参考以下内容,这里不再赘述,贝叶斯网络结构本身不困难,其难点主要在于推理算法等数值计算问题,如为应用则无需深究。

贝叶斯网络发展及其应用综述《贝叶斯网络引论》@张连文

静态贝叶斯网络

贝叶斯网络python实战(以泰坦尼克号数据集为例,pgmpy库)_数据_02

贝叶斯网络的实现

相关工具一直很丰富,matlab,R上都有成熟的工具。这里使用了python下的pgmpy,轻量好用,不像pymc那样容易安装困难。
安装:
conda install -c ankurankan pgmpy

pip install pgmpy

应用步骤

1.先确定以那些变量(特征)为节点,这里还包括由特征工程特征选择之类的工作。当然若有专业知识的参与会得到更合理的特征选择。
2.确定网络结构(拓扑)用以反应变量节点之间的依赖关系。也就是明确图的结构。这里既可以在有专家参与的情况下手工设计,也可以自动找到高效合适的网络,称为结构学习。贝叶斯网络的结构对最终网络性能很关键,若是构建所谓全连接贝叶斯网(即各个变量间两两相连),虽没有遗漏关联,但会导致严重的过拟合,因为数据量很难支撑起全连接直接海量的条件概率。
3.明确每条边上的条件概率。和结构一样,参数也可由专家手工确定(先验),亦可通过数据自动学习(即参数学习),或两者同时进行。
下面以一个经典数据集为例展示如何利用pgmpy包进行贝叶斯网络建模

泰坦尼克数据集背景介绍

ref:https://www.jianshu.com/p/9b6ee1fb7a60
https://www.kaggle.com/c/titanic这是kaggle经典数据集,主要是让参赛选手根据训练集中的乘客数据和存活情况进行建模,进而使用模型预测测试集中的乘客是否会存活。乘客特征总共有11个,以下列出。这个数据集特征明确,数据量不大,很适合应用贝叶斯网络之类的模型来做,目前最好的结果是正确率应该有80+%(具体多少因为答案泄露不好讲了)

PassengerId => 乘客ID
Pclass => 客舱等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 兄弟姐妹数/配偶数
Parch => 父母数/子女数
Ticket => 船票编号
Fare => 船票价格
Cabin => 客舱号
Embarked => 登船港口
在开始建模之前,先进行下特征工程,处理原始数据集的缺项等。这里前面处理主要采用https://www.jianshu.com/p/9b6ee1fb7a60的方法(他应用pandas清理数据的技巧很值得一学),我在他的处理后,进一步进行了一些离散化处理,以使得数据符合贝叶斯网络的要求(贝叶斯网络也有支持连续变量的版本,但因为推理,学习的困难,目前还用的很少),最后保留5个特征。

'''
PassengerId => 乘客ID
Pclass => 客舱等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别 清洗成male=1 female=0
Age => 年龄 插补后分0,1,2 代表 幼年(0-15) 成年(15-55) 老年(55-)
SibSp => 兄弟姐妹数/配偶数
Parch => 父母数/子女数
Ticket => 船票编号
Fare => 船票价格 经聚类变0 1 2 代表少 多 很多
Cabin => 客舱号 清洗成有无此项,并发现有的生存率高
Embarked => 登船港口 清洗na,填S
'''
# combine train and test set.
train=pd.read_csv('./train.csv')
test=pd.read_csv('./test.csv')
full=pd.concat([train,test],ignore_index=True)
full['Embarked'].fillna('S',inplace=True)
full.Fare.fillna(full[full.Pclass==3]['Fare'].median(),inplace=True)
full.loc[full.Cabin.notnull(),'Cabin']=1
full.loc[full.Cabin.isnull(),'Cabin']=0
full.loc[full['Sex']=='male','Sex']=1
full.loc[full['Sex']=='female','Sex']=0

full['Title']=full['Name'].apply(lambda x: x.split(',')[1].split('.')[0].strip())
nn={'Capt':'Rareman', 'Col':'Rareman','Don':'Rareman','Dona':'Rarewoman',
    'Dr':'Rareman','Jonkheer':'Rareman','Lady':'Rarewoman','Major':'Rareman',
    'Master':'Master','Miss':'Miss','Mlle':'Rarewoman','Mme':'Rarewoman',
    'Mr':'Mr','Mrs':'Mrs','Ms':'Rarewoman','Rev':'Mr','Sir':'Rareman',
    'the Countess':'Rarewoman'}
full.Title=full.Title.map(nn)
# assign the female 'Dr' to 'Rarewoman'
full.loc[full.PassengerId==797,'Title']='Rarewoman'
full.Age.fillna(999,inplace=True)
def girl(aa):
    if (aa.Age!=999)&(aa.Title=='Miss')&(aa

标签:full,pgmpy,python,Rareman,网络,贝叶斯,集为例,Rarewoman
From: https://blog.51cto.com/u_11908275/6943779

相关文章

  • Python教程(6)——Python变量的基础类型。|整数类型|浮点数类型|字符串类型|布尔类型|
    学习编程语言,不得不忽视变量这个概念。Python中的变量是用于存储数据的名称,你可以将值赋给变量,并在程序的其他地方使用该变量来引用该值。变量在程序中起到存储和操作数据的作用。如果学过C/C++语言的同学,定义了变量后,需要加个类型的限制,比如intage=28doublemoney=10.2......
  • 高效Python-2-1 剖析(Profiling 性能分析)
    2从内置功能中获取最高性能本章包括剖析代码以发现速度和内存瓶颈更有效地利用现有的Python数据结构了解Python分配典型数据结构的内存成本使用懒编程技术处理大量数据有很多工具和库可以帮助我们编写更高效的Python。但是,在我们深入研究提高性能的所有外部选项之前,让我......
  • 反射机制--python
    引用:https://www.cnblogs.com/vipchenwei/p/6991209.htmlhttps://www.cnblogs.com/vipchenwei/p/6991209.html 1.反射是什么:反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)......
  • python-glob查找特定文件
    python-glob查找特定文件目录python-glob查找特定文件只用到三个匹配符glob.globglob.iglob案例当前路径下所有py文件当前路径文件tmp下py文件glob模块可以查找当前脚本目录(相对路径)下或者某一指定目录(绝对路径)符合特定规则的文件路径名glob文件名模式匹配,不用遍历整个目录判......
  • python-sys模块
    python-sys模块目录python-sys模块sys.versionsys.argvsys.platformsys.modulessys.path参考资料"sys"即"system","系统"。该模块提供了一些接口,用于访问Python解释器自身使用和维护的变量,不是主机操作系统。sys.argv #获取命令行参数列表,第一个元素是程序本身sys.ex......
  • Python基础day57 Django模板继承和模型层
    模板之标签就是在模板里面使用流程控制:if、else、elseif、for标签看起来是这样的:{%tag%}for标签{%forpersoninperson_list%}{{forloop}}<p>{{person.name}}</p>{%endfor%}{%forpersoninperson_list%}{#判断list是否有值,没有就走empty#}......
  • 【python_3】PyCharm开发工具的安装和基础使用!
    前言Python程序的开发有许多种方式,一般常见的:python解释器环境内,执行单行代码;使用python解释器程序,执行python代码文件;使用第三方IDE(集成开发工具),如PyCharm软件,开发python程序;1.下载pycharm官网:https://www.jetbrains.com/2.安装点击next:点击next:点击next:点击next:点击Install......
  • 基础阶段python小总结暨下个阶段预习
    基础阶段基本与函数基本已经截至了,这些很简单,资料很多,当然我个人的更新的不是很全,只能做一个参考。下个阶段class预习简单做一个学生通信管理系统。任务说明:"学生信息管理系统v1.0""【1】、添加学生信息""【2】、删除学生信息""【3】、修改学生信息""【4......
  • python中发送测试报告邮件
    要在Python中发送测试报告邮件,可以使用smtplib和email库来实现。以下是简单的代码,以qq邮箱为例,注:邮箱密码得事先申请,如下:先开启服务,之后再申请(需绑定一手机号)代码如下:importsmtplibfromemail.mime.textimportMIMETextfromemail.mime.multipartimportMIMEMultipartfromem......
  • python3 番外篇之Linux环境安装问题
    问题一、Linux主机openSSL版本较老[root@zabbix-serveralertscripts]#python3feishu.pyTraceback(mostrecentcalllast):File"feishu.py",line3,in<module>importrequestsFile"/usr/local/python3.8/lib/python3.8/site-packages/reque......