蔣雯音
(寧波衛(wèi)生職業(yè)技術(shù)學(xué)院 寧波315100)
隨著全面“二孩”政策的放開,高齡和高危孕婦明顯增多,這給婦幼保健管理和婦產(chǎn)科相關(guān)人員帶來前所未有的挑戰(zhàn)。高危妊娠中早產(chǎn)(PTB)和低出生體重兒(Low Birth Weight,LBW)成為重點(diǎn)關(guān)注的問題。世界衛(wèi)生組織將早產(chǎn)兒定義為胎齡小于37周出生的新生兒,低出生體重兒是指出生體重在2 500克以下者。早產(chǎn)兒、低出生體重兒生命脆弱,抵抗力低下,容易患病導(dǎo)致死亡,是新生兒的脆弱人群,是圍產(chǎn)兒死亡的重要原因之一。世界衛(wèi)生組織呼吁社會(huì)更多地關(guān)注早產(chǎn)問題,加強(qiáng)相關(guān)研究,采取有效行動(dòng),從而增加預(yù)防、應(yīng)對(duì)早產(chǎn)的辦法。
隨著存儲(chǔ)技術(shù)的發(fā)展和醫(yī)院信息化的深入,醫(yī)院數(shù)據(jù)庫積累大量的數(shù)據(jù),傳統(tǒng)的數(shù)據(jù)分析和處理方法無法獲得數(shù)據(jù)之間的隱藏信息和內(nèi)在關(guān)聯(lián),但通過數(shù)據(jù)分析挖掘潛在知識(shí)、信息和規(guī)律的需求廣泛存在。機(jī)器學(xué)習(xí)(Machine Learning,ML)是利用已有數(shù)據(jù)訓(xùn)練出模型,然后使用模型預(yù)測的一種方法。充分利用積累的原始數(shù)據(jù),應(yīng)用機(jī)器學(xué)習(xí)方法建立早產(chǎn)兒、低出生體重兒的預(yù)測模型,以期對(duì)高危妊娠中早產(chǎn)和低出生體重兒預(yù)測和實(shí)施有效干預(yù)提供輔助決策,從而降低早產(chǎn)兒、低出生體重兒的出生率和病死率,提高出生人口質(zhì)量。
2.1.1 邏輯回歸(Logical Regression,LR) 機(jī)器學(xué)習(xí)中的一種常用分類模型,主要用于二分類問題(即輸出只有兩種,分別代表兩個(gè)類別),通常是利用已知的自變量來預(yù)測一個(gè)離散型因變量的值。邏輯回歸基于Sigmoid函數(shù),算法主要思想是:用極大似然估計(jì)法來求模型參數(shù),通過建立似然函數(shù)L(θ),對(duì)其進(jìn)行簡單變換后為損失函數(shù)J(θ),再用優(yōu)化方法(如梯度下降)迭代求解出最優(yōu)(即最小化損失函數(shù))的模型參數(shù)(θ)。由于算法具有計(jì)算量小、簡單、高效等特點(diǎn),實(shí)際應(yīng)用非常廣泛,主要應(yīng)用于預(yù)測某些事件發(fā)生的概率。
2.1.2 支持向量機(jī)(Support Vector Machine,SVM) 在統(tǒng)計(jì)學(xué)習(xí)理論和結(jié)構(gòu)風(fēng)險(xiǎn)最小原理基礎(chǔ)上發(fā)展起來的一種機(jī)器學(xué)習(xí)方法,其機(jī)器學(xué)習(xí)策略是結(jié)構(gòu)風(fēng)險(xiǎn)最小化原則。主要思想是尋找一個(gè)最優(yōu)分割超平面,使得該平面兩側(cè)距超平面最近的兩類樣本之間的距離最大化,通過分割面將數(shù)據(jù)進(jìn)行分類。具有全局最優(yōu)、最大泛化能力、推廣能力強(qiáng)等優(yōu)點(diǎn),在解決小樣本、非線性及高維模式識(shí)別中表現(xiàn)出許多特有的優(yōu)勢,能夠推廣應(yīng)用到函數(shù)擬合中,較好地解決許多實(shí)際預(yù)測問題[1]。
2.1.3 隨機(jī)森林(Random Foresrt,RF) 一種以決策樹為基本分類器,將多個(gè)決策樹進(jìn)行組合來提高預(yù)測精度的集成學(xué)習(xí)方法。隨機(jī)森林的構(gòu)建過程大致如下[2]:從原始訓(xùn)練集中隨機(jī)有放回采樣選出m個(gè)樣本,共進(jìn)行n次采樣,生成n個(gè)訓(xùn)練集;分別訓(xùn)練生成n個(gè)決策樹模型;對(duì)于單個(gè)決策樹模型,假設(shè)訓(xùn)練樣本特征的個(gè)數(shù)為n,那么每次分裂時(shí)根據(jù)信息增益(或GINI指數(shù))選擇最好的特征進(jìn)行分裂;每棵樹一直分裂直到該節(jié)點(diǎn)的所有訓(xùn)練樣例都屬于同一類;將生成的多棵決策樹組成隨機(jī)森林。對(duì)多重共線性不敏感、準(zhǔn)確率高,不容易過擬合,而且能處理維度很高的數(shù)據(jù)集,所以在眾多算法中較為突出。
本研究采用以上3種機(jī)器學(xué)習(xí)方法分別建立預(yù)測模型并進(jìn)行比較,使用PyCharm作為集成開發(fā)環(huán)境,利用Python 2.7中numpy、pandas、matplotlib包進(jìn)行數(shù)據(jù)處理和分析,應(yīng)用機(jī)器學(xué)習(xí)包scikit-learn(簡稱sklearn)構(gòu)建預(yù)測模型[3],進(jìn)行模型測試和評(píng)估。
本研究數(shù)據(jù)來自寧波市某婦幼保健院的725例高危孕婦病例,根據(jù)《寧波市高危妊娠評(píng)分標(biāo)準(zhǔn)》并結(jié)合樣本數(shù)據(jù),初步選出高危妊娠因素共26個(gè)(其中每種危險(xiǎn)因素分輕、中、重3個(gè)等級(jí))。原始數(shù)據(jù)一般存在缺失值、冗余重復(fù)、格式不一致、維度高等問題,需要進(jìn)行數(shù)據(jù)清洗和預(yù)處理工作。對(duì)于本研究數(shù)據(jù)集經(jīng)過清洗異常樣本、插補(bǔ)缺失值、數(shù)據(jù)變換等處理,使數(shù)據(jù)格式和質(zhì)量達(dá)到建模要求,生成最終可用于研究使用的樣本705條,數(shù)據(jù)集正負(fù)樣本比例,見圖1。在現(xiàn)實(shí)機(jī)器學(xué)習(xí)任務(wù)中通常還要做進(jìn)一步的特征選擇[4],即選取對(duì)問題研究有用的屬性(相關(guān)特征),用于后續(xù)建立預(yù)測模型的輸入變量。本研究通過過濾低方差特征并根據(jù)自變量與目標(biāo)變量間的關(guān)聯(lián)大小選擇特征,最終選取出14個(gè)特征作為預(yù)測模型的輸入變量,包括年齡、體重指數(shù)、遺傳病史、流產(chǎn)、異常分娩史、異常妊娠史、消化系統(tǒng)(肝損ALT、肝炎病毒)、內(nèi)分泌系統(tǒng)(糖尿病、甲亢、甲低)、腫瘤(子宮肌瘤、卵巢腫瘤)、胎位、胎兒、試管嬰兒、不孕時(shí)間、宮高等常見高危因素。另外在數(shù)據(jù)集最后添加標(biāo)簽列,設(shè)置生產(chǎn)早產(chǎn)兒或低體重兒的樣本標(biāo)簽為1,正常嬰兒體重的樣本標(biāo)簽為0??梢婎A(yù)測目標(biāo)實(shí)際上就是一個(gè)二分類問題。
圖1 數(shù)據(jù)集正負(fù)樣本比例
建立模型前用sklearn.model_selection庫中的train_test_split函數(shù)先將數(shù)據(jù)集按比例隨機(jī)劃分為訓(xùn)練集和測試集,語句如下:
X_train,X_test,y_train,y_test=
train_test_split(r_data,labels,test_size=0.3, random_state=20)
其中r_data是數(shù)據(jù)樣本的特征集,labels是樣本標(biāo)簽(取值為1或0);參數(shù) test_size=0.3表示隨機(jī)抽取樣本的30%作為測試集用來測試模型性能,樣本的70%作為訓(xùn)練集用于模型訓(xùn)練;設(shè)定random_state參數(shù),是該組隨機(jī)數(shù)的編號(hào),在需要重復(fù)試驗(yàn)時(shí)可以保證得到一組相同的隨機(jī)數(shù),即保證每次試驗(yàn)劃分的訓(xùn)練集和測試集都是相同的。函數(shù)返回劃分后的訓(xùn)練集和測試集以及各自對(duì)應(yīng)的標(biāo)簽,其中X_train和y_train分別是訓(xùn)練數(shù)據(jù)的特征集及對(duì)應(yīng)標(biāo)簽,X_test和y_test分別是測試數(shù)據(jù)的特征集和標(biāo)簽。
數(shù)據(jù)準(zhǔn)備好后分別調(diào)用sklearn中的linear_model.LogisticRegression、svm.svc和ensemble. RandomForestClassifier類,即邏輯回歸、支持向量機(jī)和隨機(jī)森林3種分類模型分別對(duì)數(shù)據(jù)集進(jìn)行訓(xùn)練和預(yù)測。通過以下方式建立模型:
from sklearn import linear_model, svm, ensemble
lr_model = linear_model.LogisticRegression() #建立邏輯回歸模型
svm_model = svm.SVC() #建立支持向量機(jī)模型
rf_model = ensemble.RandomForestClassifier() #建立隨機(jī)森林模型
每種模型都有多個(gè)參數(shù),當(dāng)使用不同的參數(shù)配置時(shí)會(huì)產(chǎn)生預(yù)測性能不同的分類器,需要進(jìn)行參數(shù)選擇(即調(diào)參)。在實(shí)際訓(xùn)練中結(jié)果對(duì)于訓(xùn)練集的擬合程度通常較好,但是對(duì)于訓(xùn)練集之外的數(shù)據(jù)的擬合程度通常較差。本研究利用交叉驗(yàn)證方法[5],基本思想是將訓(xùn)練數(shù)據(jù)集分為訓(xùn)練集和驗(yàn)證集,首先用訓(xùn)練集對(duì)分類器進(jìn)行訓(xùn)練,再利用驗(yàn)證集來測試訓(xùn)練得到的模型性能。如10折交叉驗(yàn)證就是將數(shù)據(jù)集分成10份,輪流將其中9份做訓(xùn)練、1份做驗(yàn)證,將10次結(jié)果的均值作為對(duì)算法精度的估計(jì),由此可相對(duì)客觀地判斷這些參數(shù)對(duì)訓(xùn)練集之外的數(shù)據(jù)的擬合程度,從而得到最優(yōu)參數(shù)和模型。利用GridSearchCV可系統(tǒng)地遍歷多種參數(shù)組合,通過網(wǎng)格搜索確定最佳效果參數(shù)(即模型調(diào)參)[6-7],形式如下:
from sklearn.grid_search import GridSearchCV
#通過GridSearchCV來尋求最佳參數(shù)空間
gs_model =
GridSearchCV(model_name, param_grid=params, cv=6, scoring='roc_auc')
其中model_name是上述建立的3種模型名稱(即lr_model、svm_model和rf_model),param_grid是需要優(yōu)化的參數(shù)取值,cv=6表示采用6折交叉驗(yàn)證,scoring='roc_auc'表示以auc值作為評(píng)價(jià)標(biāo)準(zhǔn),選取其值最高時(shí)的參數(shù)為模型最佳參數(shù)。各模型需要優(yōu)化的參數(shù)及其取值范圍名,見表1。
表1 各模型優(yōu)化參數(shù)取值
續(xù)表1
設(shè)置好模型和評(píng)價(jià)指標(biāo)后用不同的參數(shù)通過fit()方法訓(xùn)練模型,交叉驗(yàn)證訓(xùn)練模型后利用gs_model.best_params_屬性得到最佳參數(shù),運(yùn)行結(jié)果如下。
邏輯回歸模型:
交叉驗(yàn)證...
最優(yōu)參數(shù):{′C′:1}
支持向量機(jī)模型:
交叉驗(yàn)證...
最優(yōu)參數(shù):{′C′:10,′gamma′:0.1}
隨機(jī)森林模型:
交叉驗(yàn)證...
最優(yōu)參數(shù):{′n_estima tors′:100}
用gs_model.best_estimator_屬性獲得最優(yōu)模型,然后使用最優(yōu)模型的predict()方法進(jìn)行預(yù)測,方法如下:
gs_model.fit(X_train, y_train) #訓(xùn)練模型
best_model= gs_model.best_estimator_ #獲得最優(yōu)模型best_model
best_model.predict(X_test) #利用最優(yōu)模型進(jìn)行預(yù)測
訓(xùn)練好模型后使用python中的pickle模塊來保存和讀取模型,可利用此模型進(jìn)行預(yù)測,實(shí)現(xiàn)語句如下:
import pickle
pickle.dump(best_model, f) #保存模型
model=pickle.load(f) #加載模型
模型訓(xùn)練后得到不同分類算法的最優(yōu)模型,需比較不同算法模型的泛化性能,得到最適合本研究數(shù)據(jù)樣本的預(yù)測模型。在訓(xùn)練模型前數(shù)據(jù)集的一部分作為測試集用來測試模型對(duì)新樣本的預(yù)測性能,以評(píng)估模型在實(shí)際使用時(shí)的泛化能力。用模型預(yù)測結(jié)果和測試集真實(shí)值構(gòu)建混淆矩陣,利用sklearn.metrics模塊的accuracy_score、f1_score、roc_curve函數(shù)分別計(jì)算出不同模型的準(zhǔn)確率、F1值、偽陽性率即錯(cuò)誤命中率(False Positive Rate,F(xiàn)PR)和真陽性率即靈敏度(True Positive Rate,TPR),以FPR為橫坐標(biāo)、以TPR為縱坐標(biāo)繪制ROC曲線,見圖2。求得AUC值,AUC 能夠較好地評(píng)估模型的預(yù)測值與真實(shí)值之間的差異,3種模型評(píng)估結(jié)果,見表2。用y_test表示測試集真實(shí)值,y_train表示測試集預(yù)測值,predict_proba表示測試集預(yù)測概率,具體實(shí)現(xiàn)如下:
from sklearn.metrics import precision_score, f1_score, roc_curve,auc
accuracy = accuracy_score(y_test,y_train) #準(zhǔn)確率
F1 =f1_score(y_test,y_train) #F1值
fpr, tpr, _ = roc_curve(y_test,predict_proba) #FPR和TPR
auc(fpr, tpr) #AUC值
圖2 3種模型的POC曲線比較
表2 3種預(yù)測模型評(píng)估結(jié)果
根據(jù)各項(xiàng)評(píng)估指標(biāo)對(duì)3類預(yù)測模型的性能比較后發(fā)現(xiàn)隨機(jī)森林算法在測試結(jié)果中的各類指標(biāo)上都高于其他兩種算法,AUC值為0.861 9,若設(shè)定合適的閾值,模型具有一定的預(yù)測價(jià)值。因此用隨機(jī)森林算法構(gòu)建的模型更適合本研究數(shù)據(jù)集對(duì)于高危妊娠中早產(chǎn)和低體重兒的預(yù)測。最后利用基于隨機(jī)森林算法的預(yù)測模型得到所有特征的權(quán)重值如下。
各feature的重要性:[0.115 777 33、0.023 856、0.078 223 5、0.115 411 45、0.057 786 33、0.125 978 77、0.078 623 07、0.035 271 67、0.036 850 01、0.015 649 09、0.186 131 75、0.030 612 83、0.016 419 54、0.083 399 06]
其大小反映與該特征對(duì)應(yīng)的高危因素對(duì)早產(chǎn)及低出生體重兒影響程度的大小。結(jié)果顯示在本數(shù)據(jù)集研究的各高危因素中導(dǎo)致早產(chǎn)和低出生體重兒的前幾位高危因素分別是雙胎及胎兒過大、疤痕子宮及附件手術(shù)史、年齡、流產(chǎn)(自然、人工)≥2次及自然流產(chǎn)≥3次。
本研究應(yīng)用機(jī)器學(xué)習(xí)方法探索效果最佳的高危妊娠中早產(chǎn)和低出生體重兒預(yù)測模型,以常用分類器評(píng)估指標(biāo)來評(píng)估模型預(yù)測性能,確定基于隨機(jī)森林算法的預(yù)測模型為適用于本研究的最優(yōu)模型,利用模型分析得到導(dǎo)致早產(chǎn)、低出生體重兒的主要高危因素。實(shí)驗(yàn)結(jié)果一定程度上驗(yàn)證隨機(jī)森林作為一種重要的基于Bagging的集成學(xué)習(xí)方法的優(yōu)勢,后期將會(huì)進(jìn)一步研究和應(yīng)用集成學(xué)習(xí)中的Boosting方法,繼續(xù)探索預(yù)測性能更優(yōu)的模型。此外還需要考慮與平臺(tái)的整合以實(shí)現(xiàn)實(shí)時(shí)的數(shù)據(jù)分析和預(yù)測,輔助醫(yī)生診斷,幫助醫(yī)生及時(shí)關(guān)注高危人群并采取有效措施,為臨床早期干預(yù)和妊娠期的關(guān)鍵監(jiān)測提供參考,也希望為機(jī)器學(xué)習(xí)在醫(yī)學(xué)輔助決策中的應(yīng)用和發(fā)展做出一定的理論和實(shí)驗(yàn)貢獻(xiàn)。