实战天池精准医疗大赛之二_再接再厉

1. 说明
之前参加的都是往期赛,新人赛,这是第一人参加正式比赛,先谈谈感受 。天池精准医疗已开赛一周,排行搒上大家整体的误差从0.9提升到0.8,也就是说一开始0.88分还名列前茅,一周之后,这个分数早已榜上无名了 。比想象中激烈,我也是反复出榜(榜单仅列出前一百名),偶尔侥幸进入前十,时刻准备着再次被踢出排行榜, 也算是体验了一把逆水行舟的乐趣 。很多时候反复实验仍然提高不了成绩,感觉完全没有方向,大家都在摸索,和一边做一边对照正确答案,确实不一样 。也有一些算法,我知道它,却不知道什么时候用它 。在此也记录一下经验教训 。
2. 特征工程
开始的时候做了一些特征工程,包括填充缺失值,为SVM计算排序特征,还找到化验单各项指标的正常的范围值,根据各项指标正常与否做离散特征,根据指标的合格数量计算统计特征等等 。但相对于简单地判断中值,均值,效果都没有明显地提高 。后来做了标准化,效果挺明显的,而且转换后缺失值就可以直接填0了 。也分析了一下,为什么正常范围没起到作用,化验之后不都是看这个吗?后来在肉眼观察血糖各个档位特征统计值的时候,发现血糖高者某些生化指标和整体均值有明显差异,但仍在正常范围之内,另外在不正常的情况下,差值的大小也很重要,所以这种一刀切的方法好像不行 。
3. 分析结果分布
本题预测结果是血糖值,大致分布如下:
我们把它称为大地和星空问题,大地指的是5-6之间的区域,80%以上的血糖都分布在这个区域,此区域也是容易被预测的,而上面星星点点的是星空,虽然数量不多,却起着决定性的作用 。这还要从评分公式说起:
由公式可知,评估指标是均方误差MSE的二分之一,其中m是实例个数,y’是预测值,y是实际值,关键是右上角的平方,它进一步放大了大的误差值 。拿测试集来说,其中有1000个实例,即m=1000,如果把某个实例5.5预测成5,它对误差的贡献是(5-5.5)^2 /2000=0.,如果把20预测成5,误差为(5-20)^2 /2000=0.1125,它是前者的900倍,这个距离可以在排行榜拉开好几百名的差距了 。这么看来,那些小的差异可以先不管 。再来看看训练集中血糖的分布:
一般把大于6.1的认为是高血糖,大于11.1的认为是糖尿病 。在训练集提供的5642个实例中,大于6.1的911个,大于11.1的97个 。如果测试集的分布与训练集一致,大约有17个实例血糖在11.1以上 。
但是在讨论群里面很多人对测试集的预测都没有超过10的,按测试数据估计,只占总人数1.7%的糖尿病人的误差就占了总误差的将近一半 。
再考虑这个题目要解决什么问题,如果根本测不出谁是糖尿病患者,只是纠结正常范围内的小误差,这算法就没意义了 。
一开始我的计算结果也是这样的,这可能是源于大家都在使用Boost迭代改进算法,它的原理是不断迭代,并在每次计算时加大前一次算错实例的权重,可以想见,本题中80%多都是正常血糖值,于是它模型拉向了均值,大量分枝在5附近做细小切分,后来试了等深分箱,也没什么用 。基于这个原因,我尝试修改了算法的损失函数,评价函数,实例权重等等,但效果都太好,这也可能因为我个人水平有限 。后来直接把回归问题改成了先分类后回归,效果还可以 。
4. 问题规模
本题是一个小规模数据的问题,因为数据量小,经常引发线上与线下评分不一致,而且容易造成过拟合,以及和测试集相关的作弊问题 。不过即使数据再少,也有20W+的数据,人的大脑也处理不了 。下面来看看不同数据量与算法选择的关系,从另一角度分析一下星空问题的解法 。假设下面三种情况: