机器学习之路-天池精准医疗大赛

天池精准医疗大赛是我参加的第一个数据挖掘类的比赛。

之前在许多网上的分享的资料的陪伴下,在Kaggle上的Titanic问题上折腾了一段时间,也熟悉了Python和一些非常好用的第三方库,以及一些常见问题的处理方式,所以对正式比赛也跃跃欲试。

整场比赛伴随着研究生一年级上学期的期末考试一起结束,整个过程疲惫却充实,在没有别人开源的思路和参考资料的情况下,整个过程踩了比想象中要多的坑,但是也有了许多收获,还算是一段美好的旅程。

精准医疗大赛的具体信息可以在阿里云天池上找到,数据以及相关的讨论应该也都可以下载和阅读。

地址:https://tianchi.aliyun.com/competition/information.htm?spm=5176.100067.5678.2.482c72b3UaU9rH&raceId=231638

接下来介绍一下处理这个问题的思路和细节。

一、数据集、问题求解

精准医疗这个比赛的数据集和测试集是比较有意思的,训练集有5600多条数据,特征有40个左右,可以大致划分为乙肝、血常规、肝功能、肾功能这么几类指标,还有一些体检者的基本信息,比如性别、年龄、体检日期等。

测试集有1000个样本,特征和训练集相同,训练的目标是预测测试集的样本的血糖,其实就是一个回归问题。

大赛主办方给出了损失函数为MSE,也就是均方误差。在这里想多说几句,均方误差确实是一个比较常用的评价指标,但是这个评价指标的缺陷在于,会放大错误回归的点给整体带来的影响。比如说,100个样本,90个样本的预测值和真实值差距很小,MSE的损失会非常小,但剩下10个如果差距大一些,带入MSE公式进行平方之后,整个样本集的损失就会被放大。(这点在后面再仔细讨论)

二、数据预处理

这次比赛的数据集有一个非常有趣的特点,就是数据缺失。

从行来看(样本角度),几乎每一个样本都有缺失的数据,缺失值从1到10个不等;从列来看(特征角度),只有寥寥几个特征是完整的(即毫无缺失)。

无论是训练集还是测试集,肝功能的四个特征缺失值都达到了40%,这种时候我选择将这4个特征舍弃。一个原因是从业务层面来安,肝功能和血糖值没有什么相关性;另一个原因就是缺失比例太大了,这些特征进入模型会导致模型的效果比较不稳定。

其他缺失的特征缺失比例保持在2%到5%左右,这种时候就只能选择去弥补缺失值。

缺失值的填充主要有三种方法,第一种是用中位数、平均数来填充;第二种是用拉格朗日插值法填充;第三种是用随机森林来填充缺失值。

在这个问题中,我个人比较倾向于第一种方法,因为效果是比较稳定的。用随机森林来填充的话,其实随机性很高,可解释性本身就很差,效果也不是很稳定。

另外再提一句,填充缺失值是线性模型使用的前提,而对于树模型的话,其实是对缺失数据不敏感的。

三、特征工程

在这次比赛中,我所做的特征工程主要分为了两个部分,第一个部分是尝试着进行了一些组合特征,另一个部分就是说对于后来为了适应自己所选择的模型而进行的特征选择。

1.组合特征

在做组合特征的时候,我才意识到自己选择了自己不是很适合的领域。医学领域是一个蛮需要知识积累的行业,所以在组合特征的时候,我是沿着这样的思路进行的:第一,去找寻已知的医学指标(数据集没有,但是可以通过数据集中的特征来构建该指标);第二,把同类的指标加在一起,构建成特征(比如把白蛋白、球蛋白加在一起)。

并且把每条数据缺失的特征个数作为一个特征,加入了特征集合。

2.特征选择

我们常见的模型基本可以分为两类,线性模型和非线性模型(树形),对于两种模型肯定是要做两套不同的特征。

两类不同的模型,特征选择所参考的因素也是不同的,这个在后面详细说。

关于归一化、平滑化等一些细节上的特征处理方法,在后续结合着具体选择的模型提及。

四、模型训练

1.线下测试集

开始模型训练前,先把训练集划分成7:3,前者是训练集,后者是线下验证集。

这里面有一个小技巧,就是像天池这种数据量比较小的比赛,数据分布是很难符合正态分布的,如果使用交叉验证,会出现每次做优化之后,在一些验证集上效果提升,另一些验证集上效果下降。这种时候就很难取舍,陷入困境。

我通常是把训练集7:3分开,然后通过做一些逻辑上已知的优化,看线下测试集和线上测试集的效果是不是同步的。如果不同步,就重新采样,以求得一个基本跟线上测试集同增同减的线下测试集。

2.回归模型

处理回归问题,常见的模型有线性回归、SVR、Xgboost。

先考虑了线性模型,对特征计算线性相关度(皮尔森系数、协方差),对特征进行选择,这个过程主要是去掉一些多重共线性的特征,以及线性相关度非常低的特征,降低模型复杂度,得到良好的繁华能力和较低的误差。

接下来计算了一下剩下的特征之间的方差,根据方差的大小进行了一定的筛选,因为较小方差对模型的扰动很小,可以去掉无必要的特征。

对于非线性模型,主要是看feature_importance,根据树模型自身的方法,选择一个阈值去选择特征,同样也需要过滤掉方差比较小的特征。

如果选择了线性模型的话,需要做归一化提高计算速度和效果,做平滑化来提高效果;如果选择了树模型,归一化和平滑化也是同样有意义的。

我分别使用了这三个模型进行了训练,除了Xgboost调参比较繁琐,整体训练时间还是比较快。

训练结束后,Xgboost效果最好,能达到0.84,svr略优于lr的效果。

3.问题分析

结合在之前提到过的MSE特点,这时候才考虑到看一看我们要预测的目标值(血糖)的分布,发现训练集中给的数据分布类似于“星空与草原”,也就是说,5600多个样本中绝大部分样本是稳定分布在血糖值为4到7的区间,然而大约有训练集10%左右的数据分布在7到16这个较大的范围内,甚至还有个别点的目标值是19。

也就是说,因为目标值过高的样本点太少,而且大部分样本点稳定在4-7这个小区间里,所以我们训练出来的模型整体预测的数值是偏低的。

换一个角度说,我们目前的预测结果对绝大部分样本是小误差的,有较大误差的是小众的那一部分点(分布在7-16的)。因为MSE自身的特性,这部分样本点贡献了绝大部分的损失,所以我们可以换一个思路,我们去优化这一小部分异常点,就可以很大程度降低损失,其实这也是针对评分公式进行优化。(如果损失函数是对数损失,我们要考虑的问题就是尽可能让更多的点被预测的准,因为每个样本点无论数值大小,对损失的贡献比重是相差无几的)

4.模型优化

那么我们怎么去优化那一小部分离群点呢?其实可以考虑的思路是很多的,比如将离群点分段,对于不同的区间,结合该区间存在的一些共性的特征去制定一些强规则去解决异常值预测的问题,把一个大的问题化解成多个容易解决的小问题;也可以从特征工程的角度去用机器学习的方法去训练分类器,我采用的就是后面这一种方法。

从医学角度来讲,6.6是正常血糖到高血糖的阈值,我选择了6.6为切割点,血糖大于6.6给一个1的标志位,小于等于6.6给一个0的标志,其实就是在特征列表里加了一列,从而把这个回归问题先转化成分类问题,先用训练集来给测试集分类,然后再把训练集切割开,分别做回归。

其实分类器的可选项并不是很多,大体来说有LR,SVM,Xgboost,LightGBM。逻辑回归对于这种特征少,样本多,特征之间线性相关度不好的数据集效果很一般,至于两个树模型的话其实效果是很相近的,而且LightGBM更容易过拟合一点(节点分裂特点导致),所以我选择用SVM和Xgboost两个分类器,训练了两个分类模型。

对于分类问题中正负样本不均衡的问题,SVM分类器中使用了上采样的方法解决,Xgboost通过调节自带参数解决(该参数调节正负样本分类错误的惩罚来解决正负样本不均匀的问题)。

两个分类器的特征选择思路和前面所提到的线性、树形特征选择思路是相似的,就不展开讲了。

接下来就是把样本分开,用高血糖去预测高血糖,用低血糖去预测低血糖,然后合并在一起,这个过程我使用了Xgboost,一方面是因为效果比较好,另一方面也是因为对过拟合的控制力更强一些(多参数限制)。

五、模型融合

模型融合一般就是整个比赛流程的最后一步了,模型融合的意义是提高模型整体的稳定性,提高模型的泛化能力。

这次比赛中由于时间原因,只是将两个模型融合了一下,一个是使用SVM分类后用Xgboost进行回归,另一个是使用Xgboost分类之后回归。

模型融合比较经典的方法是stacking,但stacking对数据集量比较大的情况效果较好,对于精准医疗这个比赛的数据量来说,还是直接给权重进行融合效果比较好。

最后SVM和Xgboost分类模型的权重分配为43%和57%。

六、一些感想和遗憾

由于自己在医学领域没有基础的世界观,在组合特征这一部分所做的事情还不够好,赛后开源的不少方案中特征工程都比自己做的优秀很多。不过也存在暴力组合特征参赛选手,个人还是觉得这种方法比较适合数据量小的训练集,而且容易使模型出现过拟合现象,很不适合应用于工业界。

自己处理异常血糖的数据预测时,只是抽象成二分类问题,其实可以继续分层向上做,效果应该会更好一些。同时,自己也没有尝试构建一些强规则,如果这些点都有一些尝试,模型融合的效果应该会整体提高很多。

最后想分享一下对比赛的理解。

其实无论是在天池还是Kaggle上的比赛,每个比赛都有自己属于的领域,比如推荐、比如计算广告、比如nlp或者图像识别等等,也有一些传统的没有被学术界大力发掘的领域,比如医疗等。

选择去做什么样的比赛的时候,还是需要慎重的考虑,一方面结合自己的兴趣,另一方面也要考虑赛题所相关的内容在工业界的应用、学术界的研究。比如推荐领域的比赛,很多思路都是成熟的,协同过滤、隐语义模型的SVD等等,计算广告里也有成熟的FM、FFM,这样的比赛可以直接的学习到很多领域内的思路,而不是像医疗这样把精力放在调参和建模上。

最后,仁者见仁,智者见智,所有努力过的生活都是一段美好的旅程。

猜你喜欢

转载自blog.csdn.net/daverain/article/details/79977045
今日推荐