在18年1月参加了天池精准医疗大赛-人工智能辅助糖尿病遗传风险预测。我国有1.1亿人患有糖尿病,是世界上糖尿病患者最多的国家,每年用于糖尿病的医疗费用超过3000亿,与我们赛题相关的妊娠糖尿病是其中一大类。妊娠糖尿病多发生在怀孕3个月后,分娩后大部分恢复正常,再次怀孕时复发率高达52-69%,产后5-16年大约有17-63%发展成2型糖尿病。除了对孕妇的伤害外,妊娠糖尿病还可能提高胎儿发生先天畸形和多种并发症的几率。我们的任务是根据青梧桐公司提供的女性孕期体检信息和基因位点信息(SNP基因突变位点)来预测受检者未来是否会患有妊娠糖尿病。

我们知道医疗领域经常会遇到数据量少、数据质量差的情况,本次比赛的数据量就比较小(训练集只有几千个样本),正负样本比接近1:1,共有84个特征,其中有61个离散特征,23个连续特征,有8个特征缺失值达到50%以上,评测指标为F1值,评价方式是每天抽取测试集的60%进行随机评测。所以我们认为在较少的样本数据,较多的特征信息中挖掘出有用的、解释性强的特征数据,降低模型过拟合,做到线上线下预测结果的同步与稳定是此次比赛的关键。

此次比赛,我们的工作大概可以分为以下四个部分

  1. 特征理解分析及可视化;
  2. 特征工程;
  3. 建立模型;
  4. 模型融合及后处理

1 特征理解分析及可视化

我们使用特征与目标值相关性系数与未调参的Adaboost,GBDT,XGBoost,LightGBM等模型的重要性排序初步筛选出了35个特征,然后对所选特征进行单变量分析,因为通过单变量分析筛选出来的特征是比较鲁棒的。我们这里进行的特征筛选并不是最终入模的特征,而是通过对这些特征的分析对数据有一个初步的了解,然后选择出少量的、最重要的特征,后期对其进行高阶特征的组合以发现特征间的内在联系。

  • 对于离散特征,我们判断该特征取每一个离散值时患病比例是否有较大差别,如果差别较大,则认为该特征为重要特征,如果差别不大,则认为该特征不是重要特征。
  • 对于连续特征,我们判断该特征对于是否患病的分布是否有较大差别(对患病和没患病的分别画图,看是否重合),若差别较大,则认为该特征为重要特征,否则,认为该特征不是重要特征。

比如:snp34对患病比例的影响图中,当特征值分别取0,1,2,3时,患病比例的差别较大,所以认为该特征为重要特征。相反,在snp21对患病比例的影响图中,特征值取0,1,2,3时患病比例均在0.45到0.50之间,差别较小,认为该特征不是重要特征。连续特征VAR00007患病样本和非患病样本的样本分布差别较大,而Lpa的差别较小,因此认为VAR00007是重要特征而Lpa不是。

经过分析,我们得到了17个重要的离散特征,分别为: 孕前体重,Wbc、SNP8 ,SNP10 ,SNP20 ,孕次, 产次,BMI分类,SNP24,SNP30,NP31,SNP33,SNP34, SNP37 ,SNP40 ,SNP41,SNP53;重要的连续特征为VAR00007.

然后对筛选出来的重要特征进行数据可视化,分析其特征与特征之间,特征与标签之间的内在联系,分别做了散点图、直方图、密度图、箱线图,热力图,得出以下结论:

特征重要性总结

  1. VAR00007越高越容易患GDM
  2. 超重、肥胖的孕妇容易患GDM
  3. 高龄孕妇容易患GDM
  4. 多孕多产次的孕妇易患GDM
  5. 具有DM家族史的孕妇GDM的发病率更高
  6. 当前身体状况偏差也会对GDM发病率升高
  7. 血压偏高的孕妇GDM的发病率偏高
  8. SNP34、SNP37等单核苷酸多态性以及联合多态性
  9. SNP34、SNP37组合可以看到100%患病的样本;

特征工程

构建重要的组合特征:

为了得到一些不易于被发现的重要特征,我们对之前分析得到的重要特征进行特征间加减乘除的两两组合,构造了一些高阶组合特征。首先使用原始特征构建模型得出F1值,对重要特征进行循环交叉组合,选择时使用贪心算法,若加入该组合特征后交叉验证的F1值有提高,则选择加入组合特征,若没有提高则不添加组合特征,成绩得到明显提升。这样进行特征组合虽然有效,但花费了我们太多时间,效率较低,因为并不是所有的特征组合都是有意义的。

比赛过后随着学习的不断深入我也总结了一种有效的特征组合方法,使用筛选出来的重要特征对训练集建立一棵决策树,从根节点到叶节点的每一条路径都可以看成一种特征组合方式。

以点击预测问题(二分类)为例,假设原始输入特征包含年龄、性别、用户类型(试用期、付费)、物品类型(护肤、食品等)4个方面的信息,并且根据原始输入和标签(点击/未点击)构造出了决策树,如图所示。具体来说,就有以下4种特征组合的方式。

上表是两个样本信息,那么第1个样本按照上述4个特征组合就可以编码为(1, 1, 0, 0),因为同时满足1,2,但不满足3,4。同理,第2个样本可以编码为(0, 0, 1, 1),因为它同时满足3,4,但不满足1,2。

特征选择:

我们主要使用手动的前向搜索和自动的后向搜索的策略,筛选出了35个特征入模:

  1. 前向搜索(一个一个往上加):综合考虑特征与目标值相关性系数与调参后的Adaboost,GBDT,XGBoost,LightGBM等模型的重要性排序,若加入该特征后交叉验证的F1值有提高,则选择加入该特征,若没有提高则不添加该特征。
  2. 反向搜索(一个一个往下减):递归消除特征法(包装法,recursive feature elimination,RFE),用一个基模型来进行多轮训练,每轮训练后移除拥有最小绝对值权重的特征,再基于新的特征集进行下一轮训练,最终找到最优的特征数量。sklearn的RFECV可以通过交叉验证的方式执行递归消除特征。

过滤法:方差筛选,相关性系数,互信息(信息增益),卡方检验(检验某个特征分布和输出值分布之间的相关性);嵌入法:L1正则化

对于类别型特征我们分别采用了序号编码和独热编码:

类别间具有大小关系的数据进行序号编码。例如血压,可以分为低、中、高三档,并且存在“高>中>低”的排序关系。序号编码会按照大小关系对类别型特征赋予一个数值ID,例如低表示为1,中表示为2、高表示为3,转换后依然保留了大小关系。

类别间不具有大小关系的特征进行独热编码。如:血型,一共有4个取值(A型血、B型血、AB型血、O型血),独热编码会把血型变成一个4维稀疏向量,A型血表示为(1, 0, 0, 0),B型血表示为(0, 1, 0, 0),AB型表示为(0, 0,1, 0),O型血表示为(0, 0, 0, 1)。

对连续特征进行归一化:

由于训练数据集中数值型数据较多,所以为了消除数据特征之间的量纲影响,我们对数值型特征进行归一化处理,使各指标处于同一数量级,不同指标之间具有可比性。但实验结果并没有太大的改观,后来我们想可能是因为一般是通过梯度下降法求解的模型通常是需要归一化的,不同特征的参数更新速度变得更为一致,容易更快地通过梯度下降找到最优解。如:线性回归、逻辑回归、支持向量机、神经网络等模型。而我们主要使用的是以决策树为基学习器集成模型,决策树在进行节点分裂时主要依据数据集D关于特征x的信息增益比,而信息增益比跟特征是否经过归一化是无关的,归一化并不会改变样本在特征x上的信息增益,所以进行归一化后效果才没那么明显。

特征工程是将原始数据转化为特征,更好表示预测模型处理的实际问题,提升对于未知数据的准确性。因为现实生活中,数据基本上都是满足正太分布的,所以为了更好的描述未知数据,我们对一些长尾型连续特征进行了log(1+x)变换,将其转换为正太分布型数据。

缺失值处理:

如果一个特征缺失值较大而且是非重要特征我们选择直接删除,如果一个样本特征缺失较多我们也选择直接删除。然后对离散特征采用onehot后不处理缺失值,即1变成[1,0,0], 2变成[0,1,0], 3变成[0,0,1],缺失变成[0,0,0]。对于连续特征分别进行零,均值,众数,中位数,最近邻填充,通过交叉验证对比其效果,实验结果显示选取均值进行填充线上效果较好。

建立模型

模型选择:

我们在选择模型时主要依据以下两个条件:(1)在无需过多的针对数据分布特点进行的调参下依然能够使得线上评分较高(2)线上和线下F1值尽量接近。

在复赛的比赛过程中,我们选用了LR、SVM、决策树、随机森林、Adaboost、GBDT、Xgboost、Lightgbm等多种模型进行了初始的预测,在初步预测之后选定模型为GBDT,Lightgbm,Xgboost,LR。

模型评估:

比赛刚开始时我们使用的留出法进行模型评估,我们把样本按比例分成两部分,70% 的样本用于模型训练;30% 的样本用于模型验证,我们数据集本来就小使用这种方法不能充分的利用数据训练模型,而且训练集和测试集的划分严重影响最终结果,往往我们在线下测试结果较好,上线评测的时候成绩并没有很大的提高,有时成绩还下降很多,说明我们的模型产生了过拟合。

为了解决这个问题我们使用了10折交叉验证:也就是将全部样本划分成10个大小相等的样本子集;每次选九份作为训练集,剩下的一份为验证集,进行模型的训练和评估;最后把10次评估指标的平均值作为最终的评估指标。

超参数调优:

gbdt的参数有哪些,如何调参 ?
Boosting 参数:

  1. n_estimators 最大基学习器的个数,太小欠拟合,太大过拟合
  2. learning_rate 学习率,太大过拟合,一般很小0.1,和n_estimators一起调
  3. subsample 子采样,防止过拟合,太小欠拟合。GBDT中是不放回采样

CART参数:

  1. max_features 最大特征数
  2. max_depth 最大树深,太大过拟合
  3. min_samples_split 内部节点再划分所需最小样本数,越大越防过拟合
  4. min_weight_fraction_leaf 叶子节点最小的样本权重和。如果存在较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。越大越防过拟合
  5. max_leaf_nodes:最大叶子节点数 ,太大过拟合
  6. min_impurity_split:节点划分最小不纯度
  7. presort:是否对数据进行预分类,以加快拟合中最佳分裂点的发现。默认False,适用于大数据集。小数据集使用True,可以加快训练。是否预排序,预排序可以加速查找最佳分裂点,对于稀疏数据不管用,Bool,auto:非稀疏数据则预排序,若稀疏数据则不预排序

超参数调优方面我们使用了网格搜索,先使用较广的搜索范围和较大的步长,来寻找全局最优值可能的位置;然后会逐渐缩小搜索范围和步长,来寻找更精确的最优值,降低所需的时间和计算量。

GBDT调参步骤:

  1. 使用默认的参数,对进行数据拟合;
  2. 选择一个较小的步长(learning rate=0.1)对迭代次数(n_estimators)进行网格搜索。
  3. 然后对决策树的参数进行寻优 (max_depth,min_samples_split,min_samples_leaf,max_features)
  4. 首先对决策树最大深度max_depth和内部节点再划分所需最小样本数min_samples_split进行网格搜索。【min_samples_split暂时不能一起定下来,因为这个还和决策树其他的参数存在关联】
  5. 接着再对内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一起调参;min_samples_split要做两次网格寻优,一次是树的最大深度max_depth,一次是叶子节点最少样本数min_samples_leaf。 【观察min_samples_split的值是否落在边界上,如果是可以进一步寻优】
  6. 对最大特征数max_features进行网格搜索。做完这一步可以看看寻找出的最优参数组合给出的分类器的效果。
  7. 可以进一步考虑对子采样的比例进行网格搜索,得到subsample的寻优参数
  8. 回归到第2步调整设定的步长(learning rate)和迭代次数(n_estimators);通过减小步长可以提高泛化能力,但是步长设定过小,也会导致拟合效果反而变差。

模型融合及后处理

模型融合:

相对多数投票法:得票最多的类标记作为最终类标记,若有多个最高得票,随机选择其中一类输出。

绝对多数投票法:得票超过半数的作为最终类,若票数都少于参数,就拒绝预测,比较强势、精致。

加权投票法:每个基模型投票带权重,有的基模型比较强投票分量重,比如狼人杀里警长一个人1.5票。

stacking 法:将多个初级学习器(基模型)的输出作为新的训练集,用来训练一个新的二级模型。使用交叉验证法产生新的训练集。每个学习器都在原训练集上做k折交叉验证,用其中的k-1折训练,其余一折做预测,然后合并k折的预测结果组成一列新的变量,用于训练二级模型。新测试集的产生方式与新训练集产生相似,如上图。每一折模型训练完毕后都要对原测试集打分,然后将k折打分结果求平均分,作为新的变量。n个学习器最终产生n个新变量,这些变量与新训练集的变量一一对应,可作为新的测试集用于二级模型的测试。stacking法缺点是操作复杂。优点是使用了cv,结果会更加稳健。

blending(没有交叉验证的stacking),缺点是使用了更少的数据,没有做cv,结果不够稳健,优点是比stacking快。

模型使用的是xgboost的分类,5折交叉验证。这类问题大多数都使用梯度提升决策树算法(GBDT类),这里主要的技术点是调参,我是用sklearn的GridSearchCV实现调参。其中一个核心的参数是scale_pos_weight,它指定了正反例的权重,直觉是:“患病者”的数据应该更重要。这个值我也是通过调参找到了训练集对应的最佳值。设置后A榜成绩提高了,B榜试的少没法下结论。 使用scale_pos_weight引发的问题是,预测的结果分布和训练集不一致。如果想要分布一致,简单地可以把判断标准从0.5向上或向下调,规范的一点的方法是做排序之后取前N个。 大家好像都看到了结果的分布问题,于是最后一天,在群里讨论预测结果里有多少个1。

把几个使用过的模型得分放在了下表中。

后处理:

后处理对线上的结果影响非常大。同一个模型,同一个参数,但后处理不好,成绩就会差很多。

在预测的结果中,往往会出现正例与负例预测概率接近的情况。比如说,模型预测正例的概率为0.499,负例的概率为0.501。这时候,模型就会将该结果判为负例。而由于我们的测试指标为F1值,将不确定的结果判为正例能够更好的提高我们的F1值(这也符合我们的常识,有很好的可解释性,在医疗中往往会不排除任何有可能患病的可能)。因此我对数据进行了后处理,利用sigmoid函数(y=1/(1+exp(-x)))对预测进行了修正。我们要不断尝试确定分类阈值。

根据以下提升度表选择阈值:

11 共产主义接班人 中国人轻轻轻

VAR00007:

  • VAR00007越高越容易患妊娠糖尿病,怀疑是胰岛素抵抗指数

RBP4(视黄醇结合蛋白-4):

  • RBP4是视黄醇转运载体,主要由肝脏和脂肪组织分泌。其作为脂肪细胞因子参与了肥胖、胰岛素抵抗,妊娠本身即可导致血清RBP4的升高,升高的RBP4可能参与了妊娠胰岛素抵抗的发生,并且影响了妊娠期妇女的糖、脂代谢

TG(甘油三酯)、孕前体重、孕前BMI和BMI分类:

  • 超重、肥胖的孕妇容易患妊娠糖尿病

年龄、孕次、产次:

  • 年龄越大,怀孕超过3次,产次超过2次容易患妊娠糖尿病,再次妊娠时复发率更高

DM家族史:

  • 具有DM家族史的孕妇GDM的发病率更高

 hsCRP(超敏C-反应蛋白)、wbc(白细胞):

  • 当前身体状况偏差容易也会对GDM发病率升高

收缩压、舒张压:

  • 血压偏高的孕妇GDM的发病率偏高

Wbc(白细胞含量):

  • 样本中显示白细胞含量越多,患糖尿病的风险越高,这有可能与病人的体质有关,白细胞含量越多,说明体内的抗原抗体反应更多。

SNP(单核苷酸多态性)的缺失:

  • SNP5、SNP46缺失GDM发病率偏高

  • SNP20、SNP53缺失GDM发病率偏低

 SNP34和SNP37:

  • SNP34或者SNP37为2时GDM发病率偏高,SNP37为3时发病率偏低. 妊娠糖尿病与胰岛素抵抗和胰岛B细胞功能障碍有关,因此影响GDM的是那些调节胰岛素的功能和分泌的蛋白质,如钙蛋白酶基因calpain 10(CAPN10)的SNP-43、-63

 SNP34和SNP37联合特征:

  • CAPN-10基因SNP-43、-63及其单倍型组合,SNP34和SNP37同时为2时GDM发病率为100%

弱特征

AST和ALT和GDM没有直接联系

另外Cr(肌酐)、BUN(血尿素氮)、CHO(胆固醇)、HDLC(高密度脂蛋白胆固醇)、LDLC(低密度脂蛋白胆固醇)、ApoA1(载脂蛋白A1)、ApoB(载脂蛋白B)特征重要性也均很低。

天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测相关推荐

  1. 《天池精准医疗大赛-人工智能辅助糖尿病遗传风险预测》模型复现和数据挖掘-论文_企业

    大赛概况 进入21世纪,生命科学特别是基因科技已经广泛而且深刻影响到每个人的健康生活,于此同时,科学家们借助基因科技史无前例的用一种全新的视角解读生命和探究疾病本质.人工智能(AI)能够处理分析海量医 ...

  2. 《天池精准医疗大赛-人工智能辅助糖尿病遗传风险预测》模型复现和数据挖掘-企业科研_论文作业

    大赛概况 进入21世纪,生命科学特别是基因科技已经广泛而且深刻影响到每个人的健康生活,于此同时,科学家们借助基因科技史无前例的用一种全新的视角解读生命和探究疾病本质.人工智能(AI)能够处理分析海量医 ...

  3. 关于【天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测】的思考

    在18年初与来自几所牛校的学生组队参加了第一次天池大赛,最终由于乌龙没能在初赛获得前一百的成绩,止步复赛.前几天观看了决赛现场的答辩,感触良多,记录如下. 首先上一波图,这是我们参加比赛是的程序和数据 ...

  4. 天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测总结

    github源代码 赛题地址 数据地址 1 问题描述 这个比赛的任务是预测妊娠期妇女是否患有妊娠期糖尿病,label只有一列,0表示未患病,1表示患病.一共有1000条训练样本,85维特征.线上测试样 ...

  5. 阿里天池大赛[人工智能辅助糖尿病遗传风险预测]赛后总结

    题目以及数据介绍 人工智能辅助糖尿病遗传风险预测 Github 代码以及数据 Github 初始思想 1.从头开始,先看一下初始数据以及数据的简单分析吧 训练数据,最后一列是血糖: A榜测试数据 第九 ...

  6. 打榜前10名:天池AI医疗人工智能辅助糖尿病遗传风险预测

    向AI转型的程序员都关注了这个号

  7. 基于XGBOOST的糖尿病遗传风险预测(1)

    博客基于Xgboost方法对糖尿病遗传预测风险进行预测,实际上是对人体血糖值的预测.论文以天池精准医疗大赛--人工智能辅助糖尿病遗传风险预测为背景,对其提供的数据进行人体血糖值进行预测. 本质而言是使 ...

  8. 【参赛记录】糖尿病遗传风险预测

    [参赛记录]糖尿病遗传风险预测 一.选题背景 二.题目任务 2.1 数据集字段说明 2.2 训练集说明 2.3 测试集说明 三.评估指标 四.数据分析和处理 4.1 缺失值和异常值分析 缺失值 异常值 ...

  9. 讯飞:糖尿病遗传风险预测Coggle挑战赛公开

    导入数据------------------------- train_df = pd.read_csv('./糖尿病遗传风险预测挑战赛公开数据/比赛训练集.csv', encoding='gbk') ...

最新文章

  1. docker设置国内镜像源
  2. 求某类型变量的大小(是否使用sizeof)
  3. 扎心了!腾讯扩招至5000人,99%应届生:与我无瓜
  4. CCPC-Wannafly Winter Camp Day8 (Div2, onsite) A 题 Aqours (精巧的树形DP)
  5. RMAN报错:ORA-19573: 无法获得 exclusive 入队
  6. c++水平制表符怎么用_怎么才能把字写得好看一些?这四个方法用对了,水平会提升...
  7. BP神经网络原理简介
  8. html管道符需要转义么,为什么String.split需要管道分隔符进行转义?
  9. 拓端tecdat|R语言使用灰色关联分析(Grey Relation Analysis,GRA)中国经济社会发展指标
  10. 2022前端面试笔试题及答案
  11. 如何开放云服务器端口
  12. Tortoise SVN Clean up失败的解决方法
  13. 转换优化 onnx模型
  14. 计算机总是提醒更新,电脑关机的时候总是提示系统正在更新怎么办?
  15. VPS与云主机指南:了解五个主要区别
  16. k8s集群-master节点迁移
  17. 关于python安装问题 0x80072f7d的解决方法
  18. 关于使用条码打印机指令打印汉字的问题
  19. 【JS】去除“确认重新提交表单”
  20. 相似度计算——欧氏距离、汉明距离、余弦相似度

热门文章

  1. 接口自动化——one
  2. String Ioc简介
  3. 深入浅出MySQL-学习笔记by CZF
  4. 如何搜索和阅读一篇论文及鉴别论文好坏
  5. 计算机应用基础差错解释,计算机应用基础名词解释:差错
  6. 新华三面试总结(二)
  7. android 动态渐变,Android 动态修改渐变 GradientDrawable
  8. 计算机导论二进制小数乘法,二进制计算
  9. CS231n-课程总结
  10. alpha在matlab中的作用,在MATLAB中用alpha值绘制圆圈