1. 程式人生 > >資料探勘實戰之天池精準醫療大賽(1)——賽題與資料

資料探勘實戰之天池精準醫療大賽(1)——賽題與資料

首先介紹題目與資料:

特別提供一下資料,供後來看到的盆友下載研究(現在官網上剩下的資料是複賽的了),測試資料分AB榜,不瞭解的去看天池平臺的介紹:

競賽題目

中國是世界上糖尿病患者最多的國家,病人達到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-谷氨醯基轉換酶*總蛋白白蛋白*球蛋白白球比例...血小板計數血小板平均體積血小板體積分佈寬度血小板比積中性粒細胞%淋巴細胞%單核細胞%嗜酸細胞%嗜鹼細胞%血糖
count5642.05642.04421.04421.04421.04421.04421.04421.04421.04421.0...5626.05619.05619.05619.05626.05626.05626.05626.05626.05642.0
mean2866.046.027.028.087.039.077.046.031.02.0...253.011.013.00.057.034.07.02.01.06.0
std1656.013.014.023.026.041.04.03.04.00.0...60.01.02.00.08.07.02.02.00.02.0
min1.03.010.00.023.06.057.030.07.01.0...37.07.08.00.014.08.03.00.00.03.0
25%1433.035.020.015.070.018.074.044.029.01.0...213.010.012.00.052.029.06.01.00.05.0
50%2870.045.024.021.084.026.077.046.031.01.0...249.011.013.00.057.034.07.02.01.05.0
75%4303.054.029.032.0100.044.080.048.033.02.0...289.011.015.00.062.038.08.03.01.06.0
max5732.093.0435.0499.0374.0737.0100.054.066.07.0...745.015.025.01.088.076.023.022.04.038.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工具庫,讀取資料,對資料欄位情況、缺失、預測值分佈等了解一番,磨刀不誤砍柴工,新手應對做好準備工作,再著手結合具體問題分析思路吧!