習(xí)實(shí)戰(zhàn)指南:從Bagging、Boosting到Stacking的完整解析)
1. 集成算法整體思路拆解三個(gè)臭皮匠怎么頂上一個(gè)諸葛亮“七個(gè)葫蘆一條心”這個(gè)比喻放在機(jī)器學(xué)習(xí)里再貼切不過(guò)了。單個(gè)葫蘆娃各有所長(zhǎng)——有的噴火有的吐水有的隱身但單獨(dú)對(duì)上妖怪誰(shuí)都容易被各個(gè)擊破。一旦七兄弟合體心往一處想勁往一處使戰(zhàn)斗力立刻翻倍。集成算法Ensemble Learning干的就是這件事把一堆單個(gè)模型——哪怕每個(gè)都不太強(qiáng)——組合起來(lái)形成一個(gè)整體預(yù)測(cè)能力遠(yuǎn)超任何單個(gè)成員的強(qiáng)模型。搞機(jī)器學(xué)習(xí)的朋友都清楚單個(gè)模型天生就活在“偏差-方差的蹺蹺板”上。決策樹(shù)掰得夠深對(duì)訓(xùn)練數(shù)據(jù)記得牢牢的偏差低但方差高換一批數(shù)據(jù)表現(xiàn)就飄要是刻意限制樹(shù)的深度方差壓下去了欠擬合又冒出來(lái)了。邏輯回歸這類線性模型倒是方差穩(wěn)可面對(duì)復(fù)雜非線性關(guān)系偏差大得讓人頭疼。你在單個(gè)模型上調(diào)來(lái)調(diào)去本質(zhì)上就是在偏差和方差之間找一個(gè)讓自己勉強(qiáng)接受的平衡點(diǎn)而這個(gè)平衡點(diǎn)往往意味著模型能力的上限。集成算法繞開(kāi)了這個(gè)單點(diǎn)困境。它的底層邏輯建立在一種很樸素的認(rèn)識(shí)上多個(gè)有差異的模型它們的錯(cuò)誤往往是互相獨(dú)立的。A模型在這個(gè)樣本上猜錯(cuò)了B模型可能恰好猜對(duì)了B模型在另一個(gè)樣本上翻車(chē)C模型又能補(bǔ)上。把這些模型的預(yù)測(cè)結(jié)果綜合起來(lái)錯(cuò)誤就會(huì)被彼此抵消正確的信號(hào)被疊加放大。這里有個(gè)前提推導(dǎo)值得說(shuō)清楚。有一個(gè)二分類問(wèn)題假設(shè)我們訓(xùn)練出T個(gè)相互獨(dú)立的弱學(xué)習(xí)器每個(gè)學(xué)習(xí)器的錯(cuò)誤率是ε比如0.3比瞎猜強(qiáng)點(diǎn)但強(qiáng)得有限。用簡(jiǎn)單多數(shù)投票做最終決策集成模型的整體錯(cuò)誤率會(huì)隨T的增大急劇下降。T10時(shí)整體錯(cuò)誤率大約降到0.05左右T100時(shí)錯(cuò)誤率已經(jīng)趨近于零。這就是“弱可學(xué)習(xí)”向“強(qiáng)可學(xué)習(xí)”轉(zhuǎn)化的數(shù)學(xué)直覺(jué)——也解釋了為什么實(shí)踐里我們常常疊加幾百棵樹(shù)性能依然能穩(wěn)步爬升。但“獨(dú)立”這個(gè)條件在現(xiàn)實(shí)里幾乎做不到。所有基學(xué)習(xí)器都吃同一份訓(xùn)練數(shù)據(jù)用的還是同一種算法指望它們的錯(cuò)誤完全獨(dú)立太天真了。所以集成算法的設(shè)計(jì)重心從來(lái)不是“如何投票”而是“如何制造差異”。訓(xùn)練數(shù)據(jù)的隨機(jī)抽樣、特征維度的隨機(jī)挑選、樣本權(quán)重的動(dòng)態(tài)調(diào)整、不同算法甚至不同損失函數(shù)的混搭——這些手段的本質(zhì)目的只有一個(gè)讓每個(gè)基學(xué)習(xí)器看到不同的側(cè)面產(chǎn)生盡可能多樣化的“意見(jiàn)”。一個(gè)可用的集成系統(tǒng)必須同時(shí)滿足三個(gè)條件基學(xué)習(xí)器本身要夠準(zhǔn)。每個(gè)成員至少要優(yōu)于隨機(jī)猜測(cè)否則投票時(shí)候一群瞎猜的反而會(huì)把對(duì)的帶偏。成員之間要有多樣性。完全一樣的模型復(fù)制粘貼一百份預(yù)測(cè)結(jié)果一模一樣集成等于沒(méi)做。要有合適的組合策略。分類任務(wù)可以用多數(shù)投票回歸任務(wù)可以取平均更復(fù)雜的情況可以訓(xùn)練一個(gè)“裁判模型”來(lái)學(xué)習(xí)如何融合。這里順便提一個(gè)新手最容易踩的坑有人一看隨機(jī)森林效果比單棵決策樹(shù)好就以為樹(shù)越多越好盲目堆到幾千棵。實(shí)際上基學(xué)習(xí)器數(shù)量超過(guò)一定閾值后收益會(huì)邊際遞減訓(xùn)練時(shí)間卻線性增長(zhǎng)。我個(gè)人的體驗(yàn)是在大多數(shù)表格數(shù)據(jù)場(chǎng)景下幾百棵樹(shù)就足夠了再往上堆更多是心理安慰。2. 三大流派選型Bagging、Boosting、Stacking到底該選誰(shuí)集成算法聽(tīng)起來(lái)是一件事但落實(shí)到具體方案上分成了三條技術(shù)路線。它們解決問(wèn)題的側(cè)重點(diǎn)完全不同選錯(cuò)了流派數(shù)據(jù)再多也白搭。2.1 Bagging并行訓(xùn)練民主投票Bagging全稱是Bootstrap Aggregating核心做法是自助采樣。原始訓(xùn)練集有N個(gè)樣本每輪隨機(jī)有放回地抽N個(gè)樣本組成一個(gè)新訓(xùn)練集。因?yàn)橛蟹呕赜械臉颖緯?huì)被抽中多次有的可能一次都不出現(xiàn)大約會(huì)有約36.8%的樣本在每一輪的訓(xùn)練集中缺失——這個(gè)比例恰好是1減去e的負(fù)一次方。每個(gè)基學(xué)習(xí)器用不同的采樣集并行訓(xùn)練互不干擾最后預(yù)測(cè)時(shí)做平均或投票。隨機(jī)森林是Bagging家族最著名的代表。它在Bagging采樣之外又加了一把火每次節(jié)點(diǎn)分裂時(shí)不是從全部特征里找最優(yōu)切分點(diǎn)而是隨機(jī)挑一個(gè)特征子集常見(jiàn)的默認(rèn)值是特征總數(shù)的平方根再?gòu)淖蛹镞x最優(yōu)。這相當(dāng)于在樣本隨機(jī)之外又套了一層特征隨機(jī)進(jìn)一步放大了不同樹(shù)之間的差異性。兩重隨機(jī)疊加下來(lái)每棵樹(shù)之間的相關(guān)性顯著降低方差壓得特別狠。Bagging的抗噪能力很強(qiáng)對(duì)高方差模型比如深決策樹(shù)的改善立竿見(jiàn)影。它對(duì)異常值和噪聲相對(duì)不敏感因?yàn)橥镀睓C(jī)制天然會(huì)稀釋個(gè)別模型被噪聲帶偏的影響。如果你的數(shù)據(jù)特征很多、樣本量中等、模型容易過(guò)擬合Bagging通常是首選的起點(diǎn)。2.2 Boosting串行訓(xùn)練糾錯(cuò)成長(zhǎng)Boosting走的是另一條路。它不追求并行而是嚴(yán)格要求串行——每一輪都重點(diǎn)關(guān)注上一輪被分錯(cuò)的樣本。AdaBoost的做法是維護(hù)一份樣本權(quán)重每輪訓(xùn)練完提高被錯(cuò)分樣本的權(quán)重、降低正確樣本的權(quán)重下一個(gè)學(xué)習(xí)器被迫把注意力集中在“硬骨頭”上。把這些學(xué)習(xí)器按權(quán)重線性組合就得到最終的強(qiáng)模型。梯度提升Gradient Boosting是Boosting思想的現(xiàn)代版本。它不直接調(diào)樣本權(quán)重而是讓每一棵新樹(shù)去擬合前面所有樹(shù)累計(jì)預(yù)測(cè)的“殘差”——更嚴(yán)格地說(shuō)是損失函數(shù)關(guān)于當(dāng)前預(yù)測(cè)的負(fù)梯度。每一棵樹(shù)都在修補(bǔ)上一輪留下的漏洞整個(gè)過(guò)程像一個(gè)高手在持續(xù)打磨一件作品越修越精細(xì)。Boosting對(duì)低偏差高方差的模型改善效果顯著。實(shí)踐中你經(jīng)常能感覺(jué)到Boosting模型的上限比Bagging更高尤其在結(jié)構(gòu)化表格數(shù)據(jù)上梯度提升樹(shù)GBDT長(zhǎng)期是各類比賽的冠軍??汀4鷥r(jià)是它天然對(duì)噪聲敏感——如果訓(xùn)練集里有些標(biāo)簽本身就是錯(cuò)的Boosting會(huì)死磕這些錯(cuò)誤樣本花費(fèi)大量輪次去“學(xué)習(xí)”噪聲最后把模型帶偏。所以數(shù)據(jù)清洗環(huán)節(jié)沒(méi)做扎實(shí)的話上Boosting容易翻車(chē)。2.3 Stacking分層融合讓模型學(xué)習(xí)如何組合Bagging是投票Boosting是接力Stacking則是訓(xùn)練一個(gè)“裁判”。它把訓(xùn)練數(shù)據(jù)劃分成若干折用基學(xué)習(xí)器第一層在每一折上做交叉驗(yàn)證生成一組預(yù)測(cè)結(jié)果作為新特征然后再用一個(gè)元學(xué)習(xí)器第二層去學(xué)習(xí)這些新特征到真實(shí)標(biāo)簽的映射關(guān)系。Stacking的精髓在于讓模型自動(dòng)學(xué)出不同基學(xué)習(xí)器之間的“配合方式”。一個(gè)線性模型負(fù)責(zé)抓大放小一棵深層樹(shù)善于捕捉局部交互一個(gè)K近鄰對(duì)密度分布敏感——它們各自擅長(zhǎng)的事物不一樣。靠人拍腦袋定權(quán)重很難把這些不同算法的優(yōu)勢(shì)充分組合而Stacking用一個(gè)元模型學(xué)出來(lái)的組合權(quán)重往往比手工設(shè)置合理得多。Stacking的問(wèn)題也明顯計(jì)算開(kāi)銷(xiāo)大每個(gè)基學(xué)習(xí)器都要做多折交叉驗(yàn)證結(jié)構(gòu)復(fù)雜要維護(hù)兩層模型的調(diào)參邏輯而且用得不好容易過(guò)擬合。我的建議是別把Stacking當(dāng)默認(rèn)選項(xiàng)它更適合在第一層模型已經(jīng)精調(diào)過(guò)、各自表現(xiàn)都還不錯(cuò)的時(shí)候做最后一搏。如果第一層的模型本身就沒(méi)調(diào)好Stacking只是給“更大的混亂”增加了一層包裝。三種流派的核心差異我習(xí)慣用這個(gè)表格來(lái)快速對(duì)比維度BaggingBoostingStacking訓(xùn)練方式并行串行分層串行重點(diǎn)優(yōu)化降低方差降低偏差學(xué)習(xí)組合權(quán)重代表算法隨機(jī)森林AdaBoost、GBDT、XGBoost兩層或多層融合對(duì)噪聲敏感度低高中等訓(xùn)練效率高中低適用場(chǎng)景高方差模型、數(shù)據(jù)噪聲多追求極致精度、數(shù)據(jù)干凈多個(gè)強(qiáng)模型都需要保留時(shí)選型時(shí)我給一個(gè)最簡(jiǎn)單的判斷起點(diǎn)如果你不確定用什么先在干凈的表格數(shù)據(jù)上跑一個(gè)梯度提升類模型比如LightGBM再跑一個(gè)隨機(jī)森林做對(duì)照。隨機(jī)森林動(dòng)手快、結(jié)果穩(wěn)適合做基線梯度提升適合在基線基礎(chǔ)上往上沖刺精度。Stacking放到最后當(dāng)基線模型已經(jīng)收斂、你還有余力折騰的時(shí)候再上。3. 核心算法實(shí)操細(xì)節(jié)隨機(jī)森林、AdaBoost與梯度提升的調(diào)參要點(diǎn)很多人以為集成學(xué)習(xí)就是調(diào)幾個(gè)包的默認(rèn)參數(shù)跑完看下準(zhǔn)確率就完事。實(shí)際上同樣一個(gè)模型的默認(rèn)參數(shù)在不合適的場(chǎng)景下表現(xiàn)能差很遠(yuǎn)。下面把三個(gè)主流算法的關(guān)鍵參數(shù)和調(diào)參思路拆開(kāi)講。3.1 隨機(jī)森林讓樹(shù)“夠深但別太像”隨機(jī)森林的三個(gè)關(guān)鍵旋鈕是樹(shù)的數(shù)量n_estimators、分裂特征數(shù)max_features、樹(shù)的深度限制max_depth。樹(shù)的數(shù)量按照經(jīng)驗(yàn)先設(shè)一個(gè)適中的值比如200到500觀察交叉驗(yàn)證曲線。如果隨著樹(shù)增加驗(yàn)證誤差還在明顯下降就繼續(xù)加如果已經(jīng)走平再加樹(shù)除了徒增訓(xùn)練時(shí)間沒(méi)有意義。一條實(shí)測(cè)經(jīng)驗(yàn)隨機(jī)森林的樹(shù)數(shù)量達(dá)到300棵以上之后絕大多數(shù)數(shù)據(jù)集上的性能提升不超過(guò)1%。所以把精力花在調(diào)整特征采樣上收益更大。max_features是隨機(jī)森林最重要的超參數(shù)。分類任務(wù)默認(rèn)通常是特征總數(shù)的平方根回歸任務(wù)默認(rèn)是特征總數(shù)的三分之一。這個(gè)值調(diào)大的話單棵樹(shù)變強(qiáng)但樹(shù)與樹(shù)之間相關(guān)性變高方差壓不下去調(diào)小的話樹(shù)與樹(shù)差異變大但單棵樹(shù)太弱也會(huì)拖累整體。實(shí)操時(shí)可以從“根號(hào)特征數(shù)”出發(fā)朝兩個(gè)方向各試探幾步觀察驗(yàn)證集誤差變化。我的經(jīng)驗(yàn)是表格數(shù)據(jù)上max_features在總特征數(shù)的1/4到1/2之間往往能找到一個(gè)甜點(diǎn)。max_depth對(duì)于隨機(jī)森林來(lái)說(shuō)一般不限制會(huì)比強(qiáng)限制效果更好。樹(shù)足夠深單棵樹(shù)偏差足夠低而森林的方差靠隨機(jī)性來(lái)化解。如果數(shù)據(jù)量特別大或者特征噪聲明顯可以設(shè)一個(gè)深度上限比如15到20更多是為了控制訓(xùn)練時(shí)間和內(nèi)存占用。樣本量很小的情況下限制深度能減少過(guò)擬合風(fēng)險(xiǎn)。3.2 AdaBoost節(jié)奏比力氣更重要AdaBoost實(shí)踐中最容易被忽略的兩個(gè)因素是弱學(xué)習(xí)器的選擇和learning rate與迭代輪數(shù)的配合。弱學(xué)習(xí)器如果選決策樹(shù)深度通??刂圃?到3層。太深的樹(shù)在AdaBoost里容易“搶?xiě)颉卑褭?quán)重調(diào)整的節(jié)奏打亂。一個(gè)深度只有1層的決策樹(shù)也叫決策樁雖然單獨(dú)看弱得可憐但配合權(quán)重更新在AdaBoost框架下卻能表現(xiàn)出驚人的效果。我個(gè)人在大多數(shù)表格分類問(wèn)題上默認(rèn)從深度為1的決策樁開(kāi)始效果穩(wěn)健得讓人意外。learning rate在AdaBoost里決定了新加入的弱學(xué)習(xí)器對(duì)最終結(jié)果的影響力。學(xué)習(xí)率設(shè)小比如0.01需要極多輪迭代才能達(dá)到理想效果學(xué)習(xí)率設(shè)大比如1.0收斂快但容易在少量幾棵樹(shù)時(shí)就把樣本權(quán)重扭曲得不成樣子。實(shí)操的平衡做法是把learning rate定在0.1附近然后通過(guò)早停early stopping來(lái)確定迭代輪數(shù)。一個(gè)值得注意的坑是AdaBoost對(duì)數(shù)據(jù)噪聲的放大效應(yīng)明顯。訓(xùn)練集中如果有個(gè)別樣本的標(biāo)簽明顯異常你在調(diào)試過(guò)程中會(huì)發(fā)現(xiàn)AdaBoost的誤差曲線在迭代后期不降反升——因?yàn)樗恢痹谂Α靶U蹦莻€(gè)根本不該被校正的樣本。遇到這種情況先做一輪數(shù)據(jù)清洗把可疑樣本拿出來(lái)人工核對(duì)比一味調(diào)參更有效。3.3 梯度提升樹(shù)GBDT、XGBoost、LightGBM學(xué)習(xí)率與正則化的平衡術(shù)梯度提升類模型是當(dāng)前結(jié)構(gòu)化數(shù)據(jù)領(lǐng)域當(dāng)之無(wú)愧的王者。它的調(diào)參框架高度統(tǒng)一萬(wàn)變不離其宗的是學(xué)習(xí)率和樹(shù)復(fù)雜度之間的博弈。學(xué)習(xí)率learning rate也叫shrinkage是整套體系中最重要的參數(shù)。它控制每一棵樹(shù)對(duì)最終預(yù)測(cè)的貢獻(xiàn)程度。學(xué)習(xí)率越低模型需要越多棵樹(shù)來(lái)擬合同樣的信號(hào)但每一棵樹(shù)的“話事權(quán)”越小整體模型越平滑、越不容易過(guò)擬合。學(xué)習(xí)率0.1搭配200到500棵樹(shù)是絕大多數(shù)場(chǎng)景的安全起點(diǎn)追求極致精度的場(chǎng)合降到0.01搭配幾千棵樹(shù)也不稀奇。低學(xué)習(xí)率會(huì)讓訓(xùn)練時(shí)間顯著增加所以實(shí)踐中要在精度和算力之間做取舍。樹(shù)的復(fù)雜度由樹(shù)深度max_depth和葉子節(jié)點(diǎn)最小樣本數(shù)min_child_samples共同控制。XGBoost默認(rèn)深度是6LightGBM默認(rèn)深度是-1不限制靠葉子數(shù)量約束。我更推薦直接控制葉子節(jié)點(diǎn)數(shù)量num_leavesLightGBM里通常限制在16到64之間比單純限制深度更精細(xì)。一個(gè)實(shí)用經(jīng)驗(yàn)把學(xué)習(xí)率先固定為0.1然后用交叉驗(yàn)證掃描樹(shù)深度、葉子數(shù)量、樣本采樣比例這三個(gè)參數(shù)找到合適的復(fù)雜度區(qū)間最后再把學(xué)習(xí)率往低調(diào)、把迭代輪數(shù)往高提做最后一輪精細(xì)化。正則化參數(shù)方面XGBoost提供了L1alpha和L2lambda兩種懲罰LightGBM則用reg_alpha和reg_lambda。特征多、噪聲大的數(shù)據(jù)上把L2正則調(diào)大一些能明顯壓制過(guò)擬合。特征特別稀疏的場(chǎng)景L1正則的效果常常出乎意料地好。別小看這兩個(gè)參數(shù)在不少實(shí)際比賽中把lambda從1調(diào)到5甚至10驗(yàn)證集分?jǐn)?shù)能提高幾個(gè)百分點(diǎn)。還有一個(gè)容易踩的坑是關(guān)于類別特征的處理。XGBoost和LightGBM都號(hào)稱支持類別特征但處理方式不同。XGBoost需要手動(dòng)做編碼如one-hot或目標(biāo)編碼LightGBM可以直接傳類別列。但LightGBM對(duì)類別特征的處理本質(zhì)上是把類別的取值按目標(biāo)均值排序后做分裂遇到高基數(shù)類別特征比如城市名這種幾百個(gè)取值目標(biāo)編碼容易過(guò)擬合。安全建議是類別特征少、基數(shù)低比如小于10個(gè)取值直接丟給LightGBM處理基數(shù)很高還是自己做目標(biāo)編碼加平滑效果好得多。3.4 一個(gè)可以照抄的調(diào)參工作流集成學(xué)習(xí)調(diào)參如果漫無(wú)目的地瞎試很容易浪費(fèi)時(shí)間。我常用的工作流是這樣搭建基線用默認(rèn)參數(shù)訓(xùn)練隨機(jī)森林和LightGBM記錄驗(yàn)證集得分。這一步能快速判斷數(shù)據(jù)和特征的整體可學(xué)性。粗調(diào)樹(shù)復(fù)雜度固定學(xué)習(xí)率0.1和迭代輪數(shù)500分別掃描max_depth可選值3、5、8和num_leaves可選值16、31、64畫(huà)出驗(yàn)證集誤差曲線找到合適的復(fù)雜度區(qū)間。精調(diào)學(xué)習(xí)率與輪數(shù)把學(xué)習(xí)率降到0.05或0.01用早停法讓模型自動(dòng)決定迭代輪數(shù)。這一步通常能帶來(lái)幾個(gè)百分點(diǎn)的提升。調(diào)整正則項(xiàng)如果訓(xùn)練集得分遠(yuǎn)高于驗(yàn)證集明顯過(guò)擬合就加大L2正則或降低樹(shù)深度再觀察驗(yàn)證集。最終融合如果已經(jīng)調(diào)出多個(gè)不同算法的強(qiáng)模型比如一棵調(diào)好的LightGBM、一棵調(diào)好的隨機(jī)森林、一個(gè)核方法支持向量機(jī)再考慮用Stacking把它們?nèi)诤稀?. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄集成算法實(shí)際用起來(lái)問(wèn)題千奇百怪但背后原因反復(fù)就是那么幾個(gè)。這些年踩過(guò)的坑整理成幾個(gè)典型場(chǎng)景。4.1 集成之后反而變差了先查多樣性集成算法最尷尬的時(shí)刻——辛辛苦苦訓(xùn)練了幾百棵樹(shù)最后效果還不如單棵樹(shù)好。出現(xiàn)這個(gè)現(xiàn)象絕大多數(shù)原因是基學(xué)習(xí)器之間的多樣性不足。多樣性不足最常見(jiàn)的誘因是特征冗余。比如原始數(shù)據(jù)里有50列高度相關(guān)的特征隨機(jī)森林在做特征子采樣時(shí)無(wú)論怎么抽抽到的特征本質(zhì)上都在傳遞同一份信息。樹(shù)之間的差異被高度相關(guān)的特征限制住集成之后自然沒(méi)有增益。排查方法很直接對(duì)特征做相關(guān)性分析把相關(guān)性超過(guò)0.8的特征聚類每組保留一個(gè)有代表性的或者先用樹(shù)模型計(jì)算特征重要性消除重要性近乎為零的噪聲特征。清理過(guò)后再訓(xùn)練往往效果立竿見(jiàn)影。另一個(gè)誘因是用了確定性太強(qiáng)的基學(xué)習(xí)器。以相同的訓(xùn)練集、相同的特征子采樣邏輯、相同的種子訓(xùn)練一棵決策樹(shù)這棵樹(shù)每次的分裂是確定的換個(gè)隨機(jī)種子出來(lái)的樹(shù)長(zhǎng)得幾乎一模一樣。解決思路是把基學(xué)習(xí)器的隨機(jī)性充分注入比如訓(xùn)練每棵樹(shù)的樣本子集比例不要用默認(rèn)的1.0降到0.7或0.8或者對(duì)特征子采樣比例做進(jìn)一步降低。代價(jià)是單棵樹(shù)表現(xiàn)會(huì)變差但整體集成的穩(wěn)健性和最終精度通常會(huì)提升。4.2 訓(xùn)練誤差降到零驗(yàn)證誤差居高不下過(guò)擬合的三種典型形態(tài)集成算法里過(guò)擬合的表現(xiàn)和普通模型不完全一樣。普通模型的過(guò)擬合是訓(xùn)練得分極高、驗(yàn)證得分中規(guī)中矩集成模型的過(guò)擬合分三種形態(tài)判斷方式不同處理手段也完全不同。第一種是基學(xué)習(xí)器過(guò)深導(dǎo)致的過(guò)擬合。隨機(jī)森林和梯度提升里樹(shù)深度設(shè)得過(guò)大單棵樹(shù)把訓(xùn)練樣本磨得很細(xì)即使有集成平均太多“極端單棵樹(shù)”仍會(huì)把整體預(yù)測(cè)拉偏。處理手段是限制樹(shù)的深度或增加葉子節(jié)點(diǎn)約束再配合特征采樣比例的調(diào)整。第二種是迭代輪數(shù)過(guò)多導(dǎo)致的過(guò)擬合。Boosting家族尤其容易踩這個(gè)坑。XGBoost訓(xùn)練了好幾萬(wàn)輪訓(xùn)練集損失值一路走低但驗(yàn)證集早就不動(dòng)了。解決手段就是早?!隍?yàn)證集指標(biāo)連續(xù)多輪不改善時(shí)停止訓(xùn)練。LightGBM和XGBoost都內(nèi)置了early stopping接口直接在訓(xùn)練時(shí)傳入驗(yàn)證集和早停輪數(shù)即可。第三種是噪聲被過(guò)度學(xué)習(xí)。這與4.2節(jié)提到的AdaBoost問(wèn)題同源。Boosting機(jī)制天然會(huì)把難樣本的權(quán)重越抬越高如果這些難樣本本身是噪聲模型就是在死磕錯(cuò)誤答案。這種過(guò)擬合光靠調(diào)參很難根治根本解法還是數(shù)據(jù)質(zhì)量——把噪聲樣本識(shí)別出來(lái)并修正標(biāo)簽。有一個(gè)簡(jiǎn)單粗暴但經(jīng)常有效的檢查方式訓(xùn)練完成后挑出預(yù)測(cè)概率最不確信的那批樣本比如預(yù)測(cè)概率接近0.5人工看一下是不是標(biāo)簽本身有問(wèn)題。4.3 訓(xùn)練時(shí)間爆炸該做減法時(shí)果斷做減法在千萬(wàn)行級(jí)數(shù)據(jù)上跑梯度提升樹(shù)如果還開(kāi)著全特征全樣本訓(xùn)練時(shí)間能拖到讓人懷疑人生。優(yōu)化方向按優(yōu)先級(jí)排序如下。先降低樣本復(fù)雜度。LightGBM的is_unbalanced選項(xiàng)、XGBoost的subsample參數(shù)都能做行采樣。把樣本采樣比從1.0降到0.6到0.8訓(xùn)練速度提升立竿見(jiàn)影精度損失往往在可接受范圍內(nèi)。如果數(shù)據(jù)行數(shù)特別龐大直接采樣一部分做原型測(cè)試先把特征和參數(shù)跑通再今全量訓(xùn)練。再降低特征復(fù)雜度。特征重要性排序后把后20%的特征直接丟棄。多數(shù)情況下這些尾部特征帶來(lái)的有效信息很少卻會(huì)拖慢每次分裂時(shí)的特征掃描開(kāi)銷(xiāo)。LightGBM還提供了feature_fraction參數(shù)每次分裂只掃描一部分特征既能提速還能順帶增加模型多樣性一舉兩得。最后是換硬件路線。XGBoost的hist直方圖算法比exact精確貪心算法快一個(gè)量級(jí)LightGBM本就基于直方圖速度優(yōu)勢(shì)更明顯如果條件允許GPU版本能把訓(xùn)練時(shí)間再壓縮一個(gè)數(shù)量級(jí)。數(shù)據(jù)換到GPU上幾千棵樹(shù)幾分鐘就跑完了。4.4 類別不平衡下集成模型的特殊處理類別嚴(yán)重不平衡時(shí)集成模型的處理方式和普通模型不太一樣。隨機(jī)森林這類Bagging模型因?yàn)槊靠脴?shù)都是bootstrap采樣類別比例天然被歪曲模型容易偏向多數(shù)類。Boosting模型因?yàn)闄?quán)重機(jī)制對(duì)少數(shù)類的關(guān)注度相對(duì)高一點(diǎn)但也會(huì)出現(xiàn)過(guò)擬合少數(shù)類樣本的情況。實(shí)際處理時(shí)有兩條路線。第一是數(shù)據(jù)層面用SMOTE等過(guò)采樣方法生成少數(shù)類樣本或者對(duì)多數(shù)類做降采樣。第二是算法層面給少數(shù)類加更大的樣本權(quán)重class_weight參數(shù)或者調(diào)整決策閾值讓模型對(duì)少數(shù)類更敏感。我個(gè)人的習(xí)慣做法是交叉驗(yàn)證中選擇關(guān)注指標(biāo)比如F1分?jǐn)?shù)而不是準(zhǔn)確率調(diào)參時(shí)圍繞這個(gè)指標(biāo)做搜索而不是無(wú)腦優(yōu)化準(zhǔn)確率。在處理嚴(yán)重不平衡的任務(wù)時(shí)單靠隨機(jī)森林跑出0.95準(zhǔn)確率看似很美去看看少數(shù)類的召回率往往慘不忍睹。這時(shí)候把決策閾值向少數(shù)類方向移動(dòng)比重新訓(xùn)練一個(gè)模型帶來(lái)的改善更大。4.5 一個(gè)常備的排查速查表現(xiàn)象優(yōu)先排查項(xiàng)推薦手段集成比單模型差基學(xué)習(xí)器多樣性降低特征采樣比例、增加行采樣訓(xùn)練高驗(yàn)證低樹(shù)過(guò)深、輪數(shù)過(guò)多限制深度、加正則、早停訓(xùn)練時(shí)間過(guò)長(zhǎng)數(shù)據(jù)量大、特征冗余行采樣、特征篩選、直方圖算法精度始終上不去特征質(zhì)量而非模型特征工程、目標(biāo)編碼、交互特征類別不平衡決策閾值錯(cuò)位調(diào)閾值、加樣本權(quán)重、SMOTE5. 從“七個(gè)葫蘆”到“一條心”集成思想的延伸思考前面聊的都是技術(shù)細(xì)節(jié)最后想聊點(diǎn)框架層面的事。集成算法的價(jià)值不只是那幾行訓(xùn)練代碼它其實(shí)給我們提供了一種解決復(fù)雜問(wèn)題的通用思路——不追求某一個(gè)模型天賦異稟而是讓一群“平均水平”的模型通過(guò)合理的組織方式協(xié)同工作最終達(dá)到超過(guò)任何單體的水平。這個(gè)思路在工程里有很多變體。比如多折交叉驗(yàn)證融合把不同折訓(xùn)練出的模型取平均、多模型投票把不同算法、不同特征的模型的預(yù)測(cè)結(jié)果做多數(shù)表決、多尺度預(yù)測(cè)融合在不同窗口期或不同特征子集上分別建模型再合并。這些做法的本質(zhì)都圍著同一件事轉(zhuǎn)制造多樣性再設(shè)計(jì)合理的融合規(guī)則。在實(shí)際項(xiàng)目中我傾向于先把數(shù)據(jù)清洗和特征工程做扎實(shí)這些環(huán)節(jié)對(duì)最終效果的影響占比超過(guò)模型選型。集成算法更像一個(gè)放大器——你輸入的是高質(zhì)量特征它把信號(hào)放大到極致你輸入的是臟亂差的數(shù)據(jù)它也會(huì)一視同仁地把噪聲放大。無(wú)數(shù)人覺(jué)得集成就等于調(diào)模型參數(shù)其實(shí)數(shù)據(jù)集的質(zhì)量才是決定最終效果的那根最粗的杠桿。關(guān)于“七個(gè)葫蘆一條心”這個(gè)比喻還有一層值得琢磨的意思——集成算法的“心”也就是組合策略本身往往是整個(gè)系統(tǒng)里最容易被忽視卻最值得打磨的部分。多數(shù)投票、加權(quán)平均、堆疊融合每一種策略背后都有對(duì)應(yīng)的數(shù)學(xué)假設(shè)和適用條件。選定了一個(gè)集成方案花點(diǎn)時(shí)間去理解最終預(yù)測(cè)結(jié)果是怎么被組合出來(lái)的比盲目堆模型有意義得多。我在最后一次做大型表格數(shù)據(jù)競(jìng)賽的時(shí)候團(tuán)隊(duì)里每個(gè)人各顯神通——有人用隨機(jī)森林有人用LightGBM有人用深度模型。單拿出來(lái)誰(shuí)的分?jǐn)?shù)都不是最高。但最后把五路模型的預(yù)測(cè)做一個(gè)簡(jiǎn)單的加權(quán)平均提交分?jǐn)?shù)居然比跑得最好的那一路高出一截。那一刻我才真正理解了為什么說(shuō)集成學(xué)習(xí)的上限不取決于最強(qiáng)那個(gè)成員而是取決于大家聯(lián)合起來(lái)能補(bǔ)齊多少盲區(qū)。這種體驗(yàn)也讓我在后來(lái)的所有項(xiàng)目里養(yǎng)成了一個(gè)習(xí)慣拿到任務(wù)的第一時(shí)間先逼自己回答三個(gè)問(wèn)題——當(dāng)前問(wèn)題下哪些模型的光譜差異最大它們的易錯(cuò)樣本是否互補(bǔ)應(yīng)該用簡(jiǎn)單投票還是訓(xùn)練一個(gè)融合層這三個(gè)問(wèn)題想清楚集成很少會(huì)讓人失望。