机器学习算法构建预测心血管疾病模型
文章目录
-
引言
-
数据构建模型
-
1.导入库模块
-
数据导入与加载过程
-
数据清洗流程
-
特征工程设计
-
数据可视化与分析阶段
-
模型准备及训练步骤
-
随机森林模型构建与优化方法
-
模型优化及评估流程
-
结果展示分析
- 总结
前言
心血管疾病已成为当今世界范围内重要的公共健康挑战。其发病率及死亡率持续攀升,在全球范围内持续升高。受生活方式变化、环境因素影响以及人口老龄化加剧等因素推动下,心血管疾病的发病趋势日益严峻。本文旨在利用机器学习算法开发预测性模型来识别潜在的心血管疾病风险。
一、数据收集

id 账号
Age | Objective Feature | 年龄 以天为单位
Height | Objective Feature | 记录日期信息 | height | int (cm) 身高
Weight | Objective Feature | weight | float (kg) 体重
Gender | Objective Feature | gender | categorical code 性别
Systolic blood pressure | Examination Feature | ap_hi | int 收缩压
Diastolic blood pressure | Examination Feature | ap_lo | int 舒张压
Cholesterol status | Examination Feature 分析指标值是否正常?| cholesterol status 1: normal, 2: above normal, 3: well above normal 是否正常?
Blood glucose level status| Examination Feature 分析血糖结果是否正常?| gluc status 1: normal, 2: above normal, 3: well above normal 是否正常?
Smoking history| Subjective Feature 吸烟情况如何?| smoke history binary 是/否 是否吸烟
Alcohol intake frequency| Subjective Feature 酒精摄入频率如何?| alco frequency binary 是/否 酒精摄入情况
Physical activity level| Subjective Feature 物体活动强度如何?| active level binary 是/否 体力活动情况
Cardiovascular disease presence or absence| Target Variable 心血管疾病是否存在?| cardiovascular disease presence or absence binary 是/否 是否患有心血管疾病
二、模型构建
1.引入库
代码如下(示例):
import warnings
warnings.filterwarnings('ignore')
import numpy as np
import pandas as pd
from sklearn import metrics, preprocessing
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.svm import SVC
from sklearn.metrics import classification_report
from sklearn.preprocessing import LabelEncoder
import matplotlib.pyplot as plt
import seaborn as sns
c

2.数据导入加载
随后导入所需的数据集,并对其进行初步的数据探索分析。涵盖查看该数据集的统计数据概述以及各特征的具体分布情况等信息。
代码如下(示例):
d = pd.read_csv('D:/Anconda/xinxueguan1.csv')
d.head()
d.info()
print(d.isnull().sum())
c
import语句导入需要的库和模块。 使用pd.read_csv()载入数据集。
d.head()和d.info()用于查看数据的前几行和基本信息(列数、非空值等)。
d.isnull().sum()检查并打印出每列的缺失值数量。
3.数据清洗
在审阅数据时去除错误、重复或无效的数据项
d.drop(d[(d['height'] > d['height'].quantile(0.975)) | (d['height'] < d['height'].quantile(0.025))].index,inplace=True)
d.drop(d[(d['weight'] > d['weight'].quantile(0.975)) | (d['weight'] < d['weight'].quantile(0.025))].index,inplace=True)
d.drop(d[(d['ap_hi'] > d['ap_hi'].quantile(0.975)) | (d['ap_hi'] < d['ap_hi'].quantile(0.025))].index,inplace=True)
d.drop(d[(d['ap_lo'] > d['ap_lo'].quantile(0.975)) | (d['ap_lo'] < d['ap_lo'].quantile(0.025))].index,inplace=True)
len(d)
d[d['ap_lo'] > d['ap_hi']].shape[0]
d.describe()
d['age'] = (d['age'] / 365).round().astype('int')
c
- 这部分代码执行数据清洗操作,并去除身高、体重、收缩压及舒张压等异常值。
- 统计数据集的大小后识别并统计收缩压高于舒张压的数据样本数量。
- 生成并展示数据集的描述性统计信息。
- 将年龄列中的时间单位由天转换为年,并将其数值类型调整为整数。
4.特征工程
选择、修改或创建新的特征,以提高模型的性能。
代码如下(示例):
age_edges = [30, 35, 40, 45, 50, 55, 60, 65]
age_labels = [0, 1, 2, 3, 4, 5, 6]
d['age_group'] = pd.cut(d['age'], bins=7, labels=range(7), include_lowest=True, right=True)
d['bmi'] = d['weight'] / ((d['height'] / 100) ** 2)
bmiMin = int(d['bmi'].min())
bmiMax = int(d['bmi'].max())
d['bmi'] = pd.cut(d['bmi'], bins=6, labels=range(6), right=True, include_lowest=True)
d['map'] = ((2 * d['ap_lo']) + d['ap_hi']) / 3
mapMin = int(d['map'].min())
mapMax = int(d['map'].max())
d['map'] = pd.cut(d['map'], bins=6, labels=range(6), right=True, include_lowest=True)
c

- 为不同年龄段设定分组边界及标签,并基于年龄进行分类生成age_group列。
- 计算并生成BMI(体质指数)列,并按照数值范围进行分段处理。
- 计算并生成MAP(平均动脉压)列,并根据数值区间进行分类处理。
5.数据可视化和分析
通过图表和可视化方法深入分析数据,识别数据中的规律性、增长趋势以及相互关系,并应用统计方法以全面解析数据的深层含义。
代码如下(示例):
plt.figure(figsize=(10, 8))
sns.heatmap(d.corr(), annot=True, cmap='Spectral', fmt=".2f", linewidths=.5)
plt.title('Correlation Matrix')
plt.show()
c
- 绘制特征之间相关性的热力图,以便分析它们之间的相关关系。

6.模型准备和训练
(1)数据集划分:按照标准流程对数据进行分类处理时将其划分为训练集、验证集和测试集。(2)数据编码:为分类任务准备相应的编码方案。
代码如下(示例):
d_og = d
d = d.drop(['height', 'weight', 'ap_hi', 'ap_lo', 'age'], axis=1)
le = preprocessing.LabelEncoder()
d = d.apply(le.fit_transform)
c
- 保存原始数据集副本。
- 剔除不必要的数值属性(如身高体重收缩压舒张压年龄)。
- 应用LabelEncoder对分类属性进行编码处理后,则有助于后续建模过程。
7.随机森林模型构建和优化
随机森林算法是一种基于集成学习的方法。 随机森林(Random Forest)作为一种集成学习方法,在分类与回归任务中广泛应用。 该算法通过多棵决策树(Decision Tree)的集成来提升预测精度与稳定性。 其核心优势体现在以下几个方面:
集成学习:
随机森林作为一种集成学习方法,在构建预测模型时采用了分步优化策略。
决策树基础:
每个决策树都是基于从原始训练数据集中有放回地随机抽取样本以及从特征集中随机选取的子集进行训练的。
随机性:
在构建每棵树的过程中引入了双重随机机制:
Bootstrap抽样策略:通过从原始训练数据集中有放回地抽取样本实现的Bootstrap抽样策略构成了每棵树的基础。
特征选择机制:在节点分裂过程中采用的是从所有候选特征中随机选取一定数量来进行分裂选择。
预测结果:
对于分类问题而言,在综合所有决策树的结果后采取多数投票机制或取均值的方式确定最终分类结果。
对于回归问题而言,则采用所有决策树预测结果取平均值的方式来得到最终预测值。
容易并行化处理:
由于每棵树都是独立构建的,在实际应用中可以通过多线程或多核技术实现对整个模型训练过程的有效加速。
工作原理:
随机抽样:
在训练集中随机抽取一定比例的样本,并通过有放回的方式选取一组子样本集合(称为Bootstrap样本集),用于生成每一棵决策树的基础数据集。
随机选择特征:
在构建每棵树的过程中,在当前节点的所有候选特征中随机选取若干特征作为该节点的候选分裂特征集合。
树的生长:
每一棵树都会尽可能地生长到最大深度或直到当前节点中的所有样本都属于同一类别(对于分类任务)或当前节点的信息熵低于预先设定的阈值(对于回归任务)。
集成预测:
对于分类问题而言,在生成完所有决策树之后,通过投票机制确定最终分类结果;而对于回归问题,则取所有决策树预测结果的算术平均值作为最终预测值。
优势:
卓越准确率:通过融合多棵决策树的方法,在降低过度拟合的可能性的同时显著提升了模型在测试集上的表现。
适用于大规模数据集:该系统能够高效处理海量数据,并且支持良好的可扩展性设计。
对离群点及缺失数据具有较强的健壮性:采用基于随机采样方法构建多棵决策树,并通过投票机制综合各棵决策树的结果,在面对离群点及缺失数据时仍能稳定运行。
代码如下(示例):
x = d.drop(['cardio', 'gender', 'alco'], axis=1)
y = d['cardio']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.20, random_state=1)
rfModel = RandomForestClassifier(random_state=1)
rfModel.fit(x_train, y_train)
rf_pred = rfModel.predict(x_test)
rf_accuracy = metrics.accuracy_score(y_test, rf_pred)
c
- 首先明确特征变量x与目标变量y的定义。
- 将数据集划分为训练子集与测试子集。
- 首先初始化随机森林分类器;接着利用训练数据对模型进行拟合;最后计算并记录初始预测准确率。
8.模型优化和评估
模型调优:通过优化模型参数来提升性能。
模型评估:通过验证集进行评估,并根据结果调整参数;此外还可以采用交叉验证技术以确保稳定性和可靠性。
代码如下(示例):
param_grid = {
'n_estimators': [100, 200, 300, 500],
'max_depth': [None, 10, 20, 30],
'min_samples_split': [2, 5, 10, 20],
'min_samples_leaf': [1, 2, 4, 8],
'max_features': ['sqrt', 'log2', None],
}
rf_best_params = {
'n_estimators': [100],
'max_depth': [10],
'min_samples_split': [10],
'min_samples_leaf': [1],
'max_features': [None],
}
rf_gridsearch = GridSearchCV(estimator=rfModel, param_grid=rf_best_params, cv=5, scoring='accuracy', n_jobs=-1)
rf_gridsearch.fit(x_train, y_train)
best_params = rf_gridsearch.best_params_
best_estimator = rf_gridsearch.best_estimator_
rf_pred_CV = best_estimator.predict(x_test)
rf_accuracy_cv = metrics.accuracy_score(y_test, rf_pred_CV)
classification_report_str = classification_report(y_test, rf_pred_CV, digits=4)
c

- 建立随机森林分类器的特征空间及其对应的超平面分布。
- 通过GridSearchCV算法实现最优模型选择。
- 展示出最优配置并基于此进行预测与评估分析。
- 生成随机森林模型的性能评估指标报告,并分析其在测试集上的表现情况。
9.结果展示
绘制随机森林模型的混淆矩阵热力图,直观显示模型预测结果的准确性。
代码如下(示例):
plt.figure(figsize=(6, 4))
sns.heatmap(pd.DataFrame(cnf_matrix), annot=True, cmap="YlGnBu", fmt='g')
plt.title('Confusion matrix: RF')
plt.ylabel('Actual label')
plt.xlabel('Predicted label')
c
结果

总结
在数据加载与预处理阶段,在经过特征工程处理后,在模型构建过程中,并对模型进行优化与评估过程中的关键步骤中构成了一个完整的机器学习流程。
