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