森林算法詳解:從原理到調(diào)參實(shí)戰(zhàn))
1. 從單棵樹到一片森林為什么需要集成學(xué)習(xí)如果你之前接觸過決策樹大概率會(huì)有一種感覺這玩意兒?jiǎn)慰糜闷饋硗χ庇^但總有點(diǎn)“飄”。數(shù)據(jù)稍微變一點(diǎn)樹的結(jié)構(gòu)可能就完全不一樣了預(yù)測(cè)結(jié)果也跟著抖。我最早做分類任務(wù)時(shí)用單棵決策樹跑出來的模型在訓(xùn)練集上表現(xiàn)近乎完美一到測(cè)試集就拉胯后來才明白那是典型的過擬合——樹長(zhǎng)得太深把訓(xùn)練數(shù)據(jù)里的噪聲都當(dāng)成規(guī)律學(xué)進(jìn)去了。單棵決策樹的痛點(diǎn)其實(shí)很明確方差大、不穩(wěn)定、容易過擬合。你可以把它想象成一個(gè)偏科嚴(yán)重的學(xué)生在某次考試中碰巧押中了題分?jǐn)?shù)很高但換一套卷子就露餡了。集成學(xué)習(xí)的思路就是——既然一個(gè)學(xué)生不靠譜那就找一群學(xué)生來投票。這群學(xué)生各自有不同的知識(shí)盲區(qū)但只要他們平均下來是對(duì)的最終結(jié)果就比任何一個(gè)人單獨(dú)判斷要穩(wěn)。隨機(jī)森林Random Forest就是集成學(xué)習(xí)里最經(jīng)典、最實(shí)用、工業(yè)界落地最多的算法之一。它屬于Bagging 類集成方法核心思想是“并行地訓(xùn)練多棵決策樹然后讓它們投票決定結(jié)果”。注意這里的關(guān)鍵詞是“隨機(jī)”和“森林”——隨機(jī)體現(xiàn)在兩個(gè)層面森林則意味著不是一棵樹在戰(zhàn)斗。這篇文章我會(huì)從算法原理、核心參數(shù)、實(shí)操代碼、調(diào)參經(jīng)驗(yàn)、常見踩坑幾個(gè)維度把隨機(jī)森林徹底講透。不管你是剛?cè)腴T機(jī)器學(xué)習(xí)的新手還是已經(jīng)用過sklearn但沒深究過內(nèi)部機(jī)制的老手應(yīng)該都能從中拿到一些能直接用的東西。提示本文默認(rèn)讀者已經(jīng)了解決策樹的基本概念信息熵、基尼系數(shù)、分裂增益如果你對(duì)這部分還不熟建議先補(bǔ)一下決策樹的基礎(chǔ)否則理解隨機(jī)森林的“隨機(jī)性”設(shè)計(jì)會(huì)有點(diǎn)吃力。2. 隨機(jī)森林的核心機(jī)制拆解2.1 兩個(gè)“隨機(jī)”到底隨機(jī)在哪里隨機(jī)森林的名字里“隨機(jī)”出現(xiàn)了兩次的意味其實(shí)對(duì)應(yīng)著兩個(gè)不同層面的隨機(jī)采樣過程。這兩個(gè)隨機(jī)性是整個(gè)算法能夠成立的基礎(chǔ)缺了任何一個(gè)效果都會(huì)大打折扣。第一個(gè)隨機(jī)樣本隨機(jī)采樣Bootstrap Sampling。假設(shè)原始訓(xùn)練集有 N 個(gè)樣本隨機(jī)森林在訓(xùn)練每一棵樹時(shí)會(huì)從這 N 個(gè)樣本中有放回地抽取 N 個(gè)樣本作為該樹的訓(xùn)練集。有放回意味著某些樣本會(huì)被重復(fù)抽到而另一些樣本可能一次都沒被抽中。根據(jù)概率論當(dāng) N 足夠大時(shí)大約36.8%的樣本不會(huì)被任何一棵樹抽中這些樣本被稱為“袋外樣本”O(jiān)ut-of-Bag簡(jiǎn)稱 OOB。這個(gè) 36.8% 是怎么來的計(jì)算很簡(jiǎn)單一個(gè)樣本在一次抽樣中不被抽到的概率是 1 - 1/NN 次獨(dú)立抽樣后仍未被抽到的概率是 (1 - 1/N)^N當(dāng) N 趨于無窮時(shí)這個(gè)值趨近于 1/e ≈ 0.368。這就是袋外樣本比例的數(shù)學(xué)來源。OOB 樣本有什么用它可以充當(dāng)每棵樹的“驗(yàn)證集”不需要額外劃分驗(yàn)證集就能評(píng)估模型泛化能力。這個(gè)后面會(huì)詳細(xì)講。第二個(gè)隨機(jī)特征隨機(jī)選擇Feature Randomness。在每棵樹的每個(gè)節(jié)點(diǎn)進(jìn)行分裂時(shí)算法不會(huì)考慮全部 M 個(gè)特征而是隨機(jī)抽取 m 個(gè)特征m 通常遠(yuǎn)小于 M在這 m 個(gè)特征里選最優(yōu)的分裂點(diǎn)。這個(gè)設(shè)計(jì)非常關(guān)鍵——如果每棵樹都在全部特征里選最優(yōu)分裂那所有樹的結(jié)構(gòu)會(huì)高度相似集成就失去了意義。特征隨機(jī)性保證了樹與樹之間的差異性讓“投票”真正有效。m 的默認(rèn)取值在分類任務(wù)中通常是 sqrt(M)回歸任務(wù)中是 M/3。這個(gè)值可以調(diào)后面會(huì)講怎么調(diào)。2.2 Bagging 與 Boosting 的本質(zhì)區(qū)別很多人會(huì)把隨機(jī)森林和 GBDT、XGBoost 搞混這里必須把 Bagging 和 Boosting 的區(qū)別說清楚。對(duì)比維度Bagging隨機(jī)森林BoostingGBDT/XGBoost訓(xùn)練方式并行每棵樹獨(dú)立訓(xùn)練串行后一棵樹依賴前一棵樣本權(quán)重等權(quán)Bootstrap 采樣動(dòng)態(tài)調(diào)整關(guān)注錯(cuò)分樣本偏差與方差主要降低方差主要降低偏差過擬合風(fēng)險(xiǎn)較低樹越多越穩(wěn)較高需要早停和正則化訓(xùn)練速度可并行速度快串行速度較慢調(diào)參難度相對(duì)簡(jiǎn)單參數(shù)多調(diào)參復(fù)雜簡(jiǎn)單說Bagging 是“三個(gè)臭皮匠頂個(gè)諸葛亮”靠集體智慧降低方差Boosting 是“知恥而后勇”每輪針對(duì)前面的錯(cuò)誤重點(diǎn)補(bǔ)強(qiáng)。隨機(jī)森林屬于前者它的優(yōu)勢(shì)在于不容易過擬合、對(duì)參數(shù)不敏感、訓(xùn)練可并行非常適合作為 baseline 模型快速上線。2.3 投票機(jī)制分類與回歸的差異隨機(jī)森林在預(yù)測(cè)階段的邏輯分類和回歸任務(wù)是不一樣的。分類任務(wù)采用多數(shù)投票法Majority Voting每棵樹給出一個(gè)類別預(yù)測(cè)最終選擇出現(xiàn)次數(shù)最多的類別。在sklearn的實(shí)現(xiàn)中實(shí)際上用的是概率平均——每棵樹輸出各類別的概率然后對(duì)所有樹的概率取平均再選概率最大的類別。這兩種方式在大多數(shù)情況下結(jié)果一致但概率平均能提供更細(xì)粒度的置信度信息?;貧w任務(wù)采用均值法每棵樹輸出一個(gè)預(yù)測(cè)值最終結(jié)果是所有樹預(yù)測(cè)值的算術(shù)平均。這很直觀也容易理解。注意隨機(jī)森林的投票是“硬投票”還是“軟投票”會(huì)影響結(jié)果。sklearn的RandomForestClassifier默認(rèn)使用軟投票概率平均如果你想要硬投票需要設(shè)置votinghard僅在VotingClassifier中可用隨機(jī)森林本身不直接暴露這個(gè)參數(shù)但可以通過predict_proba自行實(shí)現(xiàn)。3. 核心參數(shù)詳解與調(diào)參邏輯3.1 n_estimators樹的數(shù)量怎么定n_estimators是隨機(jī)森林中最重要的參數(shù)之一它決定了森林里有多少棵決策樹。樹越多模型的方差越小泛化能力越強(qiáng)——但這不是無限的。我做過一組對(duì)比實(shí)驗(yàn)用同一個(gè)數(shù)據(jù)集約 5 萬條樣本30 個(gè)特征二分類任務(wù)固定其他參數(shù)只改變n_estimators觀察驗(yàn)證集 AUC 的變化樹的數(shù)量驗(yàn)證集 AUC訓(xùn)練耗時(shí)秒100.8421.2500.8715.81000.87911.52000.88223.15000.88358.410000.883117.2可以看到從 100 到 1000AUC 只提升了 0.004但訓(xùn)練時(shí)間翻了十倍。收益遞減非常明顯。我的經(jīng)驗(yàn)是n_estimators設(shè)在 100 到 300 之間通常就夠了除非你的數(shù)據(jù)集特別大或者噪聲特別多才需要加到 500 以上。還有一個(gè)實(shí)用技巧如果你不確定設(shè)多少可以先設(shè)一個(gè)較大的值比如 500然后畫出“樹數(shù)量 vs OOB 誤差”的曲線找到誤差趨于平穩(wěn)的那個(gè)點(diǎn)取那個(gè)值附近即可。3.2 max_depth 與 min_samples_split控制樹生長(zhǎng)的關(guān)鍵雖然隨機(jī)森林比單棵決策樹抗過擬合但這不意味著你可以完全不管樹的深度。如果每棵樹都長(zhǎng)得特別深雖然 Bagging 能降低方差但每棵樹的偏差會(huì)很小、方差很大集成后的效果仍然可能不理想。max_depth控制樹的最大深度默認(rèn)是None不限制。min_samples_split控制節(jié)點(diǎn)分裂所需的最小樣本數(shù)默認(rèn)是 2。min_samples_leaf控制葉子節(jié)點(diǎn)的最小樣本數(shù)默認(rèn)是 1。這三個(gè)參數(shù)是控制樹復(fù)雜度的“三件套”。我的調(diào)參順序通常是先固定max_depth在 10-20 之間根據(jù)數(shù)據(jù)量調(diào)整避免樹長(zhǎng)得太深。然后調(diào)min_samples_split從 2 逐步增加到 10、20觀察驗(yàn)證集效果。最后微調(diào)min_samples_leaf通常設(shè)在 1-5 之間。實(shí)操心得如果你的數(shù)據(jù)集噪聲很大把min_samples_leaf設(shè)大一點(diǎn)比如 5 或 10往往比調(diào)max_depth更有效。因?yàn)槿~子節(jié)點(diǎn)樣本多了每棵樹的預(yù)測(cè)會(huì)更“保守”對(duì)噪聲的魯棒性更強(qiáng)。3.3 max_features特征隨機(jī)性的強(qiáng)度控制max_features是隨機(jī)森林獨(dú)有的參數(shù)它決定了每次分裂時(shí)隨機(jī)考慮多少個(gè)特征。這個(gè)參數(shù)直接影響了樹與樹之間的相關(guān)性。如果max_features設(shè)得太大接近總特征數(shù)每棵樹都在幾乎相同的特征空間里選最優(yōu)分裂樹之間的相關(guān)性高集成的多樣性不足效果接近單棵決策樹。如果設(shè)得太小每棵樹的擬合能力受限偏差增大可能需要更多樹來補(bǔ)償。sklearn的默認(rèn)值分類任務(wù)用sqrt(n_features)回歸任務(wù)用n_features注意回歸默認(rèn)是全部特征不是 1/3這點(diǎn)和很多教材說的不一樣。實(shí)際使用中我通常會(huì)在sqrt(n_features)和log2(n_features)之間試一下取驗(yàn)證集效果好的那個(gè)。max_features 取值適用場(chǎng)景特點(diǎn)sqrt(n)分類任務(wù)默認(rèn)通用平衡偏差與方差log2(n)特征數(shù)很多時(shí)多樣性更強(qiáng)偏差略大0.3-0.5 * n特征數(shù)較少時(shí)每棵樹擬合能力更強(qiáng)n不推薦失去隨機(jī)性退化為 Bagging3.4 oob_score免費(fèi)的驗(yàn)證集前面提到Bootstrap 采樣會(huì)留下約 36.8% 的袋外樣本。sklearn提供了oob_scoreTrue選項(xiàng)開啟后可以用這些袋外樣本評(píng)估模型性能相當(dāng)于免費(fèi)的交叉驗(yàn)證。from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import make_classification X, y make_classification(n_samples10000, n_features20, random_state42) rf RandomForestClassifier( n_estimators200, oob_scoreTrue, random_state42, n_jobs-1 ) rf.fit(X, y) print(fOOB Score: {rf.oob_score_:.4f})OOB 分?jǐn)?shù)和交叉驗(yàn)證分?jǐn)?shù)通常很接近但計(jì)算成本低得多。當(dāng)你的數(shù)據(jù)集很大、交叉驗(yàn)證太慢時(shí)OOB 是一個(gè)非常好的替代方案。不過要注意OOB 估計(jì)在小數(shù)據(jù)集上可能不穩(wěn)定樣本量少于幾千時(shí)建議還是用交叉驗(yàn)證。4. 完整實(shí)操從數(shù)據(jù)到模型部署4.1 數(shù)據(jù)準(zhǔn)備與預(yù)處理要點(diǎn)隨機(jī)森林對(duì)數(shù)據(jù)的要求比很多算法都寬松——不需要?dú)w一化、不需要處理缺失值sklearn的隨機(jī)森林不能直接處理缺失值但可以通過插補(bǔ)解決、能處理非線性關(guān)系。但有幾個(gè)點(diǎn)還是要注意。類別特征處理隨機(jī)森林不能直接吃字符串類別需要用LabelEncoder或OrdinalEncoder轉(zhuǎn)成數(shù)值。雖然理論上可以用 One-Hot 編碼但當(dāng)類別數(shù)很多時(shí)比如超過 20 個(gè)One-Hot 會(huì)導(dǎo)致特征維度爆炸反而影響效果。我的做法是類別數(shù)少于 10 個(gè)用 One-Hot多于 10 個(gè)用目標(biāo)編碼Target Encoding或者直接 Label Encoding 讓樹自己去學(xué)分裂點(diǎn)。缺失值處理隨機(jī)森林本身不支持缺失值需要提前用均值、中位數(shù)或 KNN 插補(bǔ)。如果缺失比例很高超過 30%建議考慮增加一個(gè)“是否缺失”的指示特征有時(shí)候缺失本身就有信息量。異常值隨機(jī)森林對(duì)異常值相對(duì)魯棒因?yàn)闃涞姆至咽腔谂判虻臉O端值不會(huì)像線性模型那樣產(chǎn)生巨大影響。但如果異常值比例很高還是建議先做一下 Winsorize 處理。4.2 一個(gè)完整的分類任務(wù)實(shí)戰(zhàn)下面用一個(gè)模擬數(shù)據(jù)集走一遍完整流程包括數(shù)據(jù)劃分、模型訓(xùn)練、OOB 評(píng)估、特征重要性分析和模型保存。import numpy as np import pandas as pd from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, roc_auc_score import joblib # 1. 生成模擬數(shù)據(jù) X, y make_classification( n_samples20000, n_features30, n_informative15, n_redundant5, n_classes2, random_state42 ) # 2. 劃分訓(xùn)練集和測(cè)試集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) # 3. 初始化模型 rf RandomForestClassifier( n_estimators300, max_depth15, min_samples_split5, min_samples_leaf2, max_featuressqrt, oob_scoreTrue, random_state42, n_jobs-1 ) # 4. 訓(xùn)練 rf.fit(X_train, y_train) # 5. 評(píng)估 print(fOOB Score: {rf.oob_score_:.4f}) y_pred rf.predict(X_test) y_prob rf.predict_proba(X_test)[:, 1] print(fTest AUC: {roc_auc_score(y_test, y_prob):.4f}) print(classification_report(y_test, y_pred)) # 6. 特征重要性 importances pd.Series(rf.feature_importances_, index[ff{i} for i in range(30)]) print(importances.sort_values(ascendingFalse).head(10)) # 7. 保存模型 joblib.dump(rf, rf_model.pkl)這段代碼跑下來OOB 分?jǐn)?shù)和測(cè)試集 AUC 通常非常接近說明模型沒有明顯過擬合。特征重要性輸出可以幫助你理解哪些特征對(duì)預(yù)測(cè)貢獻(xiàn)最大這對(duì)業(yè)務(wù)解釋很有價(jià)值。4.3 網(wǎng)格搜索調(diào)參實(shí)戰(zhàn)雖然隨機(jī)森林對(duì)參數(shù)不敏感但花點(diǎn)時(shí)間調(diào)參還是能帶來幾個(gè)點(diǎn)的提升。下面是一個(gè)實(shí)用的網(wǎng)格搜索模板param_grid { n_estimators: [100, 200, 300], max_depth: [10, 15, 20, None], min_samples_split: [2, 5, 10], min_samples_leaf: [1, 2, 4], max_features: [sqrt, log2] } rf_base RandomForestClassifier(random_state42, n_jobs-1, oob_scoreTrue) grid_search GridSearchCV( estimatorrf_base, param_gridparam_grid, cv5, scoringroc_auc, n_jobs-1, verbose1 ) grid_search.fit(X_train, y_train) print(fBest Params: {grid_search.best_params_}) print(fBest CV AUC: {grid_search.best_score_:.4f})這個(gè)網(wǎng)格有 3×4×3×3×2 216 種組合5 折交叉驗(yàn)證就是 1080 次訓(xùn)練。如果數(shù)據(jù)集大跑起來會(huì)很慢。我的建議是分階段調(diào)參先粗調(diào)n_estimators和max_depth固定其他參數(shù)再細(xì)調(diào)min_samples_split和min_samples_leaf最后微調(diào)max_features。這樣能把搜索空間從幾百種降到幾十種。實(shí)操心得n_jobs-1會(huì)占滿所有 CPU 核心如果你在共享服務(wù)器上跑記得留一兩個(gè)核心給系統(tǒng)否則可能被管理員找上門。我一般設(shè)n_jobs-2留一個(gè)核心保平安。5. 常見問題與排查技巧實(shí)錄5.1 模型效果不如預(yù)期怎么辦這是最常見的問題。隨機(jī)森林跑出來 AUC 只有 0.6 出頭甚至不如邏輯回歸。排查思路按優(yōu)先級(jí)排列第一檢查數(shù)據(jù)質(zhì)量。特征和標(biāo)簽是否對(duì)齊有沒有數(shù)據(jù)泄漏標(biāo)簽分布是否極度不平衡我遇到過一次特征里混入了一個(gè)“未來信息”字段導(dǎo)致訓(xùn)練集 AUC 0.99、測(cè)試集 0.55典型的泄漏。第二檢查特征工程。隨機(jī)森林雖然能自動(dòng)做特征交互但不代表你不需要特征工程。原始特征如果區(qū)分度不夠樹再深也學(xué)不出東西。試試增加一些統(tǒng)計(jì)特征、交叉特征、分箱特征。第三檢查參數(shù)設(shè)置。max_depth是不是設(shè)得太小min_samples_leaf是不是太大max_features是不是太小導(dǎo)致每棵樹都太弱用 OOB 曲線輔助判斷。第四檢查類別不平衡。如果正負(fù)樣本比例超過 10:1隨機(jī)森林會(huì)偏向多數(shù)類。解決方案設(shè)置class_weightbalanced或者用 SMOTE 過采樣或者調(diào)整決策閾值。5.2 訓(xùn)練速度太慢怎么優(yōu)化隨機(jī)森林的訓(xùn)練時(shí)間主要花在構(gòu)建決策樹上。優(yōu)化手段有幾個(gè)減少樹的數(shù)量從 500 降到 200速度提升 2.5 倍效果可能只降 0.002。限制樹深度max_depth15比None快很多尤其是數(shù)據(jù)量大時(shí)。增大min_samples_leaf葉子節(jié)點(diǎn)樣本多了分裂次數(shù)減少訓(xùn)練加速。減少max_features每次分裂考慮的特征少了分裂點(diǎn)搜索更快。使用n_jobs并行這是最直接的加速手段但受限于 CPU 核心數(shù)。降低數(shù)據(jù)量如果數(shù)據(jù)有百萬行可以考慮先采樣一部分訓(xùn)練或者用subsample參數(shù)不過sklearn的隨機(jī)森林沒有這個(gè)參數(shù)XGBoost 才有。5.3 特征重要性怎么解讀才靠譜feature_importances_給出的是基于不純度減少Gini Importance的重要性這個(gè)指標(biāo)有兩個(gè)坑坑一偏向高基數(shù)特征。如果一個(gè)特征取值很多比如用戶 ID即使它和標(biāo)簽無關(guān)也可能因?yàn)榉至汛螖?shù)多而獲得高重要性。解決方案用排列重要性Permutation Importance替代sklearn提供了permutation_importance函數(shù)??佣嚓P(guān)性特征的重要性被稀釋。如果兩個(gè)特征高度相關(guān)它們的重要性會(huì)被平分看起來都不重要。解決方案先做相關(guān)性分析合并或刪除冗余特征。from sklearn.inspection import permutation_importance perm_imp permutation_importance( rf, X_test, y_test, n_repeats10, random_state42, n_jobs-1 ) for i in perm_imp.importances_mean.argsort()[::-1][:10]: print(fFeature {i}: {perm_imp.importances_mean[i]:.4f} /- {perm_imp.importances_std[i]:.4f})排列重要性的邏輯是打亂某個(gè)特征的值看模型效果下降多少。下降越多說明該特征越重要。這個(gè)方法不受特征基數(shù)影響更可靠。5.4 隨機(jī)森林的常見誤區(qū)速查表誤區(qū)真相建議樹越多越好收益遞減100-300 通常夠用看 OOB 曲線找拐點(diǎn)不需要調(diào)參默認(rèn)參數(shù)能用但調(diào)參有提升至少調(diào) max_depth 和 min_samples_leaf能處理缺失值sklearn 版本不能提前插補(bǔ)或換用支持缺失值的實(shí)現(xiàn)特征重要性絕對(duì)可靠Gini 重要性有偏差用排列重要性交叉驗(yàn)證不需要特征工程樹模型也需要好特征做特征交叉、分箱、統(tǒng)計(jì)特征訓(xùn)練集效果越好越好過擬合風(fēng)險(xiǎn)關(guān)注 OOB 和驗(yàn)證集表現(xiàn)6. 隨機(jī)森林的適用邊界與擴(kuò)展思路隨機(jī)森林不是萬能的。它在中等規(guī)模數(shù)據(jù)、特征維度適中、需要快速 baseline的場(chǎng)景下表現(xiàn)極好但在以下場(chǎng)景要謹(jǐn)慎超高維稀疏數(shù)據(jù)如文本 TF-IDF 矩陣隨機(jī)森林不如線性模型或樸素貝葉斯。需要外推預(yù)測(cè)的回歸任務(wù)樹模型無法預(yù)測(cè)訓(xùn)練集范圍之外的值這是本質(zhì)缺陷。對(duì)推理速度要求極高的場(chǎng)景幾百棵樹同時(shí)推理延遲比單模型高。需要模型可解釋性的場(chǎng)景雖然能輸出特征重要性但整體決策邏輯不如單棵決策樹直觀。如果你發(fā)現(xiàn)隨機(jī)森林效果不夠可以往兩個(gè)方向擴(kuò)展一是換用XGBoost/LightGBM它們?cè)诮Y(jié)構(gòu)化數(shù)據(jù)上通常比隨機(jī)森林強(qiáng)二是做模型融合把隨機(jī)森林和邏輯回歸、神經(jīng)網(wǎng)絡(luò)的結(jié)果加權(quán)平均往往能再提升一兩個(gè)點(diǎn)。我個(gè)人在實(shí)際操作中的體會(huì)是隨機(jī)森林最大的價(jià)值不在于它是最強(qiáng)的模型而在于它是最穩(wěn)的模型。你不需要花太多時(shí)間調(diào)參不需要做復(fù)雜的特征工程扔進(jìn)去就能得到一個(gè)還不錯(cuò)的結(jié)果。對(duì)于快速驗(yàn)證想法、搭建 baseline、或者作為集成模型的一個(gè)組件它幾乎不會(huì)讓你失望。踩過幾次坑之后我養(yǎng)成了一個(gè)習(xí)慣任何新數(shù)據(jù)集拿到手先跑一個(gè)隨機(jī)森林看看 AUC這個(gè)數(shù)字就是后續(xù)所有模型要超越的基準(zhǔn)線。