CDA数据分析师出品
作者:Mika
数据:真达
后期:Mika
手把手教你如何用python写出心血管疾病预测模型。
全球每年约有万人死于心血管疾病,当中主要表现为心肌梗死和心力衰竭。当心脏不能泵出足够的血液来满足人体的需要时,就会发生心力衰竭,通常由糖尿病、高血压或其他心脏疾病引起。
在检测心血管疾病的早期症状时,机器学习就能派上用场了。通过患者的电子病历,可以记录患者的症状、身体特征、临床实验室测试值,从而进行生物统计分析,这能够发现那些医生无法检测到的模式和相关性。
尤其通过机器学习,根据数据就能预测患者的存活率,今天我们就教大家如何用Python写一个心血管疾病的预测模型。
研究背景和数据来源
我们用到的数据集来自DavideChicco和GiuseppeJurman发表的论文:《机器学习可以仅通过血肌酐和射血分数来预测心力衰竭患者的生存率》。
他们收集整理了名心力衰竭患者的医疗记录,这些患者数据来自年4月至12月间巴基斯坦费萨拉巴德心脏病研究所医院。这些患者由名女性和名男性组成,年龄在40至95岁之间。所有例患者均患有左心室收缩功能不全,并曾出现过心力衰竭。
Davide和Giuseppe应用了多个机器学习分类器来预测患者的生存率,并根据最重要的危险因素对特征进行排序。同时还利用传统的生物统计学测试进行了另一种特征排序分析,并将这些结果与机器学习算法提供的结果进行比较。
他们分析对比了心力衰竭患者的一系列数据,最终发现根据血肌酐和射血分数这两项数据能够很好的预测心力衰竭患者的存活率。
今天我们就教教大家,如果根据这共13个字段的条病人诊断记录,用Python写出预测心力衰竭患者存活率的预测模型。
下面是具体的步骤和关键代码。
01、数据理解
数据取自于kaggle平台分享的心血管疾病数据集,共有13个字段条病人诊断记录。具体的字段概要如下:
02、数据读入和初步处理
首先导入所需包。
#数据整理
importnumpyasnp
importpandasaspd
#可视化
importmatplotlib.pyplotasplt
importseabornassns
importplotlyaspy
importplotly.graph_objsasgo
importplotly.expressaspx
importplotly.figure_factoryasff
#模型建立
fromsklearn.linear_modelimportLogisticRegression
fromsklearn.treeimportDecisionTreeClassifier
fromsklearn.ensembleimportGradientBoostingClassifier,RandomForestClassifier
importlightgbm
#前处理
fromsklearn.preprocessingimportStandardScaler
#模型评估
fromsklearn.model_selectionimporttrain_test_split,GridSearchCV
fromsklearn.metricsimportplot_confusion_matrix,confusion_matrix,f1_score
加载并预览数据集:
#读入数据
df=pd.read_csv(./data/heart_failure.csv)
df.head()
03、探索性分析
1.描述性分析
df.describe().T
从上述描述性分析结果简单总结如下:
是否死亡:平均的死亡率为32%;年龄分布:平均年龄60岁,最小40岁,最大95岁是否有糖尿病:有41.8%患有糖尿病是否有高血压:有35.1%患有高血压是否抽烟:有32.1%有抽烟2.目标变量
#产生数据
death_num=df[DEATH_EVENT].value_counts()
death_num=death_num.reset_index()
#饼图
fig=px.pie(death_num,names=index,values=DEATH_EVENT)
fig.update_layout(title_text=目标变量DEATH_EVENT的分布)
py.offline.plot(fig,filename=./html/目标变量DEATH_EVENT的分布.html)
总共有人,其中随访期未存活人数96人,占总人数的32.1%
3.贫血
从图中可以看出,有贫血症状的患者死亡概率较高,为35.66%。
bar1=draw_categorical_graph(df[anaemia],df[DEATH_EVENT],title=红细胞、血红蛋白减少和是否存活)
bar1.render(./html/红细胞血红蛋白减少和是否存活.html)
4.年龄
从直方图可以看出,在患心血管疾病的病人中年龄分布差异较大,表现趋势为年龄越大,生存比例越低、死亡的比例越高。
#产生数据
surv=df[df[DEATH_EVENT]==0][age]
not_surv=df[df[DEATH_EVENT]==1][age]
hist_data=[surv,not_surv]
group_labels=[Survived,NotSurvived]
#直方图
fig=ff.create_distplot(hist_data,group_labels,bin_size=0.5)
fig.update_layout(title_text=年龄和生存状态关系)
py.offline.plot(fig,filename=./html/年龄和生存状态关系.html)
5.年龄/性别
从分组统计和图形可以看出,不同性别之间生存状态没有显著性差异。在死亡的病例中,男性的平均年龄相对较高。
6.年龄/抽烟
数据显示,整体来看,是否抽烟与生存与否没有显著相关性。但是当我们