机器学习案例LightGBM的糖尿病遗传风险预测

2023-05-27 0 405

机器学习案例LightGBM的糖尿病遗传风险预测统计数据分析类体育竞技的自学方向机器学习案例LightGBM的糖尿病遗传风险预测截止2022年,我国高血压病人近1.3亿。我国高血压得病其原因受生活方式、人口老龄化、城镇化、家族企业遗传基因等多种不同因素影响。同时,高血压病人趋于平民化。高血压可导致心脑血管、肝脏、心律不整并发症的出现。因此,精确确诊出罹患高血压子代具备非常重要的尿道感染。高血压晚期遗传基因信用风险预估将有利于防治高血压的出现。根据《我国2型高血压防治手册(2017年版)》,高血压的确诊国际标准是具备众所周知高血压病症(烦渴多饮、多尿、多食、未明其原因的运动量下降)且乱数腹腔血液乳酸≥11.1mmol/L或暴饮暴食腹腔血液乳酸≥7.0mmol/L或静脉注射乳酸耐量测试(OGTT)损耗后2h血液乳酸≥11.1mmol/L。目的:需要通过体能训练统计数据集构筑高血压遗传基因信用风险预估模型,然后推断出测试统计数据分散子代与否罹患高血压,和我们一起协助高血压病人化解这“浪漫的苦恼”。比赛门牌号:http://challenge.xfyun.cn/topic/info?type=diabetes&ch=ds22-dw-gzh01源码:https://github.com/datawhalechina/competition-baseline数据情况:统计数据由体能训练集和测试集共同组成,详细情况如下表所示:体能训练集:共计5070条统计数据,用作构筑您的预估模型测试集:共计1000条统计数据,用作校正预估模型的操控性。其中体能训练集统计报文所含9个表头:异性恋、长大年数、运动量指数、高血压Satna、收缩压、静脉注射耐糖量测试、生长激素释放出来试验、肱三头肌展毛宽度、罹患高血压标记(统计数据条码)埃皮纳勒区统计数据由体能训练集和测试集共同组成,详细情况如下表所示:应试者选用二进行分类任务中的F1-score指标进行评价,F1-score越大说明预估模型操控性越好,F1-score的定义如下表所示:机器学习案例LightGBM的糖尿病遗传风险预测其中:机器学习案例LightGBM的糖尿病遗传风险预测机器学习案例LightGBM的糖尿病遗传风险预测Baseline

导入统计数据

import pandas as pdimport lightgbmimport lightgbm

统计数据预处理

data1=pd.read_csv(比赛体能训练集.csv,encoding=gbk)data2=pd.read_csv(比赛测试集.csv,encoding=gbk)#label标记为-1data2[罹患高血压标记]=-1#体能训练集和测试机合并data=pd.concat([data1,data2],axis=0,ignore_index=True)#特征工程”””人体的成人运动量指数正常值是在18.5-24之间低于18.5是运动量指数过轻在24-27之间是运动量超重27以上考虑是肥胖高于32了就是非常的肥胖。”””def BMI(a):if a<18.5:return0elif 18.5<=a<=24:return1elif 24<a<=27:return2elif 27<a<=32:return3else:return4data[BMI]=data[运动量指数].apply(BMI)data[长大年数]=2022-data[长大年数] #换成年龄#高血压Satna”””无记录叔叔或者姑姑有一方罹患高血压/叔叔或姑姑有一方罹患高血压父母有一方罹患高血压”””def FHOD(a):if a==无记录:return0elif a==叔叔或者姑姑有一方罹患高血压 or a==叔叔或姑姑有一方罹患高血压:return1else:return2data[高血压Satna]=data[高血压Satna].apply(FHOD)data[收缩压]=data[收缩压].fillna(-1)”””收缩压范围为60-90″””def DBP(a):if a<60:return0elif 60<=a<=90:return1elif a>90:return2else:return adata[DBP]=data[收缩压].apply(DBP)data

体能训练统计数据/测试统计数据准备

train=data[data[患有高血压标记] !=-1]test=data[data[罹患高血压标记] ==-1]train_label=train[罹患高血压标记]train=train.drop([编号,罹患高血压标记],axis=1)test=test.drop([编号,罹患高血压标记],axis=1)构筑模型def select_by_lgb(train_data,train_label,test_data,random_state=2022,metric=auc,num_round=300):clf=lightgbmtrain_matrix=clf.Dataset(train_data,label=train_label)params={boosting_type: gbdt,objective: binary,learning_rate: 0.1,metric: metric,seed: 2020,nthread:-1 }model=clf.train(params,train_matrix,num_round)pre_y=model.predict(test_data)return pre_y

模型校正

test_data=select_by_lgb(train,train_label,test)pre_y=pd.DataFrame(test_data)pre_y[label]=pre_y[0].apply(lambda x:1 if x>0.5 else 0)result=pd.read_csv(提交示例.csv)result[label]=pre_y[label]result.to_csv(baseline.csv,index=False)

建议

本题中的模型部分用了相当简单的方法,lightgbm算法中没有进行交叉统计数据校正,同时也仅仅使用了默认参数,因此选手可以在这个Baseline的基础上进行进一步的参数优化于模型融合,同时注意到本公开的算法中特征工程构筑进行了一部分的演示,选手可以根据高血压的相关医学特点进行对特征进一步挖掘~以上是科大讯飞的体育竞技事例

——————————————–

以下根据临床实际多特征因素进行机器自学预估

统计数据说明Data description   –本事例统计数据分散分为体能训练集和测试集,部分特征名已经做脱敏处理。体能训练集包含年龄、异性恋、各项体检指标以及预估目标血糖值;测试集相对于体能训练集则缺少了对应的血糖值,也就是所期望预估到的值;文件共包含42个特征,包含数值型、字符型、日期型等众多统计数据类型,如下表所示所示:机器学习案例LightGBM的糖尿病遗传风险预测分析目标The aim of the task –高血压遗传基因信用风险预估项目地具体步骤如下表所示:① 抽取部分个人体检统计数据作为体能训练统计数据;② 对抽取的统计数据进行统计数据探索、统计数据清洗、特征工程等操作;③ 使用体检统计数据结合交叉校正和lightGBM算法构筑模型来预估子代血糖值;④ 对模型结果进行分析,并进行模型评价;机器学习案例LightGBM的糖尿病遗传风险预测1 导入统计数据第一步  1.1 指定方向# 指定方向import osos.chdir(r”…\_基于LightGBM的高血压信用风险预估”) # 改变当前方向,到指定方向os.getcwd()1.2 导入库# 导入库import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns## 输出高清图像%config InlineBackend.figure_format = retina%matplotlib inline## 图像显示中文的问题import matplotlibmatplotlib.rcParams[axes.unicode_minus]=False1.3 导入统计数据# 读取统计数据集# 读取体能训练统计数据train = pd.read_csv(train.csv, encoding=gbk)# 显示统计数据集的形状print(train.shape)返回:(6642, 42)表示:统计数据集共6642行,42列。共6642名受试者,收集42个变量特征。2 描述统计数据第二步  –2.1 描述前五行# 显示前5行统计数据print(train.head())# 保存至htmltrain.head().to_html(“01_前五行统计数据集.html”)返回:机器学习案例LightGBM的糖尿病遗传风险预测2.2 描述统计摘要# 显示统计摘要信息print(train.describe())# 保存至htmltrain.describe().to_html(“统计数据集统计摘要信息.html”)返回:机器学习案例LightGBM的糖尿病遗传风险预测解读:describe()函数输出统计数据描述。一般只输出定量变量的统计信息。在本例中,输出的 40 个表头是定量变量的统计数据,可以看到表头值的统计数据量、平均值、国际标准差、最小和最大等统计数据描述,其中许多变量表头的conut数不一致,表示有遗漏值。2.3 查看统计数据集缺失情况# 显示统计数据集缺失情况print(train.info())

返回:

机器学习案例LightGBM的糖尿病遗传风险预测

解读:可以看到,许多表头有缺失。

3 统计数据预处理

第三步  –3.1 将id列删除,并将异性恋转化为10任务:将id列删除,并将异性恋转化为10# 将id列丢掉train = train.drop([id], axis=1)# 将异性恋男女转化为10train[异性恋] = train[异性恋].map({男:1, 女:0})# train[异性恋] = np.where(train[异性恋]==”女”, 0, 1)3.2 根据血糖状态划分人群状态:任务:根据血糖,将人群分为以下三列:① 正常血糖(血糖<6.1 mmol/L);② 高血压前期(6.1≤血糖<7.0 mmol/L);③ 高血压(血糖≥7.0 mmol/L);# ① 正常血糖(血糖<6.1 mmol/L);# ② 高血压前期(6.1≤血糖<7.0 mmol/L);# ③ 高血压(血糖≥7.0 mmol/L);data1=train.loc[train[血糖] < 6.1].copy()data1[“状态”] = “正常血糖”data2=train.loc[(train[血糖] >= 6.1) & (train[血糖] < 7.0)].copy()data2[“状态”] = “高血压前期”data3=train.loc[train[血糖] >= 7.0].copy()data3[“状态”] = “高血压”df = pd.concat([data1, data2,data3])# 查看目标人群的人数df[“状态”].value_counts()返回:正常血糖     5530;高血压前期     567;高血压       545;3.3 探索血糖状态与年龄异性恋的关系任务:绘制柱状图和箱线图分析异性恋与血糖状态、年龄与血糖的关系# 绘制柱状图和箱线图分析异性恋与血糖、年龄与血糖的关系fig=plt.figure(figsize=(14, 14))# 设置画布大小plt.rcParams[font.sans-serif] = SimHei  #设置中文显示plt.rcParams[axes.unicode_minus] = Falsefig.add_subplot(1, 2, 1)sns.countplot(x=状态, data=df, hue=异性恋, palette=rainbow)fig.add_subplot(1, 2, 2)sns.boxplot(x=状态, y=年龄, data=df)返回:机器学习案例LightGBM的糖尿病遗传风险预测# 显示性別人数和计算平均年齡print(“血糖状态分性別统计人数为:”)print(df.groupby([“状态”,”异性恋”]).size())# print(df[“状态”].groupby(df[“异性恋”]).size())print(“血糖状态分性別统计平均年龄为:”)print(df.groupby([“状态”,”异性恋”])[“年龄”].mean())返回:机器学习案例LightGBM的糖尿病遗传风险预测3.4 计算变量间相关性任务:计算变量间相关性,并返回血糖和其他变量的相关性系数。# 变量间相关性plt.figure(figsize=(20,18))sns.heatmap(train.corr(),annot=True,cmap=YlGnBu,fmt=.2f,linewidths=2)返回:机器学习案例LightGBM的糖尿病遗传风险预测# 3.1 变量间相关性from heatmap import heatmap, corrplotplt.figure(figsize=(12, 12))corrplot(train.corr(), size_scale=300)返回:机器学习案例LightGBM的糖尿病遗传风险预测# 计算各项指标与血糖的相关性correlations = train.corr()[血糖].drop(血糖)correlations返回:机器学习案例LightGBM的糖尿病遗传风险预测解读:年龄、异性恋与血糖的相关性高,而乙肝e抗原、乙肝核心抗体等与血糖相关性不高。4 统计数据清洗第四步  –通过统计数据探索发现体能训练统计数据与测试统计数据中都存在缺失值,需要对统计数据进行清洗后才能用作分析。缺失值处理的方法有很多种不同,例如直接删除缺失统计数据、使用统计量填充统计数据、利用拉格朗日等插值方法对统计数据进行拟合等等。为了尽量保持统计数据的完整性,同时提高效率,在本事例中使用中位数对缺少一部分的统计数据进行填充。4.1 统计数据清洗函数编写与应用在本事例中,由于原始统计数据的特征过多,不便直接预估高血压遗传基因信用风险,因此需要对42个特征进行筛选。同时,体能训练集和测试分散异性恋特征值为“男”“女”,是类别型统计数据,不便于模型的构筑,需转化为数值型统计数据。本事例特征工程包括特征选择和特征变换两个步骤。① 特征工程:筛选体能训练集和测试集中的特征统计发现乙肝的缺失值太多,且相关性不高,因此删除乙肝表面抗原、乙肝表面抗体、乙肝e抗原、乙肝e抗体、乙肝核心抗体等5个特征。同时发现id、体检日期等特征与高血压遗传基因信用风险的预估无关,直接删除处理即可。② 特征变换:异性恋的值转化为数值型统计数据将体能训练统计数据与测试统计数据中的异性恋“男”定义为0,“女”定义为1。并筛选年龄大于10的统计数据。import pandas as pd# 读取统计数据train = pd.read_csv(train.csv, encoding=gbk)# test = pd.read_csv(test.csv, encoding=gbk)def make_feat(train):#test    train_id = train.id.values.copy()# test_id = test.id.values.copy()    # data = pd.concat([train, test]) # 对统计数据进行合并与重塑    train[异性恋] = train[异性恋].map({男:1, 女:0})    train=train[train[年龄]>10]   train_feat = train[train.id.isin(train_id)]# test_feat = data[data.id.isin(test_id)]    # 对统计数据缺失值进行处理    train_feat = train_feat.drop([id, 体检日期, 乙肝表面抗原, 乙肝表面抗体,  乙肝e抗原, 乙肝e抗体, 乙肝核心抗体], axis=1)# test_feat = test_feat.drop([id,体检日期, 乙肝表面抗原, 乙肝表面抗体, #   乙肝e抗原,乙肝e抗体,乙肝核心抗体], axis=1)    # 对缺少一部分的统计数据进行中位数填充    train_feat.fillna(train_feat.median(axis=0), inplace=True)# test_feat.fillna(test_feat.median(axis=0), inplace=True)    return train_feat# , test_feat# train_feat, test_feat = make_feat(train, test)train_feat= make_feat(train)train_feat.to_csv(train_feat.csv, index=False, encoding=gbk)# test_feat.to_csv(test_feat.csv, index=False, encoding=gbk)返回:机器学习案例LightGBM的糖尿病遗传风险预测

5 建立模型

第一步  –本次建模采取交叉校正的方式进行建模。下面简要回归下交叉校正。5.1 导入库和统计数据# 导入构筑模型所需的库from sklearn.model_selection import KFold  # K折交叉校正函数import lightgbm as lgb# LightGBM是一个梯度Boosting框架,使用基于决策树的自学算法from sklearn.model_selection import train_test_split# 用作统计数据分割# 读取处理后的统计数据train_feat = pd.read_csv(train_feat.csv, encoding = gbk)# test_feat = pd.read_csv(../tmp/test_feat.csv, encoding = gbk)5.2 统计数据分割# 在这里我们从train_feat中进行统计数据分割# X提取变量特征;Y提取目标变量X = train_feat.drop(血糖, axis=1)y = train_feat[血糖]X_train, X_test, y_train, y_test = train_test_split(train_feat.drop(血糖, axis=1), train_feat[血糖], test_size = .2, random_state=10)# 合并train和testtrain_feat = pd.concat([X_train,y_train],axis=1)test_feat = pd.concat([X_test,y_test],axis=1)5.3 交叉校正并建模predictors = [f for f in train_feat.columns if f not in [血糖]]  # 提取列名print(开始体能训练…)# 体能训练模型并预估def lgb_train(train_feat,test_feat):    print(开始CV 5折体能训练…)    train_preds = np.zeros(train_feat.shape[0])test_preds = np.zeros((test_feat.shape[0],5))    kf = KFold(n_splits=5, shuffle=True, random_state=500)# K折交叉校正    

for i ,(train_index, test_index) in enumerate(kf.split(train_feat)):        

print(第{}次体能训练.format(i))

train_feat1 = train_feat.iloc[train_index]        

train_feat2 = train_feat.iloc[test_index]        

model_lgb = lgb.LGBMRegressor(objective=regression, num_leaves=8,                                    learning_rate=0.03, n_estimators=400,max_bin=30, bagging_fraction=0.8,bagging_freq=10, feature_fraction=0.5,

feature_fraction_seed=10, bagging_seed=10,                                      

min_data_in_leaf=80, nthread=8,                                     

min_sum_hessian_in_leaf=0.2)

gbm = model_lgb.fit(train_feat1[predictors].values, train_feat1[血糖].values)        train_preds[test_index] += gbm.predict(train_feat2[predictors])

test_preds[:,i] = gbm.predict(test_feat[predictors])

return train_preds, test_predstrain_preds,test_preds = lgb_train(train_feat, test_feat)

返回:机器学习案例LightGBM的糖尿病遗传风险预测5.4 保存统计数据# 保存统计数据train_true_pred = pd.DataFrame({true:train_feat[血糖], pred:train_preds})train_true_pred.to_csv(train_true_pred.csv, index=False, encoding = gbk)test_preds1 = pd.DataFrame(test_preds.mean(axis=1))test_preds1.columns = [血糖]test_preds1.to_csv(test_preds.csv, index=False, encoding = gbk)6——模型评价第六步  –6.1 导入真实值和预估值# 模型评价train_true_pred = pd.read_csv(train_true_pred.csv, encoding=gbk)train_true_pred = train_true_pred.iloc[:50, :]x = range(len(train_true_pred))y_true = train_true_pred[true]  # 提取血糖真实值y_pred = train_true_pred[pred]  # 提取血糖预估值6.2 绘制前50名预估者真实值和预估值的折线图# 绘制部分体能训练统计数据的血糖的真实值与预估值的折线图plt.figure(figsize=(10, 6))plt.plot(x, y_true)plt.plot(x, y_pred)# 设置rc参数显示中文标题plt.rcParams[font.sans-serif] = SimHei  # 设置字体为SimHei显示中文plt.ylabel(血糖)plt.title(部分体能训练统计数据真实值与预估值结果的折线图)plt.legend((“真实值”,”预估值”), loc=1)plt.show()机器学习案例LightGBM的糖尿病遗传风险预测6.3 对预估统计数据进行血糖状态进行分类# 对预估统计数据进行血糖状态进行分类test = y_testtest_preds = pd.read_csv(test_preds.csv, encoding=gbk)data = pd.concat([test, test_preds], axis=1)data.columns = [血糖真实,”血糖预估”]# ① 正常血糖(血糖<6.1 mmol/L);# ② 高血压前期(6.1≤血糖<7.0 mmol/L);# ③ 高血压(血糖≥7.0 mmol/L);data1=data.loc[data[“血糖预估”] < 6.1].copy()data1[“状态”] = “正常血糖”data2=data.loc[(data[“血糖预估”] >= 6.1) & (data[“血糖预估”] < 7.0)].copy()data2[“状态”] = “高血压前期”data3=data.loc[data[“血糖预估”] >= 7.0].copy()data3[“状态”] = “高血压”data3.to_csv(hyperglycemia.csv, index=False, encoding=gbk)df = pd.concat([data1, data2,data3])# 查看目标人群的人数df[“状态”].value_counts()返回:机器学习案例LightGBM的糖尿病遗传风险预测将高血压血糖指标的预估结果与子代实际检测到的血糖结果进行对比,以均方误差为评价指标,结果越小越好,均方误差计算公式如下表所示:机器学习案例LightGBM的糖尿病遗传风险预测注:m为总人数from sklearn.metrics import mean_squared_error# 计算均方误差回归损失err1 = mean_squared_error(train_true_pred[true], train_true_pred[pred])*0.5print(均方误差: {}.format(err1))返回:均方误差: 0.2529676531763643机器学习案例LightGBM的糖尿病遗传风险预测点击下面链接 查看历史文章

3D U-Net:从稀疏注释中自学密集的体积分割

基于视频中的多模态情感识别进行语境动力学研究

基于深度众所周知相关分析的多模态情感识别

利用序列自学的深度自动编码器进行多模态情感识别

基于多模态深度自学在多重心理生理学信号和视频中的情感识别方法

重症监护医学信息统计数据库(电子病历统计数据集)MIMIC-III介绍

麻省理工+哈佛+清北等世界顶尖名校2500+课程?

新冠肺炎COVID疫情期信用风险评测筛查

DRG与病案首页的亲密关系

可用作做机器自学的开放医学影像统计数据集(附门牌号)

华为儿童节献礼:愿我们永不知天高地厚

人工智能在医疗中的应用

人工智能、统计数据分析、机器自学和深度自学的关系

2019年我国人工智能专利排名超过美国

28个最权威的国内外文献检索网站盘

深度自学VS机器自学的区别

脑机接口,这是什么,好黑科技啊

通过脑机接口我们观察到这些关于自学的秘密

CDAS统计数据分析师峰会医疗行业交流及资料下载

也许AI的发展终极是医疗的全面革新

医疗健康系统统计数据资产简要介绍及国内目前常见应用

速存 大统计数据/统计数据分析/机器自学相关资源

60款顶级开源工具综合介绍

人类为什么能从极少量的统计数据中做出判断?

走进帝都这家低调内敛有故事的医

医院故事:枪打出头鸟的人人自危以及医者仁心的对这个世界道别

药物研究相关的几个临床统计数据分析应用

7大板块 共同组成统计数据分析师的完整知识结构

可视化| 抗癌新进步:从热迹视角观察细胞内部

很多人会在医院留下回忆

很少人会在医院停下驻足

——行业所见所学,愿与你分享

机器学习案例LightGBM的糖尿病遗传风险预测

行走在白大褂里的董小姐

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务