黃 旭, 賀 松, 席歡歡, 張 碩, 張 慧
(1 貴州大學(xué) 大數(shù)據(jù)與信息工程學(xué)院, 貴陽(yáng) 550025; 2 貴州大學(xué) 醫(yī)學(xué)院, 貴陽(yáng) 550025)
隨著計(jì)算機(jī)技術(shù)廣泛應(yīng)用于醫(yī)療領(lǐng)域,醫(yī)院信息化建設(shè)得到快速發(fā)展。醫(yī)院信息系統(tǒng)中存儲(chǔ)了大量的數(shù)據(jù)資源,運(yùn)用數(shù)據(jù)挖掘技術(shù)可以有效的分析、整合和利用這些數(shù)據(jù),以達(dá)到輔助診療的目的。利用數(shù)據(jù)挖掘技術(shù)對(duì)疾病風(fēng)險(xiǎn)預(yù)測(cè),對(duì)疾病的管理、預(yù)防、干預(yù)等有著重要意義。
慢性病非傳染性疾病通常具有發(fā)病潛伏期長(zhǎng)、病因復(fù)雜、反復(fù)發(fā)作、難以徹底治愈的特點(diǎn),導(dǎo)致的負(fù)擔(dān)占總疾病負(fù)擔(dān)的70%以上,成為制約健康預(yù)期,壽命提高的重要因素[1]。因此,在慢性病還沒(méi)有顯現(xiàn)時(shí),就應(yīng)當(dāng)做好疾病的預(yù)測(cè),提前發(fā)現(xiàn),及時(shí)處理,將疾病的影響降到最低。利用數(shù)據(jù)挖掘技術(shù),找出慢性病發(fā)生直接或者間接的危險(xiǎn)因素,就能夠通過(guò)監(jiān)測(cè)這些因素,及時(shí)采取預(yù)防措施,從而降低發(fā)病率。
集成學(xué)習(xí)本質(zhì)上是通過(guò)學(xué)習(xí)并結(jié)合多個(gè)弱分類器來(lái)獲得比單一分類器優(yōu)越的泛化性能[2]。RF、GBDT和Xgboost的弱學(xué)習(xí)器都是樹(shù)模型,利用多棵決策樹(shù)對(duì)樣本數(shù)據(jù)訓(xùn)練、分類和預(yù)測(cè)。在對(duì)數(shù)據(jù)分類時(shí),給出各特征的重要性得分,評(píng)價(jià)各特征在分類中的作用。
隨機(jī)森林(Ramdom Forest,RF)是一種基于Bagging算法改進(jìn)的模型,做分類時(shí),各弱分類器之間無(wú)強(qiáng)依賴關(guān)系,相互獨(dú)立,每一個(gè)弱分類器都有一個(gè)分類結(jié)果,最后根據(jù)森林內(nèi)決策樹(shù)投票,按照少數(shù)服從多數(shù)的原則,對(duì)最終結(jié)果進(jìn)行判定。隨機(jī)森林具有二個(gè)特點(diǎn):數(shù)據(jù)隨機(jī)和特征隨機(jī)。數(shù)據(jù)隨機(jī)指的是對(duì)訓(xùn)練集有放回的采樣,這樣不同的樹(shù)用到的訓(xùn)練集就會(huì)有所差異;特征隨機(jī)指的是每次從所有特征中隨機(jī)選擇特征子集進(jìn)行劃分,可以增強(qiáng)數(shù)據(jù)的適應(yīng)能力,優(yōu)化高維特征的訓(xùn)練速度。
梯度提升決策樹(shù)(Gradient Boosting Decision TREE,GBDT)是一種將弱學(xué)習(xí)器限定為分類回歸樹(shù)(CART)模型的前向分布算法,是boosting算法中的一種,由多棵決策樹(shù)組成,每一棵決策樹(shù)模型的建立是為了不斷學(xué)習(xí)之前樹(shù)的結(jié)果,擬合殘差,最后將所有決策樹(shù)的預(yù)測(cè)值結(jié)合起來(lái)得到最終答案。GBDT可處理離散或連續(xù)型數(shù)據(jù),進(jìn)行少量參數(shù)調(diào)優(yōu),可以達(dá)到很好的預(yù)測(cè)效果,具有較快的運(yùn)算速度和較強(qiáng)的泛化能力。
Xgboost(eXtreme Gradient Boosting)也稱為極端梯度提升算法,是在GBDT基礎(chǔ)上的改進(jìn),其特點(diǎn)是模型能自動(dòng)利用 CPU 進(jìn)行多線程并行計(jì)算,提高運(yùn)算速度,并且對(duì)損失函數(shù)進(jìn)行泰勒公式二階展開(kāi),使得預(yù)測(cè)精度更高。在損失函數(shù)后面增加正則項(xiàng),可以約束損失函數(shù)的下降和模型整體的復(fù)雜度[3]。Xgboost的目標(biāo)函數(shù)Obj為式(1):
(1)
網(wǎng)格搜索參數(shù)尋優(yōu)法是一種最基本的參數(shù)優(yōu)化算法。其核心思想是利用窮舉搜索,遍歷設(shè)定參數(shù)范圍內(nèi)所有的值,并以驗(yàn)證系統(tǒng)中的評(píng)分結(jié)果作為指標(biāo),得到最優(yōu)參數(shù)。該算法是對(duì)參數(shù)的每一組情況進(jìn)行試算,因此,當(dāng)網(wǎng)格劃分的比較密集時(shí),每多一個(gè)參數(shù),計(jì)算量就會(huì)呈幾何倍增張,網(wǎng)格搜索尋優(yōu)法就會(huì)非常耗時(shí)。
隨機(jī)搜索區(qū)別于網(wǎng)格搜索的暴力搜索方式,采用隨機(jī)在參數(shù)空間中采樣的方式,只要隨機(jī)次數(shù)夠多,總能找到最優(yōu)或者近優(yōu)參數(shù),盡管每次隨機(jī)結(jié)果不一致,但大大提高了高維參數(shù)的尋優(yōu)速度。
神經(jīng)網(wǎng)絡(luò)由輸入層、隱藏層和輸出層構(gòu)成,如圖1所示。隱藏層的層數(shù)是任意的,夾在輸入層和輸出層之間,每層由神經(jīng)元組成,輸入層由訓(xùn)練集的實(shí)例特征向量傳入,數(shù)據(jù)集有幾個(gè)特征輸入層就有幾個(gè)神經(jīng)元,本文對(duì)3種疾病進(jìn)行二分類,所以輸出層是3個(gè)神經(jīng)元。對(duì)于每一個(gè)神經(jīng)元模型,當(dāng)前神經(jīng)元的輸出yj都與上一層神經(jīng)元xi有式(2)的關(guān)系:
(2)
其中,Wij為神經(jīng)元j與上一層神經(jīng)元i的權(quán)重;θj為神經(jīng)元的偏向;f為激活函數(shù),引入激活函數(shù)增強(qiáng)了神經(jīng)網(wǎng)絡(luò)的表達(dá)能力。
Keras是一個(gè)高層神經(jīng)網(wǎng)絡(luò)API,能夠使用Tensorflow和Theano任一平臺(tái)作為后端,快速完成深度學(xué)習(xí)的開(kāi)發(fā)。用戶的體驗(yàn)始終是Keras考慮的首要內(nèi)容,具有易使用、可抽象、兼容性和靈活性的特點(diǎn)[4]。Keras具有許多模塊,網(wǎng)絡(luò)層、損失函數(shù)、優(yōu)化器、參數(shù)初始化、激活函數(shù)、正則化方法都是獨(dú)立的模塊,可以使用這些模塊來(lái)構(gòu)建自己的模型,大大加快了建模速度[5]。
圖1 神經(jīng)網(wǎng)絡(luò)
本文基于訓(xùn)練模型分類性能為標(biāo)準(zhǔn),以特征重要性排序?yàn)橹鞯陌竭x取[6]。
使用前面介紹的3種分類算法(參數(shù)為默認(rèn)值)對(duì)幾種慢性病建模,對(duì)比得到一個(gè)準(zhǔn)確率較高的算法,重新對(duì)幾種慢性病建模(使用隨機(jī)搜索進(jìn)行參數(shù)調(diào)優(yōu)),最后將每種慢性病排名前10的特征選擇出來(lái)。
本研究采用的是UCI機(jī)器學(xué)習(xí)存儲(chǔ)庫(kù):Chronic_Kidney_Disease數(shù)據(jù)集,選擇其中高血壓Htn、糖尿病Dm和冠狀動(dòng)脈疾病Cad三條屬性做分類研究,將“?”做空值處理,將二分類屬性做0和1處理,每條屬性的均值填入空值處,刪掉3種疾病屬性中原含有空值的樣本,得到一個(gè)397×25的數(shù)據(jù)集。
采用Python語(yǔ)言建模,將數(shù)據(jù)集按照7:3的比例劃分, 70%作為訓(xùn)練數(shù)據(jù)來(lái)訓(xùn)練模型;30%作為測(cè)試數(shù)據(jù),用來(lái)檢測(cè)模型的性能。使用機(jī)器學(xué)習(xí)庫(kù)sklearn中的RF、GBDT和Xgboost3種分類算法,不對(duì)各算法調(diào)參下建模。
使用準(zhǔn)確率、精確率(查準(zhǔn)率)、召回率(查全率)、F1值作為評(píng)價(jià)標(biāo)準(zhǔn)對(duì)分類器模型進(jìn)行性能評(píng)價(jià),由表1~表3可知,Xgboost在3種疾病上的預(yù)測(cè)準(zhǔn)確率最高,并降低了誤診率和漏診率。
GridSearchCV(網(wǎng)格搜索)和Random-izedSearchCV(隨機(jī)搜索)都是sklearn包中自動(dòng)調(diào)參的方法,系統(tǒng)地遍歷多種參數(shù)組合,通過(guò)交叉驗(yàn)證確定最佳效果參數(shù)。這里選擇尋優(yōu)速度更好的隨機(jī)搜索法。
Xgboost中有6項(xiàng)主要參數(shù),不同參數(shù)有不同的功能,這些參數(shù)設(shè)定是否合理,對(duì)于模型的好壞有重要影響[7]。選擇的6項(xiàng)參數(shù)以及搜索范圍如表4所示,以“F1”為準(zhǔn)確度評(píng)價(jià)標(biāo)準(zhǔn),隨機(jī)搜索次數(shù)n_iter設(shè)為1000。由于隨機(jī)搜索的特性,記錄10次調(diào)參結(jié)果,取最優(yōu)的結(jié)果,見(jiàn)表4、表5。
表1 Htn各分類器性能比較
表2 Dm各分類器性能比較
表3 Cad各分類器性能比較
表4 Xgboost最佳參數(shù)及調(diào)參范圍
表5 Xgboost調(diào)參性能
使用xgboost模塊中plot_importance函數(shù)對(duì)特征進(jìn)行重要性排序,使用特征在所有樹(shù)中被用作分割樣本的特征的次數(shù)“weight”作為特征重要程度的判斷指標(biāo),留下排名前10的特征。得到3種慢性疾病的主要危險(xiǎn)因素,如圖2~圖4所示。
圖2 Htn特征重要性
圖3 Dm特征重要性
圖4 Dm特征重要性
對(duì)3種慢性疾病的主要危險(xiǎn)因素做并集處理,得到Bu血液尿素、Bgr血糖、Age年齡、Pcv紅細(xì)胞壓積、Sc血清肌酐、Bp血壓、Rbcc紅細(xì)胞計(jì)數(shù)、Sod鈉、Hemo血紅蛋白、Wbcc白細(xì)胞計(jì)數(shù)、Su糖、Pot鉀、Appet胃口,共13種主要危險(xiǎn)因素,其中6項(xiàng)3種疾病共同擁有;5項(xiàng)2種疾病共同擁有,只有兩項(xiàng)是單獨(dú)擁有,因此慢性病在預(yù)測(cè)時(shí)不好判斷,將醫(yī)生多年的診斷經(jīng)驗(yàn)?zāi)P突?,利用限特征進(jìn)行疾病預(yù)測(cè)。
一種疾病危險(xiǎn)因素可能是多種疾病的判斷標(biāo)準(zhǔn)。因此,采用相同危險(xiǎn)因素對(duì)多種疾病同時(shí)進(jìn)行風(fēng)險(xiǎn)預(yù)測(cè),用問(wèn)題轉(zhuǎn)化的方法將多疾病風(fēng)險(xiǎn)預(yù)測(cè)問(wèn)題轉(zhuǎn)化為多標(biāo)簽分類問(wèn)題。
問(wèn)題轉(zhuǎn)化方法中Binary Relevance(BR)和Label-Powerset(LP)是兩種具有代表性的方法[8]。BR方法是將多標(biāo)簽轉(zhuǎn)化為多個(gè)相互獨(dú)立的單標(biāo)簽二分類問(wèn)題;LP方法是將多個(gè)標(biāo)簽轉(zhuǎn)化為多分類單標(biāo)簽問(wèn)題,3個(gè)標(biāo)簽就有23個(gè)類。本文選擇神經(jīng)網(wǎng)絡(luò)作為基礎(chǔ)算法,利用深度學(xué)習(xí)框架Keras建立神經(jīng)網(wǎng)絡(luò)模型,選擇損失函數(shù)binary cross entropy和categorical cross entropy分別對(duì)應(yīng)問(wèn)題轉(zhuǎn)化中的BR和LP方法。
神經(jīng)網(wǎng)絡(luò)采用序貫?zāi)P汀]斎雽佑?3個(gè)神經(jīng)元;經(jīng)過(guò)多次試驗(yàn),隱藏層設(shè)置為4,神經(jīng)元都為10,后面3層引入Dropout和L2正則化來(lái)防止模型過(guò)擬合,激活函數(shù)選擇使用非線性函數(shù)ReLU函數(shù)。ReLU函數(shù)是分段線性函數(shù),在梯度下降算法運(yùn)算中擁有較好的性能;輸出層,BR方法神經(jīng)元設(shè)置為3,配合使用sigmoid函數(shù)作為激活函數(shù),LP方法神經(jīng)元設(shè)置為8,配合使用softmax函數(shù)作為激活函數(shù)。對(duì)于已有數(shù)據(jù)集標(biāo)簽,BR方法可直接使用;對(duì)于LP方法,需要對(duì)3個(gè)標(biāo)簽組合,再將二進(jìn)制數(shù)轉(zhuǎn)化為10進(jìn)制數(shù),最后進(jìn)行onehot編碼。
將數(shù)據(jù)按8:2劃分,80%用于網(wǎng)絡(luò)訓(xùn)練,20%用于精度測(cè)試,將數(shù)據(jù)歸一化處理,避免數(shù)值量級(jí)差異引起權(quán)值過(guò)大或過(guò)小,并提升了運(yùn)算速度。優(yōu)化方法選擇了一種自適應(yīng)梯度下降方法Adam,與其他優(yōu)化算法相比,其收斂速度較快,學(xué)習(xí)效果更為有效;二種方法都以acc作為度量標(biāo)準(zhǔn)。經(jīng)過(guò)多次實(shí)驗(yàn),模型訓(xùn)練的輪數(shù)epochs設(shè)置為100,指定權(quán)重更新的每個(gè)批次所使用實(shí)例的個(gè)數(shù)為3。
使用evaluation函數(shù)來(lái)評(píng)估模型的準(zhǔn)確率,由訓(xùn)練返回值history作acc-loss曲線,如圖5所示。得到LP方法的acc為67.50%,loss為0.93;BR方法的acc為86.25%,loss為0.33,可以看出BR方法的準(zhǔn)確度更高,損失值更趨近于0,預(yù)測(cè)效果更好。但是這種方法不考慮疾病間的關(guān)聯(lián)性,模型簡(jiǎn)單,需要進(jìn)一步優(yōu)化增加標(biāo)簽之間關(guān)聯(lián)性才能用于多疾病預(yù)測(cè);LP方法考慮了標(biāo)簽與標(biāo)簽之間的關(guān)聯(lián),增加了復(fù)雜度,使得準(zhǔn)確率降低,使用此方法對(duì)某一樣本預(yù)測(cè)時(shí),輸出端8個(gè)值的和為1,其中最大值對(duì)應(yīng)索引即為預(yù)測(cè)結(jié)果,最大值就是預(yù)測(cè)概率。
圖5 acc-loss曲線
本文闡述了隨機(jī)森林、GBDT和Xgboost3種集成學(xué)習(xí)算法的原理及特點(diǎn),基于3種慢性病,使用尋優(yōu)速度較好的隨機(jī)搜索法對(duì)其中分類效果最好的Xgboost進(jìn)行超參數(shù)優(yōu)化,分別得到3種慢性病特征重要性排名前10的危險(xiǎn)因素。使用keras框架構(gòu)建神經(jīng)網(wǎng)絡(luò)模型,對(duì)這些危險(xiǎn)因素進(jìn)行多疾病風(fēng)險(xiǎn)預(yù)測(cè),對(duì)比分析了BR和LP兩種問(wèn)題轉(zhuǎn)化方式得到的結(jié)果。在今后的研究中,要進(jìn)一步豐富數(shù)據(jù),采用更好的數(shù)據(jù)處理方法,構(gòu)建更為復(fù)雜的神經(jīng)網(wǎng)絡(luò);對(duì)損失函數(shù)進(jìn)行研究,在BR方法的基礎(chǔ)上考慮標(biāo)簽之間的關(guān)聯(lián)性。