1 研究背景与意义

心脏病,一种严重危害人类健康的疾病,正日渐成为全球公共卫生问题的重要一环。根据世界卫生组织的数据,心脏病已经成为全球范围内导致死亡的首要原因。在25-69岁的人群中,大约有四分之一的人会因为心脏病而失去生命。在所有年龄段考虑,心脏病大约占所有死亡的19%,无论性别和地域,心脏病都是一大致命威胁。例如,在印度,心脏病引起的死亡比例在南部最高(25%),在中部最低(12%)。

然而,在这个大数据和人工智能高度发展的时代,如何利用先进的计算机科学技术预测心脏病,成为了一个具有挑战性的研究课题。通过预测模型,我们不仅可以提前预知疾病发生的可能性,更可以为医疗健康管理提供有力支持,帮助医疗工作者制定有效的预防策略,以减少患病风险,提高生活质量,甚至挽救生命。

因此,探索如何构建一个有效的基于机器学习的心脏病预测系统,以及如何通过数据可视化技术使得这一系统更加直观易用,具有重大的理论和实践价值。本文便是在这一背景下展开研究,希望通过深入研究和实践,为心脏病预测分析提供一种新的科学方法。

2 数据收集与处理

本研究所使用的心脏病预测系统的数据集来自医院中的样本病例,这些病例主要包含十余个特征值以及相应的患者信息。具体的数据格式如下图所示:

图3.1  心脏病患者数据集

此数据集包含303项患者数据,总共14列特征值。下面对这些特征值的含义进行简述:

age:年龄

sex:性别(1代表男性,0代表女性)

cp:胸部疼痛情况(1:典型心绞痛;2:非典型心绞痛;3:没有心绞痛;4:无症状)

trestbps:静息血压

chol:胆固醇

fbs:空腹血糖>120mg/dl (1:true;2:false)

restecg:静息心电图测量(0:普通;1:ST-T波异常;2:左心室肥大)

thalach:最高心跳率

exang:运动诱发心绞痛(1:yes;2:no)

oldpeak:运动相对于休息引起的ST抑制

slope:运动ST段的峰值斜率(1:上坡;2:平的;3:下坡)

ca:主要血管数目(0、1、2、3、4)

thal:一种血液疾病(1:正常;2:固定缺陷;3:可逆缺陷)

target:是否患病(1:yes;2:no)

这些特征值提供了丰富的信息,有助于更准确地预测心脏病的发生情况。

3 心脏病预测系统设计

3.1系统设计

心脏病预测系统的整体架构设计以数据驱动为核心,流程如下:

数据分析与可视化:首先,系统对提供的数据集进行深度分析。这一阶段不仅包括基本的数据清洗和预处理,也通过可视化工具(例如,柱状图、饼图、条形图、热力图等)展示数据的基本特性与潜在模式。

数据划分与模型建立:在完成初步的数据分析之后,系统将数据集按照75%训练与25%测试的比例进行划分。然后,利用K近邻算法在训练数据上建立预测模型。

用户交互界面:为了方便用户使用,系统提供了一个交互界面。用户可以在此界面输入特征信息,然后系统会基于前述的预测模型,对这些特征信息进行预测。

结果展示:最后,系统将预测结果在界面上展示出来,以便用户直观地理解预测结果。

以上四个步骤构成了心脏病预测系统的核心流程,实现了从数据输入到结果输出的全过程。流程图如下图所示。

图3.1  系统流程图

3.2 数据分析与可视化

首先系统会对患病分布进行分析,针对 target列,统计有多少人患病,有多少人没患病,绘制条形图和饼图。首先.value_count)能统计出target例列每一个唯一值出现了多少次。其中1表示患病,出现了165次,0表示没患病,出现了138次。我们对患病情况绘图可视化。pandas中若对象为Series和DataFrame,可以直接在变量名后面跟.plot()进行绘制。在绘制饼图pie'时也可以指定参数ax=axes[1],表示画在画布的第二个位置。

图3.2  患病分布可视化图

其次会分析性别与患病的分布。绘制条形图,x轴代表性别,y轴代表人数,其中男性和女性分成患病的和没患病的。使用seaborn库画图,其中.countplot()绘图函数,自动计算性别sex中的人数,以sex的种类分x轴刻度,每个x轴下又以target进行划分,返回axes对象,data代表绘图所需的数据,ax=ax1表示这张图的绘图位置。根据是否患病绘制饼图,即在患病的人中男性和女性分别占了百分之几,以及在没患病的人中男性和女性分别占比多少。其中

heart_dfheart_dfitarget]==0]表示找出所有没有患病(target为0)的所有的行,然后sex为找到指定所有没患病的数据中的sex特征列,最后.value_counts()函数自动计算该列中所有唯一值出现的次数。

图3.3  性别与患病分布可视化图

第三步会进行年龄与患病的分析,首先我们先笼统的看一下年龄与患病的条形图,以数据中出现的所有年龄的唯一值分x轴刻度,每个x轴又以target进行划分成患病和没患病。如果笼统的将每个年龄都分一个x轴刻度,会非常混乱,因此我们再来划分一下年龄段。由于该数据中,年龄最小为29,最大为77,因此我们划分[0,45]为青年,[45,59]为中年,60以上为老年。

图3.4  年龄与患病分析可视化图

我们完成了年龄的划分,现在需要将划分好的年龄段,与是否患病拼接在一起。绘制条形图:每个年龄段患病和没患病的分别有多少人;绘制饼图:患病的人中三个年龄段的占比,以及在没患病的人中三个年龄段的占比。   

图3.5  年龄与患病关系可视化图

      最后一步分析特征之间的关联性,在pandas库中我们可以使用函数.corr()来查看每个特征之间的相互关系。相关性分析:相关性系数rl在[0,0.3]是低相关,在[0,0.8]是中相关,在[0.8,1]高度相关,低度相关可以认为是特征值独立的,获得相关关系后我们可以通过热力图的方式来将这种关系可视化。

图3.6  特征值关系热力图

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐