1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 贝叶斯网络分析kaggle泰坦尼克号数据

贝叶斯网络分析kaggle泰坦尼克号数据

时间:2023-10-19 22:53:16

相关推荐

贝叶斯网络分析kaggle泰坦尼克号数据

贝叶斯网络分析kaggle泰坦尼克号(Titanic)

一、数据处理

1.原始数据分析

主要是让参赛选手根据训练集中的乘客数据和存活情况进行建模,进而使用模型预测测试集中的乘客是否会存活。乘客特征总共有11个,以下列出。当然也可以根据情况自己生成新特征,这就是特征工程(feature engineering)要做的事情了。

PassengerId => 乘客ID

Pclass => 客舱等级(1/2/3等舱位)

Name => 乘客姓名

Sex => 性别

Age => 年龄

SibSp => 兄弟姐妹数/配偶数

Parch => 父母数/子女数

Ticket => 船票编号

Fare => 船票价格

Cabin => 客舱号

Embarked => 登船港口

2.数据清洗

数据集合并

#合并训练集train和测试集testtrain=pd.read_csv('./train.csv')test=pd.read_csv('./test.csv')full=pd.concat([train,test],ignore_index=True)

查找缺失值

full.isnull().sum()

从缺失值来看,Embarked(登船港口)和Fare(船票价格)缺失值较少,Age与Cabin(客舱号)缺失较多,可能该特征对结果有较大的影响,将年龄与Cabin视作特征。

Age缺失值处理

full['Title']=full['Name'].apply(lambda x: x.split(',')[1].split('.')[0].strip())full.Title.value_counts()def girl(aa):if (aa.Age!=999)&(aa.Title=='Miss')&(aa.Age<=14):return 'Girl'elif (aa.Age==999)&(aa.Title=='Miss')&(aa.Parch!=0):return 'Girl'else:return aa.Titlefull['Title']=full.apply(girl,axis=1)Tit=['Mr','Miss','Mrs','Master','Girl','Rareman','Rarewoman']for i in Tit:full.loc[(full.Age==999)&(full.Title==i),'Age']=full.loc[full.Title==i,'Age'].median()

先根据‘Name’提取‘Title’,再用‘Title’的中位数对‘Age‘进行插补.先假设little girl都没结婚(一般情况下该假设都成立),所以little girl肯定都包含在Miss里面。little boy(Master)的年龄最大值为14岁,所以相应的可以设定年龄小于等于14岁的Miss为little girl。

至此数据缺失值处理完毕。

3.数据可视化

性别对获救情况的影响

pd.crosstab(full.Sex,full.Survived).plot.bar(stacked=True,figsize=(8,5),color=['#4169E1','#FF00FF'])plt.xticks(rotation=0,size='large')plt.legend(bbox_to_anchor=(0.55,0.9))

可以认为女性获救的概率大于男性获救的概率,将性别作为特征值。

客舱等级与获救的关系

可以认为客舱等级对结果产生了影响,将客舱等级看做特征值。

4.特征工程

最后保留如下项目,并切出800的训练集:

Pclass => 客舱等级(0/1/2等舱位)

Sex => 性别 male=1 female=0

Age => 年龄 插补后分0,1,2 代表 幼年(0-15) 成年(15-55) 老年(55-)

Fare => 船票价格 经聚类变0 1 2 代表少 多 很多

Cabin => 客舱号 清洗成有无此项,并发现有的生存率

Tit=['Mr','Miss','Mrs','Master','Girl','Rareman','Rarewoman']for i in Tit:full.loc[(full.Age==999)&(full.Title==i),'Age']=full.loc[full.Title==i,'Age'].median()full.loc[full['Age']<=15,'Age']=0full.loc[(full['Age']>15)&(full['Age']<55),'Age']=1full.loc[full['Age']>=55,'Age']=2full['Pclass']=full['Pclass']-1from sklearn.cluster import KMeansFare=full['Fare'].valuesFare=Fare.reshape(-1,1)km = KMeans(n_clusters=3).fit(Fare) #将数据集分为2类Fare = km.fit_predict(Fare)full['Fare']=Farefull['Fare']=full['Fare'].astype(int)full['Age']=full['Age'].astype(int)full['Cabin']=full['Cabin'].astype(int)full['Pclass']=full['Pclass'].astype(int)full['Sex']=full['Sex'].astype(int)#full['Survived']=full['Survived'].astype(int)dataset=full.drop(columns=['Embarked','Name','Parch','PassengerId','SibSp','Ticket','Title'])dataset.dropna(inplace=True)dataset['Survived']=dataset['Survived'].astype(int)#dataset=pd.concat([dataset, pd.DataFrame(columns=['Pri'])])train=dataset[:800]test=dataset[800:]

最后拿来的训练集train如下:

二、贝叶斯网络搭建

1.设计贝叶斯网络

from pgmpy.models import BayesianModelfrom pgmpy.estimators import BayesianEstimator#model = BayesianModel([('Age', 'Pri'), ('Sex', 'Pri'),('Pri','Survived'),('Fare','Pclass'),('Pclass','Survived'),('Cabin','Survived')])model = BayesianModel([('Age', 'Survived'), ('Sex', 'Survived'),('Fare','Pclass'),('Pclass','Survived'),('Cabin','Survived')])

凭借对特征的理解,构建上图所示的有向图模型。

2.参数导入

model.fit(train, estimator=BayesianEstimator, prior_type="BDeu")

至此,模型构建完毕,开始进行推理。

3.推理

from pgmpy.inference import VariableEliminationmodel_infer = VariableElimination(model)q = model_infer.query(variables=['Survived'], evidence={'Fare': 0})print(q['Survived'])

得到一个Fare = 0时,P(Survived|Fare =0)的概率分布表。

4.预测

predict_data=test.drop(columns=['Survived'],axis=1)y_pred = model.predict(predict_data)print((y_pred['Survived']==test['Survived']).sum()/len(test))

得到预测的精度为:0.8131868131868132

泰坦尼克号数据下载

三、问题

概率图,贝叶斯网络的预测精度提升方法?当特征随机变量的值过多的时候,是否能通过概率图模型推理出精度较高的模型?

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。