證:模型選擇方法詳解)
我一直覺得模型選擇是數(shù)據(jù)分析里最像做決策的一個(gè)環(huán)節(jié)。上個(gè)月幫一個(gè)做用戶流失預(yù)測(cè)的團(tuán)隊(duì)看方案他們把邏輯回歸、隨機(jī)森林、XGBoost跑了個(gè)遍最后卻在“到底該信哪個(gè)模型”上卡住了。更麻煩的是有人拿著AIC、BIC的結(jié)果有人拿著交叉驗(yàn)證的結(jié)果兩邊給出的排名還不一致。這個(gè)問題其實(shí)不是個(gè)例。AIC、BIC和交叉驗(yàn)證是三種最常見的模型選擇方法但它們背后的邏輯完全不同一個(gè)從信息論角度給模型打分一個(gè)從貝葉斯角度追求“真相”另一個(gè)干脆不假設(shè)任何理論直接拿數(shù)據(jù)試。今天我就把這三種方法徹底拆開講清楚為什么它們會(huì)給出不同答案以及在實(shí)際項(xiàng)目里到底該聽誰的。1. 模型選擇到底在選什么從過擬合說起1.1 “擬合得好”為什么常常不靠譜假設(shè)有一段帶噪聲的數(shù)據(jù)真實(shí)規(guī)律近似一條直線模型A是線性回歸模型B是20階多項(xiàng)式回歸。模型B能把每個(gè)樣本點(diǎn)都擦過去訓(xùn)練集上的殘差幾乎為零但你拿它去預(yù)測(cè)幾個(gè)新樣本結(jié)果往往慘不忍睹。這不是巧合而是過擬合的必然結(jié)果模型在擬合訓(xùn)練集噪聲而不是數(shù)據(jù)背后的規(guī)律。我見過一個(gè)團(tuán)隊(duì)把訓(xùn)練集R2超過0.99的模型直接上線結(jié)果預(yù)測(cè)誤差比單純用歷史均值還大。原因就是模型把某個(gè)促銷活動(dòng)引起的波動(dòng)當(dāng)成長(zhǎng)期規(guī)律學(xué)進(jìn)去了換一批正常數(shù)據(jù)立刻原形畢露。所以“擬合得好”不等于“模型好”。如果你只用訓(xùn)練誤差做標(biāo)準(zhǔn)候選模型一定會(huì)隨著復(fù)雜度增加而一路狂奔永遠(yuǎn)選不出終點(diǎn)。模型選擇的第一課就是承認(rèn)訓(xùn)練集上的表現(xiàn)會(huì)騙人真正該關(guān)心的是模型在沒見過的數(shù)據(jù)上表現(xiàn)如何。這個(gè)問題的本質(zhì)是偏差-方差權(quán)衡。模型太簡(jiǎn)單比如只用全局均值去預(yù)測(cè)一切偏差很大因?yàn)樗咀ゲ蛔?shù)據(jù)里的結(jié)構(gòu)模型太復(fù)雜偏差下來了方差卻上去了只要換一批訓(xùn)練樣本參數(shù)估計(jì)值就會(huì)劇烈抖動(dòng)。你的目標(biāo)是在兩者之間找一個(gè)平衡點(diǎn)讓總誤差盡量小。這個(gè)平衡點(diǎn)就是模型選擇方法要幫你找的東西。1.2 為什么復(fù)雜度會(huì)成為“敵人”從數(shù)學(xué)上看增加參數(shù)幾乎總能降低訓(xùn)練誤差更多自由度意味著更強(qiáng)的表達(dá)能力極端情況下可以精確穿過每個(gè)訓(xùn)練點(diǎn)。但參數(shù)變多之后每個(gè)參數(shù)都是由有限樣本估計(jì)出來的估計(jì)量的方差會(huì)隨之上升。用多項(xiàng)式回歸舉例階數(shù)越高邊界處的預(yù)測(cè)值就越容易出現(xiàn)大幅擺動(dòng)這正是方差失控的典型表現(xiàn)。模型選擇方法的價(jià)值就是在“表達(dá)能力”和“估計(jì)穩(wěn)定性”之間做裁判。AIC和BIC通過懲罰參數(shù)個(gè)數(shù)來避免模型無限膨脹交叉驗(yàn)證則是直接把新數(shù)據(jù)上的表現(xiàn)當(dāng)成考卷用被試出來的誤差來定勝負(fù)。了解了這個(gè)背景后面三種方法的意圖就很好理解了。1.3 兩類模型選擇方法的底層思路基于剛才的框架可以把常見模型選擇方法分成兩類。一類是信息準(zhǔn)則類AIC、BIC都在其中它們的共同邏輯是先定義一個(gè)能衡量擬合好壞的量對(duì)數(shù)似然再減去一個(gè)隨復(fù)雜度增長(zhǎng)而增大的懲罰項(xiàng)最后取總分最高的模型。這類方法只需要在模型估計(jì)完成后多算兩行公式計(jì)算成本幾乎為零。另一類是重采樣類交叉驗(yàn)證是代表。它的邏輯更直接模擬“未來數(shù)據(jù)”把模型一批批地放到?jīng)]參與訓(xùn)練的數(shù)據(jù)上考試用實(shí)際考試成績(jī)來排名。這類方法幾乎不要求模型有似然函數(shù)和有效參數(shù)的概念代價(jià)是計(jì)算成本高。這兩種思路的適用范圍完全不同后面你會(huì)看到最好的做法往往不是二選一而是根據(jù)場(chǎng)景讓它們互為佐證。2. AIC與BIC同一個(gè)似然函數(shù)兩種截然不同的懲罰哲學(xué)2.1 共同的起點(diǎn)對(duì)數(shù)似然AIC和BIC雖然在目標(biāo)上分道揚(yáng)鑣但起點(diǎn)一致——都需要計(jì)算模型的對(duì)數(shù)似然 ln L。這個(gè)值度量的是在給定模型結(jié)構(gòu)和參數(shù)估計(jì)值的情況下你手上這組觀測(cè)數(shù)據(jù)出現(xiàn)的概率有多大。如果模型與你看到的數(shù)據(jù)“很般配”它給數(shù)據(jù)分配的概率就高似然值就大反之模型對(duì)數(shù)據(jù)的解釋能力弱似然值就小。由于概率是大量樣本的連乘數(shù)值會(huì)非常小甚至下溢統(tǒng)計(jì)上習(xí)慣取對(duì)數(shù)把連乘變成連加。對(duì)數(shù)似然越高說明模型對(duì)數(shù)據(jù)的擬合越好。注意這里說的是“在當(dāng)前這組參數(shù)下數(shù)據(jù)出現(xiàn)的概率”。為了讓模型在訓(xùn)練集上表現(xiàn)最好我們一般用最大似然估計(jì)MLE去確定參數(shù)。OLS線性回歸之所以能和AIC/BIC結(jié)合使用是因?yàn)樵谡龖B(tài)誤差假設(shè)下OLS的估計(jì)結(jié)果就等于最大似然估計(jì)所以公式中的 ln L 可以直接由殘差平方和算出來。這也是為什么很多統(tǒng)計(jì)軟件里線性回歸、GLM、ARIMA這些能寫出似然的模型都默認(rèn)輸出AIC和BIC而隨機(jī)森林、XGBoost這類模型壓根沒有這兩個(gè)指標(biāo)——因?yàn)樗鼈儧]有清晰的似然函數(shù)。2.2 AIC為預(yù)測(cè)而生的信息準(zhǔn)則AIC的全稱是赤池信息量準(zhǔn)則英文是Akaike Information Criterion公式是AIC -2·ln L 2k其中 k 是模型中參數(shù)的個(gè)數(shù)ln L 是最大對(duì)數(shù)似然。-2·ln L 這一項(xiàng)可以看成“擬合不夠好的成本”模型對(duì)數(shù)據(jù)解釋得越好這項(xiàng)越小。但單純追求它只會(huì)把模型越搞越復(fù)雜所以第二項(xiàng) 2k 作為對(duì)參數(shù)數(shù)量的懲罰提醒你“多一個(gè)參數(shù)就要付出代價(jià)”。為什么懲罰項(xiàng)的系數(shù)是2而不是1或3這要從KL散度說起。AIC本質(zhì)上是估計(jì)模型與真實(shí)數(shù)據(jù)生成過程之間KL散度的一種漸近無偏估計(jì)。在這個(gè)推導(dǎo)過程中交叉項(xiàng)漸近等于參數(shù)個(gè)數(shù)k乘上外面的-2就變成了2k。這些推導(dǎo)細(xì)節(jié)不展開你只需要記住2k是一個(gè)在大量模型族和分布假設(shè)下都成立的漸近結(jié)果不是拍腦袋定的。順便強(qiáng)調(diào)一個(gè)實(shí)踐細(xì)節(jié)k不是變量個(gè)數(shù)是估計(jì)出的參數(shù)個(gè)數(shù)。線性回歸里如果有3個(gè)自變量k一般是43個(gè)斜率加1個(gè)截距ARIMA(2,0,2)模型k通常是52個(gè)AR系數(shù)、2個(gè)MA系數(shù)、1個(gè)常數(shù)項(xiàng)或均值項(xiàng)。統(tǒng)計(jì)軟件在輸出AIC/BIC時(shí)會(huì)自動(dòng)算好但當(dāng)你手動(dòng)實(shí)現(xiàn)模型選擇時(shí)k一旦數(shù)錯(cuò)結(jié)果就會(huì)整體偏移。AIC還有一個(gè)廣為人知的小樣本版本AICcAICc AIC 2k(k1) / (n - k - 1)當(dāng)樣本量 n 和參數(shù)個(gè)數(shù) k 的比值比較小經(jīng)驗(yàn)上 n/k 40時(shí)AIC的小樣本偏差會(huì)比較明顯AICc的修正項(xiàng)會(huì)顯著起作用。實(shí)際做回歸建模時(shí)如果數(shù)據(jù)只有幾十條、候選模型參數(shù)卻有七八個(gè)直接報(bào)AICc比報(bào)AIC穩(wěn)得多。2.3 BIC貝葉斯風(fēng)格的一致選擇BIC全稱是貝葉斯信息準(zhǔn)則英文是Bayesian Information Criterion公式是BIC -2·ln L k·ln(n)乍一看和AIC長(zhǎng)得幾乎一樣差別只在懲罰項(xiàng)從2k換成了k·ln(n)。但這個(gè)差別是決定性的只要n大于8ln(n)就大于2樣本量越大BIC對(duì)參數(shù)數(shù)量的懲罰就越重。同樣是1000個(gè)樣本AIC對(duì)每個(gè)參數(shù)只懲罰2BIC卻要懲罰大約6.9。所以在樣本量可觀時(shí)BIC選出來的模型通常比AIC選出來的更簡(jiǎn)潔。BIC的數(shù)學(xué)來源是貝葉斯因子。它是對(duì)“給定數(shù)據(jù)下不同模型的邊際似然比”做近似后取對(duì)數(shù)得到的懲罰項(xiàng) k·ln(n) 實(shí)際上是在懲罰模型的先驗(yàn)復(fù)雜度。它追求的目標(biāo)不是預(yù)測(cè)誤差最小而是希望找到一個(gè)后驗(yàn)概率最高的模型——如果真實(shí)模型恰好就在你的候選集合里并且樣本量足夠大BIC會(huì)以概率1把它挑出來。這個(gè)性質(zhì)叫一致性。2.4 兩種哲學(xué)兩種答案AIC和BIC的分歧本質(zhì)是“你想預(yù)測(cè)未來還是想發(fā)現(xiàn)真相”。AIC在理論上具有漸近效率性當(dāng)候選模型都不完美時(shí)它能選出一個(gè)漸近意義上預(yù)測(cè)誤差最小的模型哪怕這個(gè)“最優(yōu)”模型依然不是真實(shí)模型。BIC則更偏重一致性樣本足夠大、真模型在候選集內(nèi)時(shí)它能鎖定真模型。舉一個(gè)具體場(chǎng)景你在做銷售預(yù)測(cè)有10個(gè)候選回歸模型。假設(shè)真實(shí)業(yè)務(wù)非常復(fù)雜沒有任何一個(gè)候選模型是“真模型”那BIC會(huì)因?yàn)閼土P過重總是偏向參數(shù)最少的那一個(gè)導(dǎo)致預(yù)測(cè)誤差偏大AIC則愿意保留更多變量換取更好的預(yù)測(cè)表現(xiàn)。反過來如果你在做影響某個(gè)指標(biāo)的關(guān)鍵因素分析目的是搞清楚到底哪些變量真正起作用BIC這種保守選擇通常更接近業(yè)務(wù)上講故事的需求。給一個(gè)直觀類比AIC像一位只看KPI的項(xiàng)目經(jīng)理他不在乎方案是不是最優(yōu)雅只在乎上線后的實(shí)際表現(xiàn)能不能達(dá)標(biāo)BIC像一位審計(jì)師他的原則是“證據(jù)不充分就不批準(zhǔn)”寧可少批一個(gè)不愿多批一個(gè)。正因?yàn)锳IC和BIC都只需要一次模型擬合就能算出來它們非常適合放進(jìn)自動(dòng)化的逐步回歸循環(huán)里每一步嘗試增加或刪除一個(gè)變量重新擬合模型計(jì)算AIC/BIC直到分?jǐn)?shù)不再下降為止。這種搜索方式在變量數(shù)不多時(shí)非常高效也是R語(yǔ)言中step類函數(shù)、Python中statsmodels相關(guān)實(shí)現(xiàn)的核心思路。3. 交叉驗(yàn)證把“未來表現(xiàn)”當(dāng)考卷的實(shí)戰(zhàn)派3.1 從留出法到K折交叉驗(yàn)證的思路非常簡(jiǎn)單粗暴既然擔(dān)心模型在訓(xùn)練集上的表現(xiàn)會(huì)騙人那就人為構(gòu)造一個(gè)“陌生數(shù)據(jù)集”來考它。最基本的操作是留出法把數(shù)據(jù)按比例切成訓(xùn)練集和測(cè)試集訓(xùn)練集用來擬合測(cè)試集用來算誤差。單次切分的結(jié)果受運(yùn)氣影響太大萬一訓(xùn)練集里碰巧全是容易預(yù)測(cè)的樣本模型的表現(xiàn)就會(huì)被高估反過來又會(huì)被低估。K折交叉驗(yàn)證就是留出法的升級(jí)版。把數(shù)據(jù)隨機(jī)打亂后等分成K份每次拿其中K-1份做訓(xùn)練、剩下的1份做驗(yàn)證輪流K次最后把K次驗(yàn)證誤差的平均值作為模型的預(yù)測(cè)誤差估計(jì)。這樣每個(gè)樣本都有機(jī)會(huì)“扮演”新數(shù)據(jù)估計(jì)結(jié)果更穩(wěn)定也不浪費(fèi)數(shù)據(jù)。交叉驗(yàn)證的“誤差”到底指什么取決于你的業(yè)務(wù)目標(biāo)回歸任務(wù)常用均方誤差MSE或平均絕對(duì)誤差MAE分類任務(wù)可以用錯(cuò)誤率、對(duì)數(shù)損失或AUC推薦任務(wù)甚至可以用排序指標(biāo)。交叉驗(yàn)證本身不關(guān)心是什么指標(biāo)只要你提前定義好“模型好壞”它就把這個(gè)指標(biāo)在K個(gè)驗(yàn)證集上的平均結(jié)果作為模型分?jǐn)?shù)。這一點(diǎn)比AIC/BIC更靈活因?yàn)锳IC/BIC本質(zhì)上還是在最大化似然無法直接融入AUC這類業(yè)務(wù)指標(biāo)。3.2 K為什么取5或10K的選擇是一個(gè)偏差-方差權(quán)衡。K越大每次訓(xùn)練用的數(shù)據(jù)越多估計(jì)的偏差越小但折與折之間的訓(xùn)練集高度重疊導(dǎo)致折與折之間的誤差高度相關(guān)平均值的方差反而可能上升計(jì)算量也更大。K越小比如2折或3折每次訓(xùn)練數(shù)據(jù)太少誤差估計(jì)的偏差變大。經(jīng)驗(yàn)上K5或K10是最常用的折中。10折的誤差估計(jì)偏差更小更接近全量數(shù)據(jù)訓(xùn)練后的模型表現(xiàn)5折計(jì)算量更小在很多穩(wěn)定模型上結(jié)果也足夠可靠。Kn的特殊情況叫留一法英文是Leave-One-Out Cross Validation每次只留一個(gè)樣本做驗(yàn)證。留一法的偏差最小但方差和計(jì)算成本讓人頭疼在中等規(guī)模數(shù)據(jù)上通常不是首選。3.3 重復(fù)交叉驗(yàn)證與嵌套交叉驗(yàn)證擔(dān)心單次K折結(jié)果不穩(wěn)定可以把整個(gè)K折流程重復(fù)若干次每次用不同的隨機(jī)種子切分?jǐn)?shù)據(jù)再把這幾十次驗(yàn)證誤差的平均值作為最終估計(jì)。這種做法叫重復(fù)交叉驗(yàn)證。我自己實(shí)測(cè)下來的感覺是它能明顯降低隨機(jī)切分帶來的方差是碰到“CV排名飄忽不定”時(shí)的第一反應(yīng)。嵌套交叉驗(yàn)證解決的問題更深一層。如果你在同一份數(shù)據(jù)上反復(fù)做特征選擇、調(diào)參再拿交叉驗(yàn)證結(jié)果去評(píng)估最終模型評(píng)估結(jié)果會(huì)被數(shù)據(jù)窺探偏誤污染你已經(jīng)在全量數(shù)據(jù)上看到了哪些特征表現(xiàn)好、哪些超參表現(xiàn)好再讓模型在這些數(shù)據(jù)上考一次分?jǐn)?shù)自然會(huì)虛高。嵌套CV的做法是外層循環(huán)負(fù)責(zé)估計(jì)最終模型的泛化誤差內(nèi)層循環(huán)負(fù)責(zé)選模型或調(diào)參外層每一折數(shù)據(jù)在選模型時(shí)完全不參與訓(xùn)練只在最后做一次評(píng)估。這樣得到的誤差估計(jì)更誠(chéng)實(shí)代價(jià)是計(jì)算量成倍上升。在做嚴(yán)格的風(fēng)控模型或醫(yī)療模型時(shí)嵌套CV幾乎是評(píng)估A榜、B榜模型泛化能力的標(biāo)配。3.4 交叉驗(yàn)證和AIC/BIC的隱性聯(lián)系很多文章把交叉驗(yàn)證描述成AIC/BIC的完全替代方案其實(shí)它們之間有理論聯(lián)系。統(tǒng)計(jì)學(xué)家Stone在1977年證明在很一般的正則條件下AIC漸近等價(jià)于留一法交叉驗(yàn)證。也就是說樣本量足夠大時(shí)你用AIC選出的模型和用LOOCV選出的模型大概率是同一個(gè)。BIC則和貝葉斯因子、后驗(yàn)?zāi)P透怕收驹谝黄鹋c交叉驗(yàn)證沒有這種天然的等價(jià)關(guān)系。這也解釋了為什么實(shí)際項(xiàng)目中三種方法的結(jié)果經(jīng)常接近如果候選模型都是一些常規(guī)的線性模型或GLM樣本量又過得去AIC、BIC和CV給出的排名基本一致。一旦結(jié)果明顯打架通常意味著樣本量太小、候選模型差異過大或者存在數(shù)據(jù)泄漏這時(shí)候先別急著選模型去檢查數(shù)據(jù)和流程才是正事。4. 適用場(chǎng)景辨析什么時(shí)候用信息準(zhǔn)則什么時(shí)候上交叉驗(yàn)證4.1 一張表看透三者的差異直接上結(jié)論這可能是全文最值得收藏的一張表對(duì)比維度AICBIC交叉驗(yàn)證核心目標(biāo)最小化預(yù)測(cè)誤差/KL散度找到后驗(yàn)概率最高的模型估計(jì)并比較泛化誤差核心假設(shè)模型可寫似然函數(shù)用MLE估計(jì)模型可寫似然函數(shù)貝葉斯框架近似數(shù)據(jù)可切分評(píng)估指標(biāo)可計(jì)算復(fù)雜度懲罰2k固定不變k·ln(n)隨樣本量增大而增大無顯式懲罰靠“陌生數(shù)據(jù)”自然體現(xiàn)小樣本表現(xiàn)不夠穩(wěn)建議用AICc容易過度簡(jiǎn)化誤差估計(jì)方差大計(jì)算成本低低高重復(fù)/嵌套時(shí)更高適合場(chǎng)景預(yù)測(cè)導(dǎo)向的常規(guī)統(tǒng)計(jì)模型變量篩選、尋找關(guān)鍵解釋變量機(jī)器學(xué)習(xí)模型、無似然模型、最終評(píng)估需要提醒的是AIC和BIC要求候選模型必須基于同一份數(shù)據(jù)、同一個(gè)因變量這一點(diǎn)很多人容易忽略。如果你在兩個(gè)模型家族之間比較比如一個(gè)廣義線性模型和一個(gè)混合效應(yīng)模型只要因變量和樣本都沒變AIC/BIC仍然可以比較但如果因變量經(jīng)過了不同的變換比如一個(gè)用原始值、一個(gè)用對(duì)數(shù)變換兩者的似然就不是同一個(gè)概念了直接比數(shù)值沒有意義。4.2 時(shí)間序列分析AIC和BIC的主場(chǎng)時(shí)間序列模型如ARIMA需要估計(jì)p、d、q的階數(shù)。這類場(chǎng)景中AIC/BIC幾乎是標(biāo)配原因有兩個(gè)第一ARIMA有明確的似然函數(shù)AIC/BIC可以快速對(duì)幾十組候選階數(shù)排序第二普通K折交叉驗(yàn)證要求樣本近似獨(dú)立時(shí)間序列樣本則前后相關(guān)直接隨機(jī)切分相當(dāng)于“偷看未來”會(huì)嚴(yán)重高估模型表現(xiàn)。正確做法是用滑窗式或時(shí)序切分的交叉驗(yàn)證操作起來比較繁瑣。所以很多時(shí)間序列建模流程的第一步都是直接用AIC/BIC定階。如果數(shù)據(jù)有明顯趨勢(shì)和季節(jié)性先用差分或STL分解把非平穩(wěn)成分處理掉再比較AIC/BIC否則準(zhǔn)則比較的模型根本不是同一個(gè)數(shù)據(jù)生成過程。時(shí)間序列里還有一個(gè)需要注意的點(diǎn)AICc在短序列上比AIC更可靠因?yàn)闃颖玖啃〉臅r(shí)候AIC的漸近修正不夠AICc能補(bǔ)償一部分偏差。4.3 機(jī)器學(xué)習(xí)項(xiàng)目交叉驗(yàn)證近乎唯一選擇隨機(jī)森林、LightGBM、神經(jīng)網(wǎng)絡(luò)這類模型要么沒有清晰的似然函數(shù)要么參數(shù)數(shù)量難以定義。你很難寫出AIC需要的ln L更別提BIC的貝葉斯近似。這時(shí)候交叉驗(yàn)證就變成最通用的評(píng)估手段。特征選擇場(chǎng)景也類似Lasso回歸的懲罰強(qiáng)度λ最優(yōu)值一般通過交叉驗(yàn)證來選而逐步回歸這類經(jīng)典變量選擇思路倒更適合AIC/BIC。如果你在機(jī)器學(xué)習(xí)項(xiàng)目里看到有人強(qiáng)行給LightGBM算AIC那多半是把樹的數(shù)量或者葉子節(jié)點(diǎn)數(shù)當(dāng)k代進(jìn)公式了這種做法理論上很牽強(qiáng)實(shí)際效果也不穩(wěn)定不建議拿它當(dāng)模型選擇的依據(jù)。4.4 小樣本場(chǎng)景的血淚建議樣本量很小比如只有幾十條數(shù)據(jù)時(shí)三種方法都有各自的坑。AIC在小樣本上容易選出過于復(fù)雜的模型但AICc的修正能頂?shù)舸蟀雴栴}BIC在n小時(shí)懲罰項(xiàng)不明顯選出的模型不一定符合預(yù)期交叉驗(yàn)證因?yàn)橛?xùn)練集被進(jìn)一步縮小誤差估計(jì)的方差會(huì)變得很大——同一份數(shù)據(jù)重復(fù)切分CV分?jǐn)?shù)可能從0.85跳到0.72。我個(gè)人的建議是樣本量小于一百候選模型又都是線性類的優(yōu)先看AICc把BIC作為第二參考如果一定要用交叉驗(yàn)證選留一法或者重復(fù)10折并且多跑幾個(gè)隨機(jī)種子看結(jié)果是否穩(wěn)定。小樣本問題沒有銀彈至少不要在只有60個(gè)樣本時(shí)去跑一個(gè)標(biāo)準(zhǔn)的單次5折CV就下結(jié)論。5. 實(shí)操中常見的坑與我現(xiàn)在的選擇流程5.1 坑拿AIC/BIC的絕對(duì)數(shù)值說話AIC和BIC是相對(duì)指標(biāo)它們的絕對(duì)值本身沒有含義只有在模型之間做差時(shí)才有意義。比較時(shí)習(xí)慣看ΔAIC兩個(gè)模型的ΔAIC小于2基本可以看作沒有差別大于4到7差的模型可信度明顯下降大于10弱者基本可以出局。BIC也有類似的解讀方式但閾值沒有AIC那么經(jīng)典大家更關(guān)注誰的BIC更小。還有一點(diǎn)容易踩坑AIC/BIC不是“越小越好”的無限制比較它只對(duì)同一份訓(xùn)練數(shù)據(jù)和同一個(gè)因變量有效。如果你把訓(xùn)練集改了或者把離群點(diǎn)刪了那所有模型的AIC/BIC都會(huì)整體變化但排名可能不變。做記錄時(shí)一定要把數(shù)據(jù)版本寫清楚不然一個(gè)月后回來看結(jié)果你可能完全不知道當(dāng)時(shí)的模型是在什么數(shù)據(jù)上比較的。5.2 坑交叉驗(yàn)證中的數(shù)據(jù)泄漏這是最隱蔽也最致命的坑。錯(cuò)誤一先用全量數(shù)據(jù)做標(biāo)準(zhǔn)化、獨(dú)熱編碼再去切折做CV。錯(cuò)誤二在全量數(shù)據(jù)上先做一遍特征選擇挑出“重要特征”再去做CV評(píng)估。這兩種操作都讓模型在驗(yàn)證時(shí)“見過”了不該見的信息得到的CV分?jǐn)?shù)會(huì)系統(tǒng)性虛高。正確流程是把所有預(yù)處理步驟放進(jìn)一個(gè)流水線里在每一折內(nèi)部重新擬合。用sklearn時(shí)把StandardScaler、PolynomialFeatures這些變換和模型一起塞進(jìn)Pipeline再交給cross_val_score就能避免大部分泄漏。如果你現(xiàn)在還在用全量數(shù)據(jù)標(biāo)準(zhǔn)化后再套cross_val_score的寫法我建議立刻改成Pipeline方案。5.3 坑目標(biāo)錯(cuò)位導(dǎo)致結(jié)果“打架”很多團(tuán)隊(duì)拿著同一組數(shù)據(jù)AIC選出5個(gè)變量的模型BIC選出3個(gè)變量的模型CV選出4個(gè)變量的模型然后開始爭(zhēng)論誰對(duì)。其實(shí)三種方法在回答不同的問題AIC問“哪個(gè)模型預(yù)測(cè)最好”BIC問“哪個(gè)模型更可能是真的”CV問“如果上真實(shí)數(shù)據(jù)這個(gè)模型的預(yù)測(cè)誤差估計(jì)是多少”。目標(biāo)不同答案不同是正常的。如果你的業(yè)務(wù)目標(biāo)是預(yù)測(cè)優(yōu)先采用AIC和CV的共識(shí)如果你的目標(biāo)是從一堆變量里挑出真正的驅(qū)動(dòng)因素BIC偏保守的特征集通常更可信。先定義清楚問題再談選模型否則只會(huì)陷入無休止的爭(zhēng)論。5.4 一次性看清三種方法一個(gè)可復(fù)現(xiàn)的小實(shí)驗(yàn)紙上談兵再多不如自己跑一遍。這里給一個(gè)簡(jiǎn)單的Python實(shí)驗(yàn)生成一個(gè)帶噪聲的二次函數(shù)數(shù)據(jù)真實(shí)模型是二階多項(xiàng)式然后分別構(gòu)建1階、3階、10階多項(xiàng)式回歸一次性看AIC、BIC和10折CV的差異。import numpy as np import pandas as pd import statsmodels.api as sm from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.pipeline import make_pipeline from sklearn.model_selection import cross_val_score np.random.seed(42) x np.linspace(0, 1, 100) y 1 2 * x 0.5 * x**2 np.random.normal(0, 0.2, sizex.shape) results [] for degree in [1, 3, 10]: X_poly PolynomialFeatures(degreedegree, include_biasFalse).fit_transform(x[:, None]) ols sm.OLS(y, sm.add_constant(X_poly)).fit() pipe make_pipeline( PolynomialFeatures(degreedegree, include_biasFalse), LinearRegression() ) cv_mse -cross_val_score( pipe, x[:, None], y, cv10, scoringneg_mean_squared_error ).mean() results.append({ degree: degree, AIC: ols.aic, BIC: ols.bic, CV_MSE: cv_mse }) print(pd.DataFrame(results).round(3))跑完之后結(jié)果大概率是1階模型欠擬合AIC、BIC、CV_MSE三項(xiàng)都偏大3階模型各項(xiàng)指標(biāo)最好10階模型雖然訓(xùn)練誤差很小但AIC/BIC因?yàn)閰?shù)多被明顯懲罰CV_MSE也比3階模型大。這說明三種方法在常規(guī)場(chǎng)景下的結(jié)論基本一致。你可以把np.random.seed換幾個(gè)值再跑幾次會(huì)發(fā)現(xiàn)偶爾1階和3階的排名會(huì)波動(dòng)這正是噪聲和小樣本場(chǎng)景下模型選擇不確定性的體現(xiàn)。上面代碼里我直接用原始x的冪次做多項(xiàng)式特征只是為了演示方便實(shí)際項(xiàng)目中建議對(duì)特征做標(biāo)準(zhǔn)化或使用正交多項(xiàng)式避免多重共線性讓OLS系數(shù)估計(jì)波動(dòng)過于劇烈。5.5 我現(xiàn)在的模型選擇流程最后分享一套我固定用的流程。第一步把候選模型限定在一個(gè)合理范圍內(nèi)不要無腦堆變量。第二步如果所有候選模型都有似然形式把AICc和BIC一起計(jì)算出來如果模型是無似然的機(jī)器學(xué)習(xí)模型直接進(jìn)入第三步。第三步用10折交叉驗(yàn)證獲得預(yù)測(cè)誤差估計(jì)時(shí)間序列數(shù)據(jù)用滑窗切分小樣本用重復(fù)留一法。第四步把三種結(jié)果放在同一張表里看三者指向同一模型時(shí)是最穩(wěn)的情況直接收工AIC和CV一致、BIC指向更簡(jiǎn)單模型時(shí)以AIC和CV為主因?yàn)槟愕娜蝿?wù)多半是預(yù)測(cè)BIC和CV一致、AIC指向更復(fù)雜模型時(shí)如果業(yè)務(wù)需要解釋聽BIC如果業(yè)務(wù)對(duì)預(yù)測(cè)精度極其敏感再謹(jǐn)慎看一眼CV的評(píng)估結(jié)果三者完全分裂時(shí)先檢查數(shù)據(jù)泄漏、樣本量和候選模型范圍不要急著選。這套流程沒有理論上的“最優(yōu)”但它能逼你把“用什么標(biāo)準(zhǔn)選”這個(gè)問題想清楚。AIC、BIC和交叉驗(yàn)證不是互相取代的關(guān)系而是從不同角度回答同一個(gè)問題的三面鏡子。你能做的是用對(duì)鏡子而不是問哪面鏡子更高級(jí)。