梁子超 李智煒 賴 鏗 林卓琛 李鐵鋼 張晉昕
1 中山大學公共衛生學院醫學統計學系,510080 廣東 廣州;2 廣州市結核病防治所,510095 廣東 廣州
泛化能力是指模型在訓練集上訓練后,對新數據進行準確預測的能力。交叉驗證(cross-validation,CV)則是一種評估模型泛化能力的方法,廣泛應用于數據挖掘和機器學習領域[1]。在交叉驗證中,通常將數據集分為兩部分,一部分為訓練集,用于建立預測模型;另一部分為測試集,用于測試該模型的泛化能力。
在應用交叉驗證評估模型泛化能力的過程中,最關鍵的因素是選擇劃分訓練集和測試集的比率,當訓練集樣本量過小時會引發過擬合。在如何劃分2個集合的問題上,統計學界提出了多種方法:簡單交叉驗證(holdout cross-validation)、留一交叉驗證(leave-one-out cross-validation,LOOCV)、k折交叉驗證(k-fold cross-validation)、多重k折交叉驗證、分層法(stratification-split cross-validation)、自助法(bootstraps)等。
簡單交叉驗證將原始數據隨機分為2個集合,分別作為訓練集和測試集,但其最終所得結果與集合劃分比率密切相關,不同劃分比率結果變異可能較大。該方法在總數據集并不是非常大的情形下很難達到準確評估模型的目的。留一交叉驗證是指,假設在總集合中共有n個個體,每次選取1個個體作為測試集,其余個體作為訓練集。總共進行n次訓練,取平均值作為最終評價指標。留一交叉驗證較為可靠,在每次模型訓練中納入幾乎所有個體,當總集合中個體數目較多的情況下計算時間較長。k折交叉驗證則是將原始數據隨機平均分為k個子集,每個子集做測試集的同時,其余k-1個子集合并作為訓練集,進行k次訓練,取各評價指標(靈敏度、特異度、AUC等)的平均值。該方法可以使用數據集中的所有樣本進行預測,通過平均的評價指標來降低奇異的訓練集和測試集劃分方式對預測結果的影響。k值的選取對最終結果也有一定影響,有研究表明k值越大則評估準確性越高,當k為5或10時在評估準確性和計算復雜性下綜合性能最優[2]。
本文介紹10折交叉驗證的基本原理,使用R語言在實例中展示10折交叉驗證的實現方法。
10折交叉驗證是指將原始數據集隨機劃分為樣本數量近乎相等的10個子集,輪流將其中的9個合并作為訓練集,其余1個作為測試集。在每次試驗中計算正確率等評價指標,最終通過k次試驗后取評價指標的平均值來評估該模型的泛化能力。
10折交叉驗證被廣泛應用于醫學領域中的機器學習研究,作為一種測試集與訓練集劃分的方法。有研究者使用10折交叉驗證方法評價支持向量機算法利用影像學資料對新型冠狀病毒肺炎(COVID-19)的預測能力[3]。也有研究者利用支持向量機和稀疏貝葉斯極限學習機算法,在10折交叉驗證下使用腦電圖信號預測疼痛及疼痛出現的位置[4]。此外,也有研究者使用LASSO回歸算法及10折交叉回歸方法,通過長非編碼RNA(lncRNA)表達情況預測宮頸癌患者復發的風險[5]。
10折交叉驗證的基本步驟如下:
(1)原始數據集劃分為10個樣本量盡可能均衡的子集;
(2)使用第1個子集作為測試集,第2~9個子集合并作為訓練集;
(3)使用訓練集對模型進行訓練,計算多種評價指標在測試集下的結果;
(4)重復2~3步驟,輪流將第2~10個子集作為測試集;
(5)計算各評價指標的平均值作為最終結果。
10折交叉驗證的原理示意見圖1。

圖1 10折交叉驗證的原理示意圖
下面結合實例展示10折交叉驗證的具體實現方法。所有統計分析均使用R軟件(版本3.6.3)進行。其中k折交叉驗證使用caret包,繪制ROC曲線使用pROC包。
實例數據來源于廣州市胸科醫院2014年1月至2017年12月中所有被診斷為利福平耐藥結核病(rifampicin drug-resistant tuberculosis,RR-TB)、耐多藥結核病(multidrug-resistant tuberculosis,MDR-TB)或廣泛耐多藥結核病(extensively drug-resistant tuberculosis,XDR-TB)的患者治療前的基本人口學信息及部分臨床檢查結果,共387人次。
自變量包括年齡(<18歲、18~歲、30~歲、60~歲),性別,戶籍類型(本地、市內流動、外來流動),患者登記分類(新患者、初治失敗、復發、復治失敗),4種藥物耐藥性[isoniazid(INH)、rifampicin(RFP)、ethambutol(EMB)、streptomycin(SM)],診斷結果(RR/MDR/XDR-TB),抗結核一、二線藥物使用情況(無、僅使用一線藥、使用過一線和二線藥),是否在治,治療模式(門診、住院),使用藥物類型[國產,綠燈委員會(Green Light Committee,GLC)],治療時長(≤180 d、180 d~、360 d~、不詳),痰涂片結果(全程為陰性、陰性和陽性均出現過、全程為陽性),痰培養結果(全程為陰性、陰性和陽性均出現過、全程為陽性);因變量為治療結局(治愈、治療失敗)。
建立預測模型前對所有自變量進行單因素分析(使用χ2檢驗,當理論頻數<1時,使用Fisher確切概率法,檢驗水準α=0.10),將單因素分析有意義(戶籍類型,抗結核一、二線藥物使用情況,使用藥物類型,痰涂片結果,痰培養結果)和既往研究[6-8]提出的危險因素(年齡,登記類型,抗結核一、二線藥物使用情況,治療時長)作為自變量納入模型中,自變量中所有多分類變量均作為啞變量納入模型。使用逐步回歸法進行自變量篩選(納入水準為0.05,排除水準為0.10),篩選后最終僅納入戶籍類型和登記類型兩自變量進入預測模型。
在預測中,截斷值的確定是基于約登指數最大的法則。分別計算5折、10折、20折交叉驗證下的平均正確率、靈敏度、特異度、AUC值和程序運行時間。分別使用10個種子計算5、10、20折交叉驗證所得評價指標平均值的標準誤。得出10折交叉驗證下的10條ROC曲線及10次所有預測值與其對應的觀測值合并所得出的融合ROC曲線,同時將10折交叉驗證下10次所有預測值與其對應的觀測值融合后與留一交叉驗證方法得出的評價指標進行比較。這里的融合就是把k折交叉驗證的k輪預測結果放在一起,進而可以聯合起來計算出該驗證方法的統一靈敏度、特異度等指標值。
10折交叉驗證的關鍵代碼見表1。

表1 10折交叉驗證的關鍵代碼
10折交叉驗證下平均正確率為0.750(95%CI:0.659~0.841)、靈敏度為0.732、特異度為0.771、AUC為0.707;ROC曲線及融合ROC曲線見圖2。不同訓練集和測試集的劃分下各模型評價指標的波動較大。正確率的極差為0.455,四分位數間距為0.107;靈敏度的極差為0.471,四分位數間距為0.250;特異度的極差為0.600,四分位數間距為0.222;AUC的極差為0.448,四分位數間距為0.066。

圖2 10折交叉驗證下的ROC曲線及融合ROC曲線
實例中10折交叉驗證法在平均正確率和靈敏度中均高于5折與20折交叉驗證法。20折相較于10折而言計算復雜度增加的同時對評價指標的變化并不明顯,平均正確率降低0.037,平均AUC提高0.029。將10折交叉驗證中10次預測值與其原始觀測值融合后與留一驗證法進行比較,正確率、靈敏度和特異度相同且AUC差別不大,但程序運行時間明顯增加。從結果也可看出,隨著折數的增加程序運行時間也明顯增加。使用10個種子計算5、10、20折交叉驗證所得評價指標平均值的標準誤后可知,隨著折數增加各評價指標的標準誤也在增大。綜合以上結果可知,10折交叉驗證在提高各項評價指標的同時,穩定性與運行效率的損失相對較低。
實例中10折交叉驗證中10次訓練所得評價指標及平均值見表2;5、10、20折交叉驗證所得評價指標的平均值見表3;分別使用10個種子計算5、10、20折交叉驗證所得評價指標平均值的標準誤見表4;10折交叉驗證中10組數據融合及留一交叉驗證法所得評價指標見表5。

表2 10折交叉驗證中10次訓練所得評價指標及其平均值

表3 5、10、20折交叉驗證所得評價指標的平均值

表4 5、10、20折交叉驗證評價指標的標準誤(基于10個種子)

表5 10折交叉驗證融合與留一交叉驗證的對比
本文介紹了10折交叉驗證的原理和在R語言環境下的實現方法,用實例說明不同的訓練集和測試集劃分對模型預測評價指標的影響。相較于其他交叉驗證方法,10折交叉驗證能準確刻畫模型的泛化能力,穩定性與運行效率更佳。
10折交叉驗證在實踐中存在的局限性在于,當樣本量較少時,將該樣本隨機分為10份會導致每次使用的訓練集變化較大,導致最終10組評價指標的變異程度相對較大。當樣本量較大時,使用10折交叉驗證方法會導致模型計算復雜度增大且計算時間較長。當樣本量非常大時,可直接采用簡單交叉驗證。當樣本量較少或數據不平衡程度較強時,可能會出現其中某次訓練集中只有單一預測結局的情況,此時應減小折數,重新隨機劃分子集,采用分層法進行交叉驗證或使用自助法進行驗證。同時,使用10折交叉驗證時,應預設種子以便結果可重現。
10折交叉驗證被廣泛應用于多種機器學習模型中,除本文介紹的logistic模型外,在LASSO回歸、支持向量機、決策樹、樸素貝葉斯分類、隨機森林等多種模型中也可應用。STATA、SAS及MATLAB中均可使用10折交叉驗證方法。