天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测
一直想做一个天池大数据方面的比赛,以前一直没时间,正逢糖尿病风险预测比赛,阿里举办的,课题比较喜欢,哈哈
进入天池大数据竞赛中心,就可以看到相关信息以及数据,下载下来即可对其作分析。
打开其中的train列表,我们可以发现,每一个病例都有41个特征,外加“”血糖“”预测,如下图所示:
特征工程:
接下来对表格中的数据进行分析下,看看是不是有什么缺省值,数据不足的地方
数据总览:
import numpy as np
import pandas as pd
# 数据路径
data_path = 'E:\The_most_powerful_laboratory\Tianchi_bigData\AI_diabetes_prediction\The_program_and_Result\Tianchi_data\\'
# 选用pandas导入训练集,测试集
df_train = pd.read_csv(data_path+'d_train_20180102.csv')
df_test_A = pd.read_csv(data_path+'d_test_A_20180102.csv')
df_test_B = pd.read_csv(data_path+'d_test_B_20180128.csv')
df_test_A_answer = pd.read_csv(data_path+'d_answer_a_20180128.csv',header=-1)
id 性别 年龄 体检日期 天门冬氨酸氨基转换酶 丙氨酸氨基转换酶 *碱性磷酸酶 *r-谷氨酰基转换酶 \
0 1 男 41 12/10/2017 24.96 23.10 99.59 20.23
1 2 男 41 19/10/2017 24.57 36.25 67.21 79.00
2 3 男 46 26/10/2017 20.82 15.23 63.69 38.17
3 4 女 22 25/10/2017 14.99 10.59 74.08 20.22
4 5 女 48 26/10/2017 20.07 14.78 75.79 22.72
5 6 女 74 18/10/2017 23.72 22.59 81.23 23.35
6 7 男 31 21/09/2017 24.97 25.53 109.03 65.42
7 8 男 55 21/09/2017 37.32 40.03 88.49 25.15
8 9 男 39 16/10/2017 21.70 39.17 102.91 67.09
9 10 女 35 10/10/2017 18.89 15.79 78.21 25.75
10 11 男 47 13/10/2017 27.33 35.76 80.26 84.97
11 12 男 50 10/10/2017 22.89 28.46 77.54 48.16
12 13 女 48 19/10/2017 30.11 34.70 92.67 16.39
13 14 女 36 11/10/2017 16.82 11.80 67.79 13.16
14 15 女 37 27/09/2017 24.58 24.64 96.43 27.79
15 16 女 43 28/09/2017 20.07 14.81 72.11 33.98
16 17 男 77 24/10/2017 18.49 17.29 104.91 41.33
17 18 男 42 16/10/2017 24.71 30.26 95.70 37.97
18 19 男 39 30/10/2017 31.44 43.97 92.58 35.84
19 20 男 38 28/09/2017 23.58 31.19 102.16 44.01
20 21 男 30 29/09/2017 33.25 67.19 82.22 59.91
21 22 男 51 26/10/2017 26.53 20.44 67.03 25.84
22 23 女 38 19/10/2017 24.13 34.02 77.32 18.78
23 24 女 33 30/09/2017 15.77 11.43 95.86 20.45
24 25 女 28 20/10/2017 20.24 12.55 61.90 7.99
25 26 女 34 30/10/2017 20.89 16.16 102.40 14.69
26 27 男 34 30/10/2017 32.03 52.74 102.73 34.53
27 28 男 38 31/10/2017 34.62 54.43 119.68 51.14
28 29 男 60 24/10/2017 28.36 32.30 64.43 30.76
29 30 男 55 17/10/2017 29.60 34.07 99.96 41.95
… .. .. … … … … …
5612 5702 女 35 10/10/2017 16.88 12.60 78.18 24.35
5613 5703 女 50 10/10/2017 NaN NaN NaN NaN
5614 5705 女 29 10/10/2017 NaN NaN NaN NaN
5615 5706 男 38 10/10/2017 40.69 58.04 89.89 41.94
5616 5707 女 35 10/10/2017 15.74 11.71 71.85 15.52
5617 5708 男 33 10/10/2017 41.57 59.92 92.58 49.45
5618 5709 男 30 10/10/2017 17.13 21.95 82.48 40.98
5619 5710 女 66 10/10/2017 22.87 15.43 118.00 14.62
5620 5711 男 38 10/10/2017 29.46 48.27 79.34 80.79
5621 5712 男 45 10/10/2017 17.99 18.75 114.87 18.60
5622 5713 女 36 10/10/2017 26.21 28.14 57.07 33.75
5623 5714 男 35 10/10/2017 22.22 27.43 87.09 27.03
5624 5715 女 50 10/10/2017 29.68 19.82 77.52 11.96
5625 5716 女 38 10/10/2017 20.52 14.13 66.78 15.26
5626 5717 女 41 10/10/2017 16.75 9.77 65.03 10.86
5627 5718 女 50 10/10/2017 20.36 25.00 118.56 38.07
5628 5719 男 40 10/10/2017 45.84 38.42 80.96 123.39
5629 5720 女 30 10/10/2017 23.38 27.63 58.79 6.95
5630 5721 女 42 10/10/2017 18.59 19.43 68.40 16.63
5631 5722 女 36 10/10/2017 22.08 4.62 51.76 16.76
5632 5723 男 27 10/10/2017 61.34 160.58 88.69 27.16
5633 5724 女 58 10/10/2017 29.09 26.26 90.07 17.65
5634 5725 男 60 10/10/2017 31.06 24.52 80.09 26.18
5635 5726 男 41 10/10/2017 20.92 18.63 67.25 53.71
5636 5727 男 34 10/10/2017 28.72 36.22 36.09 26.72
5637 5728 女 47 10/10/2017 18.82 14.56 54.02 14.75
5638 5729 女 31 10/10/2017 21.08 13.07 76.03 13.80
5639 5730 女 80 10/10/2017 22.95 21.51 106.37 32.88
5640 5731 女 55 10/10/2017 33.54 24.94 97.60 19.16
5641 5732 女 30 10/10/2017 21.37 20.77 52.54 26.94
*总蛋白 白蛋白 ... 血小板计数 血小板平均体积 血小板体积分布宽度 血小板比积 中性粒细胞% 淋巴细胞% \
0 76.88 49.60 … 166.0 9.9 17.4 0.164 54.1 34.2
1 79.43 47.76 … 277.0 9.2 10.3 0.260 52.0 36.7
2 86.23 48.00 … 241.0 8.3 16.6 0.199 48.1 40.3
3 70.98 44.02 … 252.0 10.3 10.8 0.260 41.7 46.5
4 78.05 41.83 … 316.0 11.1 14.0 0.350 56.6 33.1
5 76.46 45.85 … 249.0 8.5 17.0 0.211 42.9 47.0
6 80.82 46.40 … 246.0 10.8 13.3 0.270 52.9 32.0
7 74.17 41.63 … 282.0 10.5 13.0 0.300 52.8 36.9
8 76.12 49.31 … 275.0 9.8 11.4 0.270 53.1 35.9
9 75.94 46.64 … 247.0 10.7 12.6 0.270 65.6 27.3
10 75.84 43.71 … 178.0 10.8 13.5 0.190 54.0 35.7
11 73.80 48.32 … 259.0 10.3 12.0 0.270 57.8 33.1
12 77.86 43.05 … 223.0 12.4 17.2 0.280 38.8 48.5
13 76.84 47.56 … 330.0 9.2 9.9 0.300 72.5 20.5
14 92.31 46.98 … 344.0 11.9 15.5 0.410 57.5 33.4
15 74.43 44.49 … 424.0 10.7 12.7 0.450 64.9 28.5
16 76.02 42.39 … 303.0 9.9 11.5 0.300 73.0 17.5
17 81.87 43.85 … 263.0 11.4 16.1 0.300 55.0 35.8
18 79.74 46.49 … 274.0 11.2 13.4 0.310 61.5 28.2
19 81.50 51.16 … 193.0 11.2 13.6 0.220 54.4 36.8
20 82.80 49.32 … 256.0 11.6 16.2 0.300 58.4 33.7
21 75.70 48.68 … 166.0 9.9 17.2 0.164 58.2 33.9
22 76.12 44.87 … 571.0 10.1 10.1 0.580 55.9 27.6
23 83.11 47.37 … 196.0 11.5 14.2 0.230 45.8 47.4
24 76.97 47.89 … 206.0 10.4 11.5 0.210 49.0 44.1
25 77.07 43.72 … 293.0 11.8 15.4 0.350 55.4 39.2
26 79.11 50.40 … 264.0 9.4 10.0 0.250 56.1 35.4
27 78.47 49.26 … 223.0 11.1 15.1 0.250 55.1 33.1
28 71.38 43.21 … 201.0 10.5 11.4 0.210 54.2 35.8
29 82.33 45.49 … 260.0 11.1 13.5 0.290 55.7 30.1
… … … … … … … … …
5612 79.14 46.91 … 329.0 9.9 11.7 0.330 59.6 30.7
5613 NaN NaN … 261.0 11.5 13.7 0.300 50.7 39.6
5614 NaN NaN … 279.0 10.5 11.9 0.290 62.9 30.3
5615 76.02 46.37 … 293.0 11.3 15.2 0.330 50.4 37.1
5616 80.56 46.81 … 319.0 9.5 10.6 0.300 70.6 22.1
5617 85.35 50.51 … 283.0 10.0 11.8 0.280 54.3 36.1
5618 79.63 48.26 … 300.0 10.6 13.9 0.320 46.8 31.3
5619 74.49 42.25 … 254.0 11.7 14.6 0.300 71.1 21.5
5620 72.87 47.46 … 225.0 9.8 12.2 0.220 53.5 33.8
5621 74.89 45.32 … 183.0 11.1 14.8 0.200 51.4 39.5
5622 75.40 45.74 … 200.0 11.6 14.4 0.230 65.2 27.9
5623 79.83 49.72 … 254.0 9.5 10.2 0.240 59.0 30.6
5624 80.54 45.98 … 379.0 11.3 16.4 0.430 53.0 37.1
5625 81.55 46.94 … 344.0 10.0 11.5 0.340 52.8 23.9
5626 68.42 42.54 … 295.0 10.4 11.8 0.310 70.2 22.2
5627 79.70 48.24 … 289.0 11.4 14.5 0.330 59.3 29.1
5628 84.03 49.40 … 162.0 11.7 16.0 0.190 57.1 28.5
5629 76.54 44.48 … 255.0 10.6 12.2 0.270 55.6 37.7
5630 70.17 42.34 … 240.0 9.4 9.4 0.220 73.0 20.3
5631 78.62 45.23 … 226.0 10.4 11.9 0.240 57.7 35.5
5632 76.65 48.27 … 234.0 10.4 12.0 0.240 67.5 25.3
5633 75.50 39.84 … 225.0 10.2 12.1 0.230 49.9 39.9
5634 72.44 45.90 … 248.0 10.6 12.3 0.260 57.6 33.7
5635 82.12 44.65 … 276.0 11.7 14.8 0.320 35.3 56.8
5636 69.07 46.54 … 225.0 11.2 13.3 0.250 58.2 31.5
5637 77.44 44.27 … 200.0 10.6 12.0 0.210 48.8 43.3
5638 80.72 47.21 … 210.0 11.1 13.7 0.230 60.6 31.3
5639 75.29 40.43 … 323.0 10.4 12.6 0.340 61.1 30.1
5640 78.50 43.10 … 220.0 12.2 16.3 0.270 55.0 36.9
5641 79.86 49.25 … 367.0 9.9 10.8 0.360 58.5 31.2
单核细胞% 嗜酸细胞% 嗜碱细胞% 血糖
0 6.5 4.7 0.6 6.06
1 5.8 4.7 0.8 5.39
2 7.7 3.2 0.8 5.59
3 6.7 4.6 0.5 4.30
4 9.1 0.6 0.6 5.42
5 7.1 2.1 1.0 5.97
6 11.3 3.1 0.7 5.11
7 6.6 2.8 0.9 5.94
8 7.3 3.3 0.4 5.66
9 5.4 1.0 0.7 5.48
10 8.1 1.3 0.9 4.44
11 7.5 1.2 0.4 5.48
12 7.2 4.2 1.3 5.32
13 6.1 0.6 0.3 5.08
14 6.8 1.5 0.8 4.63
15 5.0 1.1 0.5 4.92
16 7.2 1.9 0.4 7.08
17 8.0 1.0 0.2 4.66
18 6.0 3.5 0.8 6.58
19 7.1 1.3 0.4 4.29
20 5.3 2.0 0.6 4.55
21 5.2 2.4 0.3 5.16
22 11.5 4.3 0.7 5.13
23 5.3 1.1 0.4 4.37
24 5.5 0.8 0.6 5.17
25 4.5 0.3 0.6 4.64
26 6.8 1.1 0.6 5.82
27 9.1 1.9 0.8 6.29
28 7.5 1.7 0.8 5.10
29 10.4 2.6 1.2 5.41
… … … …
5612 7.8 1.2 0.7 5.32
5613 7.6 1.6 0.5 5.63
5614 5.2 1.1 0.5 4.84
5615 8.9 2.5 1.1 5.44
5616 5.9 1.0 0.4 4.79
5617 6.5 2.5 0.6 4.82
5618 6.0 15.1 0.8 5.25
5619 5.6 1.1 0.7 4.71
5620 8.8 2.8 1.1 6.64
5621 8.3 0.5 0.3 5.56
5622 5.7 0.5 0.7 5.07
5623 8.5 1.3 0.6 5.60
5624 8.5 0.5 0.9 5.32
5625 3.8 18.4 1.1 5.40
5626 5.5 1.2 0.9 5.39
5627 9.0 2.2 0.4 17.43
5628 6.6 7.2 0.6 5.52
5629 4.8 1.4 0.5 5.29
5630 5.7 0.9 0.1 5.43
5631 5.3 0.9 0.6 5.58
5632 6.1 0.8 0.3 5.18
5633 4.8 4.8 0.6 5.25
5634 7.4 1.0 0.3 5.15
5635 5.7 1.7 0.5 6.01
5636 7.2 2.7 0.4 5.11
5637 6.5 0.7 0.7 5.45
5638 5.5 1.6 1.0 5.13
5639 6.0 2.2 0.6 5.24
5640 6.8 0.7 0.6 6.37
5641 5.8 3.7 0.8 6.00
其他数据也可以查看,发现,数据之中存在空数据,除此之外,还存在字符类型的数据,如性别特征中的男女,这不利于做数据分析以及后续的预测,所以,第一步对数据进行处理
print( "\n为 LightGBM 进行 数据处理工作······" )
def make_feature_lightgbm(train,test):
"""将train 和 test中的id列的值给复制出来,赋值给 train_id,test_id"""
train_id = train.id.values.copy()
test_id = test.id.values.copy()
"""将train 和test 两个dataframe进行拼接起来"""
data = pd.concat([train,test])
"""将原始数据中的性别“男”替换为0,“女” 替换为1,缺失替换为0,数据文件在“dataset”文件夹下"""
data['性别'] = data['性别'].map({'男':1,'女':0})
"""将日期转换为 天数,方便后续计算,或者是删除 """
data['体检日期'] = (pd.to_datetime(data['体检日期']) - parse('2016-10-09')).dt.days
"""按列提取均值,并填入NAN位置,inplace=True表示不显示处理结果,False为显示处理结果"""
data.fillna(data.median(axis=0),inplace=True)
"""改变格式,float64-->> float32"""
for c, dtype in zip(data.columns, data.dtypes):
if dtype == np.float64:
data[c] = data[c].astype(np.float32)
"""
上面的操作都是为了对数据进行处理,之前合并数据是为了简化操作
重新切割 data,分为 训练特征和测试特征
"""
train_feat = data[data.id.isin(train_id)]
test_feat = data[data.id.isin(test_id)]
return train_feat,test_feat
df_train,df_test= make_feature_lightgbm(train,test)
通过上述代码片,可以得出训练集和测试集
import lightgbm as lgb
"""将训练数据中的id 和 血糖 两列删除掉,赋值给 x_train"""
x_train = df_train.drop(['id', '血糖'], axis=1)
"""y_train 训练标签"""
y_train = df_train['血糖'].values # array([6.06, 5.39, 5.59, ..., 5.24, 6.37, 6. ], dtype=float32)
#print(x_train.shape, y_train.shape) #(5642, 40) (5642,)
"""列出表格中的所有标题栏"""
train_columns = x_train.columns
"""
x_train.dtypes=float32
x_train.dtypes == object false
下面这个循环只是用来检查是否存在columns中存在非object的名称
"""
for c in x_train.dtypes[x_train.dtypes == object].index.values:
x_train[c] = (x_train[c] == True)
"""Python垃圾回收机制:gc模块 解决内存泄露问题"""
#del df_train; gc.collect()
"""change x_train 的type 由 DataFrame 变为 float32 """
x_train = x_train.values.astype(np.float32, copy=False)
"""将数据集导入lgb函数当中,包括训练数据,以及对应的标签"""
d_train = lgb.Dataset(x_train, label=y_train)
这里选用了GBDT、XGBoost、LightGBM三种,提升方法,是将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好,具体可以去官方文档看
将数据导入lgb函数中后,设置lgb相关参数
params = {}
params['max_bin'] = 10
params['learning_rate'] = 0.0021 # shrinkage_rate
params['boosting_type'] = 'gbdt'
params['objective'] = 'regression'
params['metric'] = 'mse' # or 'mae'
params['sub_feature'] = 0.345 # feature_fraction (small values => use very different submodels)
params['bagging_fraction'] = 0.85 # sub_row
params['bagging_freq'] = 40
params['num_leaves'] = 512 # num_leaf
params['min_data'] = 500 # min_data_in_leaf
params['min_hessian'] = 0.05 # min_sum_hessian_in_leaf
params['verbose'] = 0
params['feature_fraction_seed'] = 2
params['bagging_seed'] = 3
"""np.random.seed(0)的作用:作用:使得随机数据可预测"""
np.random.seed(0)
random.seed(0)
print("\nFitting LightGBM model ...")
clf = lgb.train(params, d_train, 1000)
使用lgb进行训练之后,得到clf训练模型,这时可以对模型进行检测
"""内存泄露,垃圾回收"""
#del d_train; gc.collect()
#del x_train; gc.collect()
print("\n准备基于LightGBM的预测 ...")
print(" 准备测试数据 x_test...")
x_test = df_test.drop(['id','血糖'], axis=1)
print("\n开始进行 LightGBM 预测...")
p_test = clf.predict(x_test)
得到测试结果,对其进行输出以及存储结果
"""内存泄露,垃圾回收"""
#del x_test; gc.collect()
print( "LightGBM 预测:" )
print( pd.DataFrame(p_test))
result_path = 'E:\The_most_powerful_laboratory\Tianchi_bigData\AI_diabetes_prediction\The_program_and_Result\\'
pd.DataFrame(p_test).to_csv(result_path+'other_treat2_pm_lgb.csv',header=None,index=False)
输出结果:
0 5.980362
1 6.152404
2 5.434784
3 5.691541
4 5.347017
5 5.498835
6 5.450368
7 5.708111
8 5.867635
9 6.118506
10 5.080957
11 5.692060
12 5.879674
13 5.575080
14 5.941833
15 5.108654
16 5.479026
17 5.761566
18 5.215997
19 5.928394
20 5.431442
21 5.487162
22 6.361659
23 6.106310
24 5.917645
25 5.250482
26 5.293484
27 5.484452
28 5.699167
29 5.661823
.. …
970 5.736628
971 6.044788
972 6.120981
973 6.290797
974 5.643984
975 5.629949
976 5.896866
977 5.884388
978 5.552906
979 5.099668
980 6.094184
981 5.207230
982 5.878387
983 5.592142
984 6.070533
985 5.723010
986 5.697837
987 6.142087
988 6.066210
989 5.785511
990 5.848041
991 5.250853
992 5.340729
993 6.106734
994 6.380849
995 5.595592
996 5.968682
997 6.036769
998 5.314922
999 5.549087
预测完毕
做了一次比赛之后发现,这种数据比赛的重点在于 特征工程的处理,特征的优良好坏,很大程度上决定了你预测结果的好坏,当然,好的预测方法也是十分关键的。机器学习时代三大神器GBDT、XGBoost、LightGBM,不同种的将会决定你预测的精度和速度。
好了,结束了(给自己一个小目标,每周一篇博客,贵在坚持)
PS:本次代码,十分注重基本库的运用,如pandas,lgb库等,特别是pandas,俗话说得好,pandas大法好;另外,贴上我的GitHub完整代码地址。新人,请多多指正