基于人工智能的【预测死亡-心力衰竭】患者模型建立

简介: 基于人工智能的【预测死亡-心力衰竭】患者模型建立

一、预测死亡-心力衰竭患者模型建立


image.png


1.数据集简介


  • 心血管疾病 (CVD) 是全球第一大死因,估计每年夺去 1790 万人的生命,占全球所有死亡人数的 31%。
  • 心力衰竭是由 CVD 引起的常见事件,该数据集包含 12 个可用于预测心力衰竭死亡率的特征。
  • 大多数心血管疾病可以通过使用全民策略解决烟草使用、不健康饮食和肥胖、缺乏身体活动和有害使用酒精等行为风险因素来预防。
  • 患有心血管疾病或处于高心血管风险(由于存在一种或多种风险因素,如高血压、糖尿病、高脂血症或已经确定的疾病)的人需要早期检测和管理,其中机器学习模型可以提供很大帮助。


2.scikiti-survival库的简介


  • scikit-survival 是一个 基于scikit-learn构建的用于生存分析的 Python 模块。它允许在利用 scikit-learn 的强大功能的同时进行生存分析,例如,用于预处理或进行交叉验证。
  • 生存分析(也称为事件发生时间或可靠性分析)的目标是在协变量和事件发生时间之间建立联系。生存分析与传统机器学习的不同之处在于,部分训练数据只能部分观察——它们被删减了。
  • 例如,在临床研究中,通常会在特定时间段内监测患者,并记录在该特定时间段内发生的事件。如果患者经历了事件,则可以记录事件的确切时间——患者的记录未经审查。相反,右截尾记录指的是在研究期间保持无事件的患者,并且不知道研究结束后事件是否发生。因此,生存分析需要考虑此类数据集的这一独特特征的模型。

文档: [User Guide — scikit-survival 0.20.1scikit-survival.readthedocs.io/en/latest/u… Guide — scikit-survival 0.20.1scikit-survival.readthedocs.io/en/latest/u…)


3.超参数调优框架optuna库的简介


optuna 是一个十分常用的超参数调优框架,具有操作简单,嵌入式强和动态调整参数空间等优点。


二、环境构设


from IPython.display import clear_output
!pip install scikit-survival
!pip install optuna
clear_output() # 清理很长的内容


三、数据处理


1.数据查看


import pandas as pd 
data=pd.read_csv('data/data209679/heart_failure_clinical_records_dataset.csv')
data.info()
data.head()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 299 entries, 0 to 298
Data columns (total 13 columns):
 #   Column                    Non-Null Count  Dtype  
---  ------                    --------------  -----  
 0   age                       299 non-null    float64
 1   anaemia                   299 non-null    int64  
 2   creatinine_phosphokinase  299 non-null    int64  
 3   diabetes                  299 non-null    int64  
 4   ejection_fraction         299 non-null    int64  
 5   high_blood_pressure       299 non-null    int64  
 6   platelets                 299 non-null    float64
 7   serum_creatinine          299 non-null    float64
 8   serum_sodium              299 non-null    int64  
 9   sex                       299 non-null    int64  
 10  smoking                   299 non-null    int64  
 11  time                      299 non-null    int64  
 12  DEATH_EVENT               299 non-null    int64  
dtypes: float64(3), int64(10)
memory usage: 30.5 KB

    .dataframe tbody tr th:only-of-type {         vertical-align: middle;     } .dataframe tbody tr th {     vertical-align: top; } .dataframe thead th {     text-align: right; }

age anaemia creatinine_phosphokinase diabetes ejection_fraction high_blood_pressure platelets serum_creatinine serum_sodium sex smoking time DEATH_EVENT
0 75.0 0 582 0 20 1 265000.00 1.9 130 1 0 4 1
1 55.0 0 7861 0 38 0 263358.03 1.1 136 1 0 6 1
2 65.0 0 146 0 20 0 162000.00 1.3 129 1 1 7 1
3 50.0 1 111 0 20 0 210000.00 1.9 137 1 0 7 1
4 65.0 1 160 1 20 0 327000.00 2.7 116 0 0 8 1
  • 生存类数据,样本量小,使用交叉验证方法
  • ✔️构建预测模型则用scikit-survival文库,这里可以预测未发生死亡事件的人群的死亡时间(从随访起点算起)。


2.X,y构建


from sksurv.util import Surv
from sksurv.ensemble import RandomSurvivalForest
from sklearn.impute import SimpleImputer
data['DEATH_EVENT']=[True if x==1 else 0 for x in data['DEATH_EVENT']]
y=Surv.from_dataframe(event='DEATH_EVENT',time='time',data=data)
cat_cols=['anaemia','diabetes','high_blood_pressure','sex','smoking']
data[cat_cols]=data[cat_cols].astype('category')
X=data.drop(['DEATH_EVENT','time'],axis=1)
X.head()

    .dataframe tbody tr th:only-of-type {         vertical-align: middle;     } .dataframe tbody tr th {     vertical-align: top; } .dataframe thead th {     text-align: right; }

age anaemia creatinine_phosphokinase diabetes ejection_fraction high_blood_pressure platelets serum_creatinine serum_sodium sex smoking
0 75.0 0 582 0 20 1 265000.00 1.9 130 1 0
1 55.0 0 7861 0 38 0 263358.03 1.1 136 1 0
2 65.0 0 146 0 20 0 162000.00 1.3 129 1 1
3 50.0 1 111 0 20 0 210000.00 1.9 137 1 0
4 65.0 1 160 1 20 0 327000.00 2.7 116 0 0


四、模型构建和评价


1.超参数搜索


# pipe-line
from sklearn.pipeline import make_pipeline
from sksurv.ensemble import RandomSurvivalForest
from sklearn.preprocessing import RobustScaler,StandardScaler,MinMaxScaler,OneHotEncoder
from sklearn.model_selection import cross_val_score
from sklearn.compose import make_column_transformer
from sklearn.compose import make_column_selector as selector
import optuna
import numpy as np
def objective(trial):
    n_estimators=trial.suggest_int('n_estimators',100,1000,10)
    min_sample_split=trial.suggest_int('min_sample_split',1,29,2)
    min_sample_leaf=trial.suggest_int('min_sample_leaf',1,29,2)
    preprocessor=make_column_transformer((RobustScaler(),selector(dtype_include='number')))
    rsf=make_pipeline(preprocessor, RandomSurvivalForest(n_estimators=n_estimators,
                            min_samples_split=10,
                            min_samples_leaf=15,
                            n_jobs=-1,
                            random_state=0))
    scores=cross_val_score(rsf,X,y)
    return np.mean(scores)
study=optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)
study.best_params


[I 2023-04-17 00:42:44,270] Trial 95 finished with value: 0.7495800673166991 and parameters: {'n_estimators': 230, 'min_sample_split': 15, 'min_sample_leaf': 5}. Best is trial 37 with value: 0.7540914188972966.
[I 2023-04-17 00:42:47,104] Trial 96 finished with value: 0.7488762391145961 and parameters: {'n_estimators': 280, 'min_sample_split': 13, 'min_sample_leaf': 9}. Best is trial 37 with value: 0.7540914188972966.
[I 2023-04-17 00:42:49,221] Trial 97 finished with value: 0.7502194611898544 and parameters: {'n_estimators': 200, 'min_sample_split': 13, 'min_sample_leaf': 11}. Best is trial 37 with value: 0.7540914188972966.
[I 2023-04-17 00:42:51,100] Trial 98 finished with value: 0.7536458218120432 and parameters: {'n_estimators': 160, 'min_sample_split': 21, 'min_sample_leaf': 1}. Best is trial 37 with value: 0.7540914188972966.
[I 2023-04-17 00:42:52,665] Trial 99 finished with value: 0.7523008612365734 and parameters: {'n_estimators': 120, 'min_sample_split': 25, 'min_sample_leaf': 3}. Best is trial 37 with value: 0.7540914188972966.


2.模型训练


#best_model在后续预测中使用cindex=0.73
preprocessor=make_column_transformer((RobustScaler(),selector(dtype_include='number')))
rsf_best=make_pipeline(preprocessor, RandomSurvivalForest(n_estimators=170,
                            min_samples_split=15,
                            min_samples_leaf=25,
                            n_jobs=-1,
                            random_state=0))
rsf_best.fit(X,y)
import joblib
joblib.dump(rsf_best,'rsf_best.pkl')


['rsf_best.pkl']


3.模型预测


#限制累积风险为1,获得对应的时间。 
va_times=np.arange(4,241)
data_pre=data[data['DEATH_EVENT']!=True].drop(['DEATH_EVENT','time'],axis=1)
chf_funcs = rsf_best.predict_cumulative_hazard_function(data_pre)#产生对所有的test的风险函数,只需传入时间参数即可获得累积风险
outcome_period=[]
for fn in chf_funcs:#
    if fn(va_times[-1])<1:#在最后的预测时间内死亡全部累计概率不到0.6
        time_value=999
    else:
        for time in va_times:
            if fn(time)>1:
                time_value=time#发生结局的最短时间
                break
            # print(time)
    outcome_period.append(time_value)
outcome_predict=data_pre.copy()
outcome_predict['outcome_period']=outcome_period 
result=outcome_predict[outcome_predict['outcome_period']!=999]['outcome_period']


4.保存结果


patient_id=result.index
patient_surv_month=result.values
for i,x in zip(patient_id,patient_surv_month):
    print('{}号患者死亡的时间为{}个月时。'.format(i,x))
#这里的时间计算开始是从患者入组时间开始算起,不是当下日期。


20号患者死亡的时间为235个月时。
38号患者死亡的时间为198个月时。
89号患者死亡的时间为235个月时。
96号患者死亡的时间为235个月时。
98号患者死亡的时间为235个月时。
100号患者死亡的时间为235个月时。
102号患者死亡的时间为235个月时。
112号患者死亡的时间为235个月时。
117号患者死亡的时间为198个月时。
131号患者死亡的时间为198个月时。
137号患者死亡的时间为193个月时。
155号患者死亡的时间为235个月时。
157号患者死亡的时间为235个月时。
173号患者死亡的时间为235个月时。
190号患者死亡的时间为180个月时。
198号患者死亡的时间为235个月时。
203号患者死亡的时间为196个月时。
210号患者死亡的时间为235个月时。
223号患者死亡的时间为235个月时。
224号患者死亡的时间为235个月时。
226号患者死亡的时间为235个月时。
228号患者死亡的时间为196个月时。
229号患者死亡的时间为235个月时。
247号患者死亡的时间为180个月时。
281号患者死亡的时间为207个月时。
282号患者死亡的时间为198个月时。


6.预测个案


加载存储的模型,然后进行预测

def survival_time(model,patient):
    chf_funcs=model.predict_cumulative_hazard_function(patient)
    for fn in chf_funcs:#
        if fn(va_times[-1])<1:#在最后的预测时间内死亡全部累计概率不到0.6
            time_value=999
            print('该患者在241个月内未预测到因疾病原因的死亡')
        else:
            for time in va_times:
                if fn(time)>1:
                    time_value=time#发生结局的最短时间
                    break
            print('该患者预测在{}月时因疾病原因死亡'.format(time))


#加载储存的模型
model=joblib.load('rsf_best.pkl')
#输入患者数据,我们这里加载了20号患者,可以看到和前面的批量预测是一致的。
patient=data_pre[data_pre.index==20]
print(patient)
#预测死亡时间
survival_time(model,patient)


age anaemia  creatinine_phosphokinase diabetes  ejection_fraction  \
20  65.0       1                        52        0                 25   
   high_blood_pressure  platelets  serum_creatinine  serum_sodium sex smoking  
20                   1   276000.0               1.3           137   0       0  
该患者预测在235月时因疾病原因死亡

image.png


目录
相关文章
|
11天前
|
机器学习/深度学习 人工智能 机器人
推荐一些关于将图形学先验知识融入人工智能模型的研究论文
推荐一些关于将图形学先验知识融入人工智能模型的研究论文
|
11天前
|
机器学习/深度学习 人工智能 图形学
如何将图形学先验知识融入到人工智能模型中?
如何将图形学先验知识融入到人工智能模型中?
|
7天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
24 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
7天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
42 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
4月前
|
机器学习/深度学习 人工智能 数据处理
人工智能平台PAI操作报错合集之任务重启后出现模型拆分报错,该怎么办
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
23天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
70 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能与模型知识库在移动医疗产品中的落地应用
在现代医疗体系中,通义千问大模型与MaxKB知识库的结合,为医生和患者提供了前所未有的支持与便利。该系统通过实时问答、临床决策辅助、个性化学习和患者教育等功能,显著提升了诊疗效率和患者满意度。实际应用如乐问医学APP展示了其强大优势,但数据隐私和安全问题仍需关注。
28 0
|
2月前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
108 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
3月前
|
机器学习/深度学习 人工智能 算法
【人工智能】线性回归模型:数据结构、算法详解与人工智能应用,附代码实现
线性回归是一种预测性建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种关系可以表示为一个线性方程,其中因变量是自变量的线性组合。
71 2
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
【人工智能】常用的人工智能框架、模型、使用方法、应用场景以及代码实例的概述
人工智能(AI)领域涉及众多框架和模型,这些框架和模型为开发人员提供了强大的工具,以构建和训练各种AI应用。以下是一些常用的人工智能框架、模型、使用方法、应用场景以及代码实例的概述。
164 1