1. 程式人生 > >20180811-0827醫療大資料初賽總結

20180811-0827醫療大資料初賽總結

在這裡插入圖片描述

介紹下本人。中山大學,醫學生+計科學生的集合體,機器學習愛好者。

再說說這個比賽的背景。為了不讓資料洩露,主辦方真是花盡了心思,搞了個雲桌面,在雲桌面裡搞了個內網伺服器。。也就是無法聯網,裝包什麼的只能用本機來copy了。

不過還好,整個比賽搞了三天三夜搞完了,線上auc0.85,排名18,無baseline第一次從頭到尾的嘗試,之前也做過其他比賽,但是都是有大佬bl的。。

1、搭環境

(1)從本機下載雲桌面(雲機)中伺服器centos系統(雲服)對應anacoda檔案。從本機拷貝至雲機,雲機中通過winscp上傳至雲服。
在這裡插入圖片描述
(2)在本服中安裝anaconda

sudo wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.0.1-Linux-x86_64.sh

(anaconda3對應py35)

sudo wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda2-2.4.1-Linux-x86_64.sh

(anaconda2對應py27)

執行安裝過程

sudo bash

Anaconda3-5.0.1-Linux-x86_64.sh

提示你,是否閱讀協議,回車接受

In order

to continue the installation process, please review the

license
agreement.
Please,

press ENTER to continue

是否接受協議,yes

Do you

accept the license terms? [yes|no]

安裝位置確認,回車

Anaconda3

will now be installed into this location:
/home/anaconda3


Press ENTER to confirm the location


Press CTRL-C to abort the

installation


Or specify a different location below

提示你如果要讓bashrc起作用,要開啟一個新的終端。但測試不起作用。

For this change to

become active, you have to open a new terminal.

於是,我就直接配置環境變數

sudo vim

/etc/environment

把自己的安裝目錄新增到後面

:/home/anaconda3/bin

立即啟用環境變數

source

/etc/environment

測試是否安裝成功

如果安裝成功,會顯示出當前conda的版本

conda

4.3.30

啟用環境

conda activate

如果要退出環境的話,執行:

source

deactivate

(注:本機裝anaconda是在官網下載,在anaconda prompt中通過pip或者conda install 裝包。(conda不行的用pip))

(3)裝包

①在本服中建立envs環境,裝所需要的各種包。把envs資料夾拷貝至雲機,再通過雲機winscp上傳至雲服資料夾下。
在這裡插入圖片描述

在本服中建立envs環境,普通使用者建立環境,在/home目錄下
1)建立環境
在這裡插入圖片描述
2)啟用環境
在這裡插入圖片描述

②也可以在本服中建立envs環境,在envs環境中裝好包(啟用虛擬環境後裝包),從本服這裡把相關包拷貝至雲機,雲機通過winscp上傳至雲服目錄下
在這裡插入圖片描述
在這裡插入圖片描述
(注:雲服沒聯網,不能直接建立envs,也不能直接裝包,除了anaconda自帶的在安裝anaconda時候已經有了。不能在網頁中開啟jupyter)

(4)部分包(如lgb)依賴gcc環境,需要升級glic。詳見資料夾。
在這裡插入圖片描述

①先在本機下載雲服對應版本的gcc檔案(包括依賴的),拷貝至雲機,winscp上傳至雲服,在雲服裝好gcc並編譯成功;

②在本機下載雲服提示的glic版本,拷貝至雲機,winscp上傳至雲服,安裝。

2、裝軟體pycharm並連線至雲服。詳見資料夾下
在這裡插入圖片描述

3、分析賽題。

(1)搞明白三年期,確定訓練集資料時間範圍:詳見。構造可用最大隨訪時間,其他表的時間範圍與它比較篩選。打標籤篩選。
在這裡插入圖片描述
(2)分析特徵:

①通過對個人資訊、隨訪表、門診表、手術表、生化表的ID計數(ID出現的次數),發現門診表、手術表、生化表的ID數遠小於個人資訊、隨訪表,即大部分人沒有門診、手術、生化記錄。所以可以考慮不使用這幾張表。(merge時候只merge所需要的表)

②發現大量ID重複的,所以要合併同個ID對應的記錄,例如選取均值、中位數、最大最小值、平均時間間隔、最大時間間隔、生化陽性陰性次數等作為特徵。對於文字特徵,可以採用jieba或countvector選取(還不會),也可以手動提取關鍵詞所在的行分析上述計數特徵。

③去除一些指標異常值過於明顯的:心率>220(房顫300-600)、glu>100、身高>300的。

(3)業務分析:

①只要有了冠心病不會逆轉,只可能臨床治癒、沒有冠心病症狀、心功能好,可還是有冠心病;

②60%-70%冠脈患者有高血壓,高血壓患者冠心病比正常高3-4倍。高血壓(收縮壓>140和或舒張壓>90)。

③影響冠心病的因素:收縮壓、舒張壓,吸菸,糖尿病、高甘油三酯血癥、高膽固醇血癥(TC>=5.7、LDL-C>3.3、HDL-C<1)、血同型半胱(>10)、凝血8因子升高、血小板功能升高、胰島素抵抗,肥胖(>標準體重(=身高-105)kg的20%或BMI(=kg/m^2)>24),家族史(冠心病、糖尿病、高血壓等小於50歲),A型性格,口服避孕藥,飲食習慣,心衰史、血運重建,疼痛時間,肺水腫、雜音、低血壓、心動過速,年齡>75(>40,男>55,女>65),性別(男>女),外科手術、休克;

④診斷:影像,血肌酐、心肌損傷標誌物增高(肌紅蛋白、肌鈣蛋白、CK-MB)、ctnt增高;

⑤症狀:收縮期血壓增高、脈壓增高、低血壓,腹主動脈瘤、胸主動脈瘤(胸痛、氣急、吞嚥困難、咯血、壓迫喉返神經),乏力,噁心、嘔吐,休克;

⑥用藥:(β阻劑)洛爾、硝酸酯、(ca阻劑)帕米、阿司匹林、氯吡格雷、他汀、肝素

(4)納入特徵:(所有特徵需要先篩選時間小於可用最大隨訪時間的部分分析)

①資訊特徵:性別、年齡(高血壓確診時間-出生日期or最後一次隨訪時間-出生日期)、冠心病標誌。其他特徵del掉再去重(所有特徵均相同的行去重)。

②隨訪表:有症狀的次數(除掉無症狀剩下的人計數,空值即無症狀的人次數補0,或者樹模型自動補0)、收縮壓最大值和均值、舒張壓最大值和均值、心率最大值和均值、空腹血糖最大值和均值、身高最大值和均值、體重最大值和均值、BMI最大值和均值。其他特徵del掉再去重(所有特徵均相同的行去重)。

③門診診斷表(找出與心胸有關的診斷名):不同人每次門診時間間隔(最小、最大、平均)、不同人確診高血壓後心胸疾病門診次數、不同人每次門診的心胸疾病診斷數目。其他特徵del掉再去重(所有特徵均相同的行去重)。

④門診手術表(找出與肌鈣蛋白、肌酸激酶有關的門診手術名,應該是門診化驗的意思):不同人每次門診手術時間間隔(最小、最大、平均)、不同人確診高血壓後心胸疾病門診手術次數、不同人每次門診手術的心胸疾病診斷數目。其他特徵del掉再去重(所有特徵均相同的行去重)。

⑤門診處方表(找出與心臟疾病相關的用藥:硝酸、匹林、格雷、肝素、洛爾、普利、沙坦、地平、帕米、硫卓、他汀):不同人每次處方時間間隔(最小、最大、平均)、不同人確診高血壓後心胸疾病處方次數、不同人每次門診手術的心胸疾病處方數目。其他特徵del掉再去重(所有特徵均相同的行去重)。

⑥住院診斷表(找出與心胸有關的診斷名):不同人一次住院長度、不同人每次住院時間間隔(最小、最大、平均)、不同人確診高血壓後心胸疾病住院次數、不同人每次住院的心胸疾病診斷數目。其他特徵del掉再去重(所有特徵均相同的行去重)。

⑦住院手術表(找出與心有關的住院手術名):不同人每次住院手術時間間隔(最小、最大、平均)、不同人確診高血壓後心疾病住院手術次數、不同人每次住院手術的心疾病診斷數目。其他特徵del掉再去重(所有特徵均相同的行去重)。

⑧住院醫囑表(找出與心臟疾病相關的用藥:硝酸、匹林、格雷、肝素、洛爾、普利、沙坦、地平、帕米、硫卓、他汀):不同人每次住院醫囑時間間隔(最小、最大、平均)、不同人確診高血壓後心胸疾病住院醫囑次數、不同人每次門診手術的心胸疾病住院醫囑數目。其他特徵del掉再去重(所有特徵均相同的行去重)。

⑨生化表:結果數值與正常值上下限比較,判斷陰陽性次數,空值不填補。其他特徵del掉再去重(所有特徵均相同的行去重)。

(4)合併:

from檔名import*,合併處理過的所有表,公共列為ID,每次列印一下記憶體。最後合併的表整體去重一下。

(5)訓練:

分割訓練集、驗證集、測試集,列印shape。直接喂進lgb和xgb。

(6)結果處理:

先將結果線性加權。

發現得到的結果裡面有重複的ID,去重。

剩下部分有重複ID對應的score取平均值。

最後與題中ID列左merge。

4、一些tip:

(1)轉化時間格式,變成py能計算天數的;

(2)填補缺失值時,先判斷所填補列的型別:若其中的數字是object型別,填補’-1’;若是數值型別,填補-1;

(3)每次合併完、篩選完列印下shape[0]行數;

(4)兩個中括號代表生成了表:pre[[‘ID]]——生成一個只有一列ID的表;pre[[‘ID,’score’]] ——生成一個有一列ID和一列score的表;單中括號只表示所引用列的內容;

(5)merge的時候,先去重,否則會冪次擴增,直接爆炸;

(6)生成新表後del原表,生成新特徵後del原特徵,防止記憶體爆炸;

(7)在一個資料夾的時候,引用另一個檔案:from檔名import*;

(8)喂到網路裡時,先列印訓練集、驗證集、測試集、預測集的shape;

(9)提交結果,看清楚ID列用哪個。