一、参赛背景
一条工程狗也有自己的数据挖掘梦,自己一直对算法感兴趣,期间关注了很多热门的公众号,天天在CSDN的博客下面学习大牛的经验,也学习了李航老师的《统计学习方法》、周志华老师的《机器学习》、《利用python进行数据分析》等基础入门书籍后,俗话说“站在岸上学不会游泳”,自己也跃跃欲试想参加一个比赛。感谢天池能提供一个这么好的平台。
二、赛题说明
天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测,天池大数据平台的一个算法大赛。需要选手根据年龄、体检日期、性别、肝功能检查结果、肾功能检查结果、血常规检查结果等特征数据去预测血糖值,构建出可解释性强的算法。初赛训练集中提供5642条数据,40个特征,测试集1000条数据,数据量偏少。评价指标为MSE,即均方差。比赛地址:
三、数据预处理
这部分主要是如何处理缺失值的问题。特征大概可以划分为四大类:肝功能、肾功能、血常规、乙肝(缺失数据均为整类缺失,即检查人没有做该部分的检查),除了血常规意外其他三大类均有大量缺失值,尤其是乙肝这一项,缺失值达到了一半以上。初步考虑:填充缺失量如此大的数据将带来无法控制的误差,可否简单认为是否做乙肝五项检查和血糖值之间有潜在联系。于是将乙肝五项转化为是否做乙肝检查一个特征。其他三大类的数据可以用均值、中位数、回归预测的方式填充。通过简单的可视化各项特征数据大致服从了正态分布,于是我这里采用了最简单常用的均值填充。
四、数据初步分析
(1)相关性分析:采用了皮尔逊相关系数,分析了各个特征和血糖值之间线性相关性,并按线性相关性对各个特征排序,使用的是scipy中的现有函数。其中排名前五的特征分别为年龄(0.265)、甘油三酯 (0.259)、低密度脂蛋白胆固醇(0.166)、总胆固醇(0.163)、*碱性磷酸酶( 0.162)。可以作为特征筛选的初步参考,但是皮尔逊相关系数只能衡量线性相关性,无法深入挖掘特征间的联系。但是优点是计算速度快,结果直观,取值范围是[-1,1],符号表示相关性的正负,绝对值表示相关强度。
(2)年龄分布:因为在皮尔逊相关系数中年龄相关性最高(后续采用xgboost发现年龄的重要度最高),故此单独分析了这个特征。最小的是3岁,最大的是93岁,均值45岁,1/4和3/4 中位数分别为35岁和54岁,符合正态分布。对训练集中年龄进行排序,发现从小到大为3、6、15、19、20,测试集中年龄均大于19岁,因此在这里将训练集中年龄为3、6的样本作为噪声处理。
(3)血糖值的分布:本次比赛预测的是血糖值,简单的可视化了一下血糖值的分布。可以发现血糖值的分布大多数集中在4-12中,其中有一个血糖值为38的点,可以作为异常值处理。
五、算法选择
根据前辈们的经验,xgboost是一个一拿到数据就可以优先尝试的算法,于是直接选择了比赛大杀器xgboost作为第一个算法模型。用了sklearn里的cv作为验证集调参。