B站视频及代码下载:基于数据挖掘的心力衰竭疾病风险评估系统_哔哩哔哩_bilibili
1. 项目简介
心力衰竭是一种常见的心脏疾病,它严重影响患者的生活质量和预期寿命。早期识别和干预对于改善患者的预后至关重要。近年来,随着大数据技术和机器学习的发展,利用数据挖掘技术来构建心力衰竭的风险评估模型已经成为可能。本项目它利用大量患者数据,覆盖了40至95岁的广泛年龄群体,包含了丰富的生理和生活方式指标,通过 XGBoost 机器学习模型来预测心力衰竭的发作风险,测试集预测 AUC 达到 90.7%,并利用 Flask、Bootstrap、Ajax 搭建web系统,为医疗专业人员提供了深入理解心衰风险因素的新视角。
基于数据挖掘的心力衰竭疾病风险评估系统
2. 数据探索式可视化分析
为了更好地理解数据分布和特征之间的关系,我们首先进行了数据探索式的可视化分析。这一步骤对于发现异常值、理解数据分布以及发现潜在的模式至关重要。
关键技术点:
- Pandas: 用于数据处理和清洗。
- Matplotlib: 绘制基本图表。
- Seaborn: 进行更复杂的统计图形绘制。
- 柱状图和饼状图: 直观展示类别数据和比例数据。
2.1 数据集读取与预处理
本数据集包含了多个与心力衰竭相关的特征,用于分析和预测患者心力衰竭发作的风险。数据集涵盖了从40岁到95岁不等年龄的患者群体,提供了广泛的生理和生活方式指标,以帮助研究人员和医疗专业人员更好地理解心衰的潜在风险因素。
df = pd.read_csv("./heart_failure_clinical_records_dataset.csv")
## 列名汉化
df.rename(columns={"age":"年龄","anaemia":"贫血","creatinine_phosphokinase":"肌酸激酶","diabetes":"糖尿病","ejection_fraction":"射血分数",\
"high_blood_pressure":"高血压","platelets":"血小板","serum_creatinine":"血清肌酐","serum_sodium":"血清纳","sex":"性别","smoking":"吸烟",\
"time":"随访时长","DEATH_EVENT":"死亡事件"},inplace=True)
df.sample(10)
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 299 entries, 0 to 298
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 年龄 299 non-null float64
1 贫血 299 non-null int64
2 肌酸激酶 299 non-null int64
3 糖尿病 299 non-null int64
4 射血分数 299 non-null int64
5 高血压 299 non-null int64
6 血小板 299 non-null float64
7 血清肌酐 299 non-null float64
8 血清纳 299 non-null int64
9 性别 299 non-null int64
10 吸烟 299 non-null int64
11 随访时长 299 non-null int64
12 死亡事件 299 non-null int64
dtypes: float64(3), int64(10)
memory usage: 30.5 KB
2.2 类别标签数量分布
python
tmp = df["死亡事件"].value_counts().to_frame().reset_index().rename(columns={"count":"人数"})
tmp["死亡事件"] = tmp["死亡事件"].map(lambda x:"是" if x == 1 else "否")
tmp["百分比"] = tmp["人数"].map(lambda x:round(x/tmp["人数"].sum()*100,2))
labels,values,percent = tmp["死亡事件"].tolist(),tmp["人数"].tolist(),tmp["百分比"].tolist()
可以看出,死亡的占 32.11%,这是一个类别非常不均衡的二分类问题,需要采用采样算法去平衡数据集的占比。
2.3 特征与目标的相关性分析
python
fig,ax = plt.subplots(1,1,figsize=(10,8))
sns.heatmap(df.corr(), cmap="coolwarm", annot= True)
ax.set_xticklabels(labels=df.columns, rotation=90, fontsize=12)
ax.set_yticklabels(labels=df.columns, rotation=00, fontsize=12)
plt.show()
可以看出:与观测值(死亡事件)的相关性较高的特征有:年龄、血清肌酐、射血分数以及随访时长,其中前两项呈弱正相关,后两者呈弱负相关,此外,其他特征与观测值的相关性不明显.
2.4 风险因素分析
- 分析类别特征(如贫血、糖尿病、高血压等)与死亡事件的关系,使用条形图来表示。
- 分析数值特征(如年龄、肌酸激酶水平、射血分数等)与死亡事件的关系,使用箱线图来表示。
python
cat_columns = ['贫血', '糖尿病', '高血压', '性别', '吸烟']
plt.figure(figsize=(15, 10))
for i, column in enumerate(cat_columns, 1):
plt.subplot(3, 2, i)
sns.countplot(data=df, x=column, hue='死亡事件')
plt.title(f'DEATH_EVENT by {column}')
plt.ylabel(column if i % 3 != 1 else '')
plt.xlabel('心力衰竭死亡' if i >= 6 else '')
plt.tight_layout()
plt.show()
python
num_columns = ['年龄', '肌酸激酶', '射血分数', '血小板', '血清肌酐', '血清纳']
plt.figure(figsize=(15, 10))
for i, column in enumerate(num_columns, 1):
plt.subplot(3, 3, i)
sns.kdeplot(df[df['死亡事件'] == 1][column], label='死亡')
sns.kdeplot(df[df['死亡事件'] == 0][column], label='未死亡')
plt.title(f'{column} by DEATH_EVENT')
plt.ylabel(column if i % 3 != 1 else '')
plt.xlabel('心力衰竭死亡' if i >= 7 else '')
plt.legend()
plt.tight_layout()
plt.show()
可以看出,心力衰竭的风险因素分析可以得出如下结论:
- 分类特征与死亡事件的关系:通过条形图展示了不同分类特征(如贫血、糖尿病、高血压、性别、吸烟)与死亡事件的关系。这些图表可以帮助我们了解哪些特征与心力衰竭风险增加有关。
- 数值特征与死亡事件的关系:通过箱线图展示了不同数值特征(如年龄、肌酸激酶水平、射血分数、血小板、血清肌酐、血清钠、随访时间)与死亡事件的关系。这些图表可以帮助我们了解这些数值特征在不同风险组(存活与死亡)中的分布情况。
3. 样本采样均衡与扩充处理
在处理不平衡的数据集时,数据集扩充技术显得尤为重要。不平衡数据集是指目标变量的各类别之间存在显著数量差异的数据集,在这种情况下,模型可能会偏向于多数类,导致少数类别的预测性能较差。为了解决这个问题,我们可以使用imbalanced-learn
库中的两种常用方法:过采样和欠采样。
(1)过采样 (RandomOverSampler)
过采样是指增加少数类样本的数量,通常通过复制现有的样本或合成新的样本实现。RandomOverSampler
是一种简单直接的方法,它随机重复少数类样本以平衡数据集。
(2)欠采样 (RandomUnderSampler)
欠采样是指减少多数类样本的数量,以平衡各类别之间的比例。RandomUnderSampler
同样是一个简单直接的方法,它随机选择多数类样本的一部分,使多数类与少数类的数量相同。
(3)结合使用过采样和欠采样
在某些情况下,同时使用过采样和欠采样的方法可以达到更好的效果。例如,先使用RandomUnderSampler
减少多数类样本的数量,然后再使用RandomOverSampler
增加少数类样本的数量。
python
# Separate features and target variable
X = df.drop(columns=['死亡事件'])
y = df['死亡事件']
# Count the occurrences of each class
class_counts = y.value_counts()
# Calculate the target count for each class
target_count = min(class_counts)
# 此处省略部分关键代码
# ....
# Apply resampling
print('X:', X.shape)
X_over, y_over = over_sampler.fit_resample(X, y)
print('X_over:', X_over.shape)
X_resampled, y_resampled = under_sampler.fit_resample(X_over, y_over)
print('X_resampled:', X_resampled.shape)
# Concat
df_resampled = pd.concat([pd.DataFrame(X_resampled, columns=X.columns), pd.DataFrame(y_resampled, columns=['死亡事件'])], axis=1)
df_resampled.shape
4. 机器学习建模预测心力衰竭死亡情况
在完成数据预处理之后,我们采用XGBoost算法构建了预测模型。XGBoost是一种高效的梯度提升框架,适用于大规模数据集。
关键技术点:
- XGBoost: 构建模型。
- 模型训练: 使用训练数据集训练模型。
- 特征重要性: 评估模型中各个特征的重要性。
- AUC评估: 通过计算模型的曲线下面积(Area Under the Curve, AUC)来评估模型性能。
- ROC曲线: 绘制接收者操作特性(Receiver Operating Characteristic, ROC)曲线。
- 混淆矩阵: 计算分类结果的准确性和其他指标。
4.1 梯度提升决策树 Xgboost 模型
python
df_columns = X_train.columns.values
print('===> feature count: {}'.format(len(df_columns)))
xgb_params = {
'eta': 0.005,
# 'colsample_bytree': 0.5,
'max_depth': 8,
# 'lambda': 2.0,
'eval_metric': 'auc',
'objective': 'binary:logistic',
'nthread': -1,
'silent': 1,
'booster': 'gbtree'
}
dtrain = xgb.DMatrix(X_train, y_train, feature_names=df_columns)
dvalid = xgb.DMatrix(X_valid, y_valid, feature_names=df_columns)
watchlist = [(dtrain, 'train'), (dvalid, 'valid')]
# 模型训练
model = xgb.train(dict(xgb_params),
dtrain,
evals=watchlist,
verbose_eval=10,
early_stopping_rounds=100,
num_boost_round=4000)
训练日志:
python
[0] train-auc:0.94398 valid-auc:0.94191
[10] train-auc:0.94147 valid-auc:0.94712
[20] train-auc:0.95585 valid-auc:0.94591
[30] train-auc:0.95676 valid-auc:0.94591
[40] train-auc:0.96397 valid-auc:0.94471
[50] train-auc:0.96779 valid-auc:0.94311
[60] train-auc:0.96820 valid-auc:0.93429
[70] train-auc:0.96819 valid-auc:0.93550
[80] train-auc:0.96794 valid-auc:0.93550
[90] train-auc:0.96797 valid-auc:0.93950
[100] train-auc:0.97112 valid-auc:0.94231
[110] train-auc:0.97628 valid-auc:0.94391
[111] train-auc:0.97643 valid-auc:0.94391
4.2 特征重要程度情况
可以看出,肌酸激酶的特征对于预测是否患病的重要程度最高.
4.3 模型性能评估
4.3.1 AUC 指标评估
python
# predict train
predict_train = model.predict(dtrain)
train_auc = evaluate_score(predict_train, y_train)
# predict validate
predict_valid = model.predict(dvalid)
valid_auc = evaluate_score(predict_valid, y_valid)
# predict test
dtest = xgb.DMatrix(X_test, feature_names=df_columns)
predict_test = model.predict(dtest)
test_auc = evaluate_score(predict_test, y_test)
print('训练集 auc = {:.7f} , 验证集 auc = {:.7f} , 测试集 auc = {:.7f}\n'.format(train_auc, valid_auc, test_auc))
训练集 auc = 0.9768533 , 验证集 auc = 0.9439103 , 测试集 auc = 0.9078431
4.3.2 测试集预测 ROC 曲线
python
fpr, tpr, _ = roc_curve(y_test, predict_test)
roc_auc = auc(fpr, tpr)
plt.figure(figsize=(8,8))
plt.plot(fpr, tpr, color='darkorange',
lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([-0.02, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC curve')
plt.legend(loc="lower right")
plt.show()
4.3.3 测试集预测结果混淆矩阵
python
confusion_matrix_test = confusion_matrix(y_test, predict_test > 0.5, labels=None, sample_weight=None)
attack_types = ['未患病', '患糖尿病']
plot_confusion_matrix(confusion_matrix_test, classes=attack_types, normalize=False, title='测试集预测结果的混淆矩阵')
5. 心力衰竭疾病风险评估系统
最后,我们将XGBoost模型封装成API,并集成到一个Web应用中,使得用户可以通过简单的界面输入数据,获取心力衰竭的风险评估结果。
关键技术点:
- Flask: 构建Web服务。
- Bootstrap: 提供美观的前端界面。
- Ajax: 实现异步数据交互。
- XGBoost模型加载: 在后端加载训练好的模型进行预测。
5.1 系统首页
5.2 心力衰竭风险评估在线预测
使用Flask作为后端框架来搭建Web服务,Bootstrap用于构建响应式的前端界面,Ajax技术实现了无需刷新页面的数据交互。用户可以通过Web界面输入患者的生理和生活方式数据,系统将实时加载XGBoost模型进行风险评估,并返回预测结果。
python
@app.route('/submit_and_predict', methods=['POST'])
def submit_and_predict():
"""
糖尿病在线预测
"""
test_file = request.files['file']
filename = test_file.filename
# 保存上传的文件
test_file_path = './static/img/predict_test/{}'.format(filename)
test_file.save(test_file_path)
test_data = pd.read_csv(test_file_path)
# 此处省略关键代码......
dtest = xgb.DMatrix(test_data, feature_names=df_columns)
preds = model.predict(dtest)
pred_labels = (preds > 0.5).astype(int)
header = ''
cols = ['模型预测']
cols.extend(df_columns)
for col in cols:
if col == '模型预测':
header += '<th style="color: red;">' + col + '</th>'
else:
header += '<th>' + col + '</th>'
# 此处省略关键代码......
return jsonify({
'success': True,
'header': header,
'rows': rows
})
6. 结论
本项目它利用大量患者数据,覆盖了40至95岁的广泛年龄群体,包含了丰富的生理和生活方式指标,通过 XGBoost 机器学习模型来预测心力衰竭的发作风险,测试集预测 AUC 达到 90.7%,并利用 Flask、Bootstrap、Ajax 搭建web系统,为医疗专业人员提供了深入理解心衰风险因素的新视角。
B站视频及代码下载:基于数据挖掘的心力衰竭疾病风险评估系统_哔哩哔哩_bilibili****
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。技术交流、源码获取 认准下方 CSDN 官方提供的师姐 QQ 名片 :)精彩专栏推荐订阅: