您的位置:首页 > 其它

天池精准医疗大赛-血糖预测

2018-02-05 20:12 375 查看

先说结果

预赛排名110+,没能进复赛。

A榜0.81,170名的样子;B榜0.64,110名的样子。

各位前排大佬还是太厉害了,B榜最后第一名是0.59。

第一次做比赛,结果勉强还能接受吧。

大概认真做了两个礼拜的样子,还是有一定收获的。

问题与数据

初赛的题目是,根据人的一些指标,预测血糖值。指标基本是验血得到的,共有越40个。

根据MSE评分,每天有两次测评机会。

初赛数据量,训练集大约是5000多,测试集1000。

数据量还是比较小的,选了这样一个小数据量的比赛。觉得小数据量运行起来比较方便,不需要性能特别强大的机器;这个问题看起来也比较简单,很明显是一个回归问题,我这样一个新手容易下手。

其实后来发现这个比赛还是比较坑的:

测试集特别小,导致异常值对结果影响大,猜对一个异常值有很大收益。

数据分布不平衡,特别高的值比较少,但是对MSE影响大

缺失值特别多,有的特征缺失了80%以上

思路

以血糖7为分隔点,将训练集分为正常和不正常两个部分。

先用logistics回归做二分类;再对正常和不正常两个部分,分别用xgboost做回归;对于每一个测试样本,用logistics计算其属于正常和不正常的概率,再用两个xgboost回归得到两个值,将这两个值按概率加权求和作为最终结果。

数据预处理

为了充分利用数据,A榜公布答案后,把A榜的数据也放入了训练集。

缺失值处理

缺失值太多了,所以缺失值的处理其实很关键,但是我们没找到特别有效的缺失值填补办法。

最终采用均值填充。尝试过knn、svd等方法,效果不佳。

这里用了一个python库,
fancyimpute
,用起来特别方便。

特征处理

1. 丢弃了id、体检日期

2. 添加了 总胆固醇/高密度脂蛋白胆固醇,尿素/肌酐

3. 特征生成:开方、平方、取log、相乘

4. 数值型特征:对偏差大的特征,采用boxcox进行调整;非数值型特征,one hot

id这个放进特征里面,肯定是会过拟合的,所以删掉。体检日期one-hot之后,效果确实会变好一点,但是后来还是觉得删掉会比较好。

添加的两个特征是看资料找到的,应该是有一定医学意义的。

特征生成尝试了很多种方式,实际最后只有取log是有点用的。也看到有说用xgboost每棵树叶子的预测作为特征的,试了下完全没用。我们好尝试了加减乘除生成的特征,用上之后特征变的巨多,而且基本都没用。

训练集合里面有一个血糖高达38的值,去掉之后线下会变好,但是觉得如果去掉了可能高值会预测不出来,所以后来没有去掉。后来想了想可能去掉会好一点,这个高值的其他指标其实都还比较正常的。

特征选择

使用sklearn提供的SelectKBest,基于互信息和皮尔逊系数进行特征选择(效果不佳)

使用RFE进行特征选择(比较有效果)

根据系数的办法选出来的特征试了下都没什么用。。

RFE是比较有用的,在原本的40个特征下用RFE,发现去掉一些特征效果反而会变好?

调参方法

logistics二分类器,能调的参数比较少,调整参数的效果也不明显

xgboost,使用grid search调整参数

还看到一个用Bayesian什么的调参的工具,比grid search快不少

评价方法

为了保证模型稳定,采用了交叉验证

实际上cv数据集切分的不一样,对cv的结果影响也很大。如果某一份数据里面有个很大的血糖值,它的mse一定会爆炸。

所以线下cv时,用测试集的均值预测测试集得到一个mse,自己模型的mse与这个mse相比,作为判断模型好坏的依据。

线上和线下差的还是比较多的,就mse而言,线上一直都比线下好;线下有所改进,线上可能反而变差了。应该还是测试集太小的原因吧。

小总结

因为线下和线上不一致的原因,所以一直没啥改进。数据集太小了,导致改个seed结果都会很不一样。

就这个比赛而言,数据量还是太小了,后面还是试试kaggle去吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息