实战天池精准医疗大赛之一 _ 数据分析

#算法实战

1. 赛题说明

  天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测,这是明天即将开始的天池大数据比赛。赛题名字看起来很高深,其实是根据年龄,性别,肝功,血常规等体验指标,预测血糖值。数据挺少的,特征 40 个左右,训练集 5000 多个实例,测试集 1000 个实例。任何机器都能很快跑完。比赛地址:

https://tianchi.aliyun.com/competition/introduction.htm?spm=5176.100066.0.0.57e6e8dfMg8Z8V&raceId=231638

2. 预处理

(1) 缺失数据

  有大量的缺失值,特征分四类,分别是乙肝、血常规、肝功能、肾功能,一般的缺失值都是缺失整个类别数据(由于患者未做某项检查)。除血常规以外,其余三项都有大量的缺失值,尤其是乙肝类检查,多一半都是空值。如果去掉这些数据,将会损失 3/4 的数据量。假设:医生不要求做该项检查,说明他认为该项指标基本正常,则在指标的正常范围内取随机值填充。

(2) 其它操作

  替换去掉其中中文字符

3. 数据分析

(1) 相关性分析:

  岁数与血糖的相关性最大为 0.32,甘油三酯相关性 0.23,还有年龄,碱性磷酸酶,白细胞计数等 6 项指标在 0.15 左右。(data.corr(), data.cov())

(2) PCA 降维:

  前 15 个特征约占信息量的 99.8%

(3) 分析血糖值分布:

绝大多数分布在 4-15 之间,比赛前期可将此范围之外的认为噪声。

4. 算法

(1) 算法分析

  这是一个有监督的回归问题,此比赛基本可以定位成特征工程加调参问题。预计先使用 GBDT 和随机森林,后面集成多个模型。因为数据少,主要注意过拟合问题,可能使用先分类后回归的方式。注意回归不是按正确率计算结果的,此题根据题目要求,评估指标为 MSE

(2) 迭代分析

  左图是迭代与误差的关系,迭代到 100 次后,测试集误差不再下降,训练集还在下降,好像开始过拟合,当然这与我设置的学习率相关,右图是迭代后计算的特征权重排序。

(3) 查看预测的主要出错位置

  从训练集中切出 10% 作为测试,蓝线是实际值,橙线为预测值,可以看到,由于大部分值分布在 5-6 之间,因此所有预测都被拉到了这个区间之内。忽然想到之前“微信互动”预测中有一种做法,就是找到一个值,将训练集中所有实例都预测成该值,再计算误差。代入此题,试了一下,设为 5.6 分时误差最小,为 2.4,比 gbdt 的 2.2 误差略高一些,说明算法比瞎蒙还是好一点。

5. 一些想法

  1. 一般去医院看病有问题的居多,所以相对正常值有些偏差,医生也可能作出有倾向性的判断。

  2. 该题可以把已有的知识和算法融合,使用一些现成的数据,比如正常范围。

  3. 周末检查拿结果的可能是比较特殊的病人。

  4. 岁数分成几段,更具代表意义。

  5. 可将数据修改为正常值,偏高,偏低,几个层次,做分段特征。

  6. 考虑病情比较严重的情况,可能需要分开处理,作为噪点先拿出来。

  7. 预测只是想知道被测试人是否为糖尿病,而不关注是预测与实际值的微小差距,所以也可以将其处理为分类问题。

  8. 可能需要对误差函数和评价函数做微调。

6. 一些尝试

  1. 在本地测试,删除所有缺失数据的实例,预测效果好很多。

  2. 如不考虑大于 10 的数据,预测效果好很多。

  3. 目前在特征工程方面,只做了修改缺失值,而排序特征,离散特征,统计特征都还没做,算法方面只使用了 sklearn 自带的 gbdt,其它算法也还没试。