数据挖掘实战之天池精准医疗大赛(1)——赛题与数据

首先介绍题目与数据:

特别提供一下数据,供后来看到的盆友下载研究(现在官网上剩下的数据是复赛的了),测试数据分AB榜,不了解的去看天池平台的介绍:

链接:https://pan.baidu.com/s/1SGZi_o1UVobHfy275onoOw 密码:rf6s

竞赛题目

中国是世界上糖尿病患者最多的国家,病人达到1.1亿,每年有130万人死于糖尿病及其相关疾病。每年用于糖尿病的医疗费用占中国公共医疗卫生支出的比例超过13%,超过3000亿元。本次大赛旨在通过糖尿病人的临床数据和体检指标来预测人群的糖尿病程度,以血糖浓度为指标。参赛选手需要设计高精度,高效,且解释性强的算法来挑战糖尿病精准预测这一科学难题。

竞赛数据

大赛初赛数据共包含两个文件,训练文件d_train.csv和测试文件d_test.csv,每个文件第一行是字段名,之后每一行代表一个个体。文件共包含42个字段,包含数值型、字符型、日期型等众多数据类型,部分字段内容在部分人群中有缺失,其中第一列为个体ID号。训练文件的最后一列为标签列,既需要预测的目标血糖值。

大赛复赛数据共包含两个文件,训练文件g_train.csv和测试文件g_test.csv,每个文件第一行是字段名,之后每一行代表一个个体,部分字段名已经做脱敏处理。文件共包含85个字段,部分字段内容在部分人群中有缺失,其中第一列为个体ID号。训练文件的最后一列为标签列,既需要预测的是否有糖尿病的类别。

评估指标

初赛期间,参赛选手需要提交对每个人的糖尿病血糖预测结果,以小数形式表示,保留小数点后三位。该结果将与个体实际检测到的血糖结果进行对比,以均方误差为评价指标,结果越小越好,均方误差计算公式如下:

其中m为总人数,y'i 为选手预测的第i个人的血糖值,yi 为第i个人的实际血糖检测值。

撸起袖子加油干:

既然是机器学习实践,不过多赘述算法概念和原理,而是以实战项目为主线,从一个纸上谈兵的爱好者转变为实践者,详述算法大赛过程中每一个流程和细节。

这一系列文章的题纲如下:

1.认识问题及解题思路

2. sklearn工具包简介

3.数据分析及数据预处理

4.特征工程

5.模型构建与总结

6.复赛简介


Part 1-1:

首先对数据集有一个感官的认识。

import pandas as pd
file = 'd_train_20180102.csv'
data = pd.read_csv(file,encoding = 'gb18030')
print(data.columns)
print(data.head())

Index(['id', '性别', '年龄', '体检日期', '*天门冬氨酸氨基转换酶', '*丙氨酸氨基转换酶', '*碱性磷酸酶',
       '*r-谷氨酰基转换酶', '*总蛋白', '白蛋白', '*球蛋白', '白球比例', '甘油三酯', '总胆固醇',
       '高密度脂蛋白胆固醇', '低密度脂蛋白胆固醇', '尿素', '肌酐', '尿酸', '乙肝表面抗原', '乙肝表面抗体', '乙肝e抗原',
       '乙肝e抗体', '乙肝核心抗体', '白细胞计数', '红细胞计数', '血红蛋白', '红细胞压积', '红细胞平均体积',
       '红细胞平均血红蛋白量', '红细胞平均血红蛋白浓度', '红细胞体积分布宽度', '血小板计数', '血小板平均体积',
       '血小板体积分布宽度', '血小板比积', '中性粒细胞%', '淋巴细胞%', '单核细胞%', '嗜酸细胞%', '嗜碱细胞%',
       '血糖'],
      dtype='object')

   id 性别  年龄        体检日期  *天门冬氨酸氨基转换酶  *丙氨酸氨基转换酶  *碱性磷酸酶  *r-谷氨酰基转换酶   *总蛋白  \
0   1  男  41  12/10/2017        24.96      23.10   99.59       20.23  76.88   
1   2  男  41  19/10/2017        24.57      36.25   67.21       79.00  79.43   
2   3  男  46  26/10/2017        20.82      15.23   63.69       38.17  86.23   
3   4  女  22  25/10/2017        14.99      10.59   74.08       20.22  70.98   
4   5  女  48  26/10/2017        20.07      14.78   75.79       22.72  78.05   

     白蛋白  ...   血小板计数  血小板平均体积  血小板体积分布宽度  血小板比积  中性粒细胞%  淋巴细胞%  单核细胞%  嗜酸细胞%  \
0  49.60  ...   166.0      9.9       17.4  0.164    54.1   34.2    6.5    4.7   
1  47.76  ...   277.0      9.2       10.3  0.260    52.0   36.7    5.8    4.7   
2  48.00  ...   241.0      8.3       16.6  0.199    48.1   40.3    7.7    3.2   
3  44.02  ...   252.0     10.3       10.8  0.260    41.7   46.5    6.7    4.6   
4  41.83  ...   316.0     11.1       14.0  0.350    56.6   33.1    9.1    0.6   

   嗜碱细胞%    血糖  
0    0.6  6.06  
1    0.8  5.39  
2    0.8  5.59  
3    0.5  4.30  
4    0.6  5.42  

[5 rows x 42 columns]
 
 
round(data.describe())
  id 年龄 *天门冬氨酸氨基转换酶 *丙氨酸氨基转换酶 *碱性磷酸酶 *r-谷氨酰基转换酶 *总蛋白 白蛋白 *球蛋白 白球比例 ... 血小板计数 血小板平均体积 血小板体积分布宽度 血小板比积 中性粒细胞% 淋巴细胞% 单核细胞% 嗜酸细胞% 嗜碱细胞% 血糖
count 5642.0 5642.0 4421.0 4421.0 4421.0 4421.0 4421.0 4421.0 4421.0 4421.0 ... 5626.0 5619.0 5619.0 5619.0 5626.0 5626.0 5626.0 5626.0 5626.0 5642.0
mean 2866.0 46.0 27.0 28.0 87.0 39.0 77.0 46.0 31.0 2.0 ... 253.0 11.0 13.0 0.0 57.0 34.0 7.0 2.0 1.0 6.0
std 1656.0 13.0 14.0 23.0 26.0 41.0 4.0 3.0 4.0 0.0 ... 60.0 1.0 2.0 0.0 8.0 7.0 2.0 2.0 0.0 2.0
min 1.0 3.0 10.0 0.0 23.0 6.0 57.0 30.0 7.0 1.0 ... 37.0 7.0 8.0 0.0 14.0 8.0 3.0 0.0 0.0 3.0
25% 1433.0 35.0 20.0 15.0 70.0 18.0 74.0 44.0 29.0 1.0 ... 213.0 10.0 12.0 0.0 52.0 29.0 6.0 1.0 0.0 5.0
50% 2870.0 45.0 24.0 21.0 84.0 26.0 77.0 46.0 31.0 1.0 ... 249.0 11.0 13.0 0.0 57.0 34.0 7.0 2.0 1.0 5.0
75% 4303.0 54.0 29.0 32.0 100.0 44.0 80.0 48.0 33.0 2.0 ... 289.0 11.0 15.0 0.0 62.0 38.0 8.0 3.0 1.0 6.0
max 5732.0 93.0 435.0 499.0 374.0 737.0 100.0 54.0 66.0 7.0 ... 745.0 15.0 25.0 1.0 88.0 76.0 23.0 22.0 4.0 38.0
data.shape
(5642, 42)

训练集共5642个样本,42个字段,除去‘血糖’(label)共41个‘特征’。整体上看这样的数据给出了还是很漂亮的,我们经过简单处理可以直接调包预测,大神看到这样的数据恐怕几十分钟就可以直接作出一个效果还不错的模型,称之为baseline。
拿到题目之后其实首先,新手会发愁,哦,我怎么读取数据,我怎么了解一下数据呢。数据挖掘的第一步其实是使用一个核心工具库pandas.新手在实践之前想必仅仅了解过pandas,不实际操作数据处理难以熟练掌握。


简要叙述pandas:
对于新手,pandas这一关十分重要!pandas主要有Series及DataFrame两种数据结构,网上有一些一节课介绍pandas的课,看了仍然不会用,因此,需要系统的学习它常用功能,课程介绍都很混乱,其原因是时间不足走马观花,而pandas重在实践性。
此处最建议的是pandas的官方文档。鄙人后续可能会根据自己的应用情况撰写一份教程吧,不过也脱离不开官方文档。
如此庞大的文档看起来多头疼!没关系,10 Minutes to pandas 这是一个十分简洁的教程,看英文头疼?博客里有一些大佬翻译成了中文@。@不过在此不链接了。通过这一文档,可以对DF对象索引、切片、筛选、运算、排序、缺失值处理等基本操作快速掌握,建议边学边练(十个小时)不要糊弄过去~~另外,多熟练pandas今后很有帮助,文档中Tutorials有不错的练习供初学者学习。

 
 

在认识问题的开始,我们用read_csv读入CSV文件,columns,head,tail,describe等方法可以先对数据集有一个大体认识。(如上)

对于这41个字段,均存在不同程度的缺失,在第二部分将介绍对数据的清洗问题。41个字段可以分为几组:分别是肝功能、肾功能、乙肝、血常规,一般缺失都是整个类别缺失(由于此人未做某项检查)。统计每一个字段缺失情况,乙肝缺失情况极为严重,以至于在后期我们一般把这一组特征都去掉了而不进行填充。

data.isnull().sum()
id                0
性别                0
年龄                0
体检日期              0
*天门冬氨酸氨基转换酶    1221
*丙氨酸氨基转换酶      1221
*碱性磷酸酶         1221
*r-谷氨酰基转换酶     1221
*总蛋白           1221
白蛋白            1221
*球蛋白           1221
白球比例           1221
甘油三酯           1219
总胆固醇           1219
高密度脂蛋白胆固醇      1219
低密度脂蛋白胆固醇      1219
尿素             1378
肌酐             1378
尿酸             1378
乙肝表面抗原         4279
乙肝表面抗体         4279
乙肝e抗原          4279
乙肝e抗体          4279
乙肝核心抗体         4279
白细胞计数            16
红细胞计数            16
血红蛋白             16
红细胞压积            16
红细胞平均体积          16
红细胞平均血红蛋白量       16
红细胞平均血红蛋白浓度      16
红细胞体积分布宽度        16
血小板计数            16
血小板平均体积          23
血小板体积分布宽度        23
血小板比积            23
中性粒细胞%           16
淋巴细胞%            16
单核细胞%            16
嗜酸细胞%            16
嗜碱细胞%            16
血糖                0
dtype: int64
然后我们看一下label的情况:

tr_y = data.loc[:,'血糖']
tr_y.describe()
count    5642.000000
mean        5.631925
std         1.544882
min         3.070000
25%         4.920000
50%         5.290000
75%         5.767500
max        38.430000
Name: 血糖, dtype: float64
最小是3.07,最大为38.43,均值为5.63,我们通过统计图看一下更为直观:

 
这是一个分布极不平衡的回归问题,血糖有一个异常值38,其次20-25之间有三个值,血糖值绝大多数分布在3-10之间。

这样的回归问题应如何应对呢?不要急,我们先总结一下上述准备工作:

熟悉pandas工具库,读取数据,对数据字段情况、缺失、预测值分布等了解一番,磨刀不误砍柴工,新手应对做好准备工作,再着手结合具体问题分析思路吧!


猜你喜欢

转载自blog.csdn.net/xutiantian1412/article/details/79196958
今日推荐