• 基于机器学习的 ICU 脑血管疾病死亡风险智能预测系统


    温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 

    1. 项目简介

            重症患者或重大手术后的患者在重症监护室(ICU)内通过多种生命支持系统以维持生理功能。患者在ICU 内会被频繁持续的记录生命体征和实验室测量等多种数据。由于高频次的数据采集,数十年来ICU 内已经形成了一个巨大的临床医疗数据信息库,这俨然是一种重要的、可被利用的医疗资源。

            本系统通过构建决策树机器学习算法,可根据ICU中脑血管疾病患者的实时17项生理参数的输入来实时预测患者的死亡风险,预测结果为0代表无风险,结果为1代表有风险。利用Pandas、Numpy、Matplotlib 和 Seaborn 等工具包对脑血管数据进行多维度的可视化分析。最后,利用 Flask + Bootstrap + Echarts 框架搭建 Web 系统,通过上传最新 ICU脑血管监测数据,实时预测患者的死亡风险。

    2. 数据探索式分析

    2.1 数据缺失值分析

    1. def contains_null(dataframe):
    2. """数据缺失值分析"""
    3. missing_df = dataframe.isnull().sum(axis=0).reset_index()
    4. missing_df.columns = ['column_name', 'missing_count']
    5. missing_df['missing_rate'] = 1.0 * missing_df['missing_count'] / dataframe.shape[0]
    6. missing_df = missing_df[missing_df.missing_count > 0]
    7. missing_df = missing_df.sort_values(by='missing_count', ascending=False)
    8. return missing_df

            可以看出,原始数据集存在大量的缺失,将缺失率超过 80% 的特征进行剔除。剩下的数值类型的缺失值,利用相应特征的平均值进行填充。

    2.2 模型训练数据集构造

            通过对原始数据集进行标签化处理,构造机器学习模型训练所需要的训练集:

    1. from tqdm import tqdm
    2. def create_dataset(df, is_test=False):
    3. train_x = []
    4. train_y = []
    5. for i, row in tqdm(df.iterrows(), total=df.shape[0]):
    6. f = row['stay']
    7. if is_test:
    8. data = pd.read_csv('./data/test/' + f)
    9. else:
    10. data = pd.read_csv('./data/train/' + f)
    11. # 数据预处理
    12. data = data.drop(['Capillary refill rate', 'Height', 'Fraction inspired oxygen', 'Weight', 'pH',
    13. 'Glucose', 'Temperature', 'Glascow coma scale total', 'Glascow coma scale verbal response',
    14. 'Glascow coma scale eye opening'], axis=1)
    15. # 删除类别类型的特征
    16. del data['Glascow coma scale motor response']
    17. # 缺失值填充
    18. col_mean = dict(data.mean())
    19. for key in data.columns:
    20. data[key].fillna(col_mean[key], inplace=True)
    21. # 特征工程核心函数
    22. features = feature_engineering(data)
    23. train_x.append(features)
    24. train_y.append(row['y_true'])
    25. # 创建 dataframe 表格
    26. train_x = ......
    27. return train_x, train_y

    2.3 训练集、验证集和测试集的标签分布

    1. plt.figure(figsize=(20, 5))
    2. plt.subplot(131)
    3. sns.countplot(train_x['label'])
    4. plt.title('训练集ICU脑血管疾病死亡风险分布', fontsize=16, weight='bold')
    5. plt.subplot(132)
    6. sns.countplot(valid_x['label'])
    7. plt.title('验证集ICU脑血管疾病死亡风险分布', fontsize=16, weight='bold')
    8. plt.subplot(133)
    9. sns.countplot(test_x['label'])
    10. plt.title('测试集ICU脑血管疾病死亡风险分布', fontsize=16, weight='bold')
    11. plt.show()

    2.4 Xgboost 决策树模型构建与训练

            ICU 脑血管疾病死亡风险预测为典型的二分类问题,以此目标函数选择 `binary:logistic`,验证指标选择 AUC 指标:

    1. import xgboost as xgb
    2. from sklearn.model_selection import train_test_split
    3. from sklearn.metrics import auc, roc_curve
    4. from sklearn.metrics import accuracy_score, precision_score, recall_score
    5. def evaluate_score(predict, y_true):
    6. false_positive_rate, true_positive_rate, thresholds = roc_curve(y_true, predict, pos_label=1)
    7. auc_score = auc(false_positive_rate, true_positive_rate)
    8. return auc_score
    9. dtrain = xgb.DMatrix(train_x, train_y, feature_names=feature_names)
    10. dvalid = xgb.DMatrix(valid_x, valid_y, feature_names=feature_names)
    11. dtest = xgb.DMatrix(test_x, test_y, feature_names=feature_names)
    12. watchlist = [(dtrain, 'train'), (dvalid, 'valid')]
    13. xgb_params = {
    14. 'eta': 0.05,
    15. 'colsample_bytree': 0.1,
    16. 'max_depth': 6,
    17. 'subsample': 0.1,
    18. 'lambda': 1,
    19. 'scale_pos_weight': 1,
    20. 'eval_metric': 'auc',
    21. 'objective': 'binary:logistic',
    22. 'nthread': -1,
    23. 'silent': 1,
    24. 'booster': 'gbtree'
    25. }
    26. model = xgb.train(dict(xgb_params),
    27. dtrain,
    28. evals=watchlist,
    29. verbose_eval=1,
    30. early_stopping_rounds=10,
    31. num_boost_round=5)

            模型训练日志如下:

    1. [0] train-auc:0.785276 valid-auc:0.785276
    2. Multiple eval metrics have been passed: 'valid-auc' will be used for early stopping.
    3. Will train until valid-auc hasn't improved in 10 rounds.
    4. [1] train-auc:0.848569 valid-auc:0.848569
    5. [2] train-auc:0.897501 valid-auc:0.897501
    6. [3] train-auc:0.898473 valid-auc:0.898473
    7. [4] train-auc:0.903983 valid-auc:0.903983

            模型训练完成后,可以看出,训练集和验证集的 AUC 指标可以达到 90% 以上,可以有效预测脑血管疾病的死亡风险。其特征的重要程度分布如下:

    2.5 模型预测的 ROC 曲线

    1. from sklearn.metrics import auc, roc_curve
    2. fpr, tpr, _ = roc_curve(valid_y, predict_valid)
    3. roc_auc = auc(fpr, tpr)
    4. plt.figure(figsize=(10,10))
    5. plt.plot(fpr, tpr, color='darkorange',
    6. lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
    7. plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
    8. plt.xlim([-0.02, 1.0])
    9. plt.ylim([0.0, 1.05])
    10. plt.xlabel('False Positive Rate')
    11. plt.ylabel('True Positive Rate')
    12. plt.title('ROC curve')
    13. plt.legend(loc="lower right")
    14. plt.show()

            可以看出,构建的机器学习模型具备很好的预测性能,可以根据用户的历史 Diastolic blood pressure Heart Rate Mean blood pressure Oxygen saturation Respiratory rate Systolic blood pressure 特征,实现脑血管死亡风险预警!

     3. ICU 脑血管疾病死亡风险智能预测系统

            本课题利用 Flask + Bootstrap + Echarts 框架搭建 Web 系统,通过上传最新 ICU脑血管监测数据,绘制主要特征的时序变化情况、模型的性能表现,并实时预测患者的死亡风险的概率值。

    欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。

    精彩专栏推荐订阅:

    1. Python 毕设精品实战案例
    2. 自然语言处理 NLP 精品实战案例
    3. 计算机视觉 CV 精品实战案例

  • 相关阅读:
    SAP ABAP 定义事件以及处理事件
    LeetCode50天刷题计划(Day 5—— 最长回文子串 10.50-13:00)
    基于Transformer的目标检测:原理、应用与未来展望
    第19章 并发与竞争实验(iTOP-RK3568开发板驱动开发指南 )
    百度地图,地市区域描边
    【Docker、Portainer】Docker可视化的容器镜像的图形管理工具(推荐)(基本介绍)
    python打包和运行技巧
    centos7 安装apr1.7
    Linux 磁盘扩容及挂载新盘
    arcgis中xy连线时出现多余的线
  • 原文地址:https://blog.csdn.net/andrew_extra/article/details/134299771