Python降低XGBoost 過度擬合的多種方法
之前已經(jīng)講過機(jī)器學(xué)習(xí)的 XGBoost 算法簡介
XGBoost feature importance特征重要性-實(shí)戰(zhàn)印第安人糖尿病數(shù)據(jù)集,
用Python 開發(fā)您的第一個(gè) XGBoost 模型
今天來講解xgboost過度擬合問題。
過度擬合是機(jī)器學(xué)習(xí)建模經(jīng)常遇到的問題,也是棘手問題,甚至數(shù)據(jù)科學(xué)崗位面試時(shí)候經(jīng)常會(huì)遇到這類難題。大家不要怕,接下來我會(huì)詳細(xì)講述python xgboost如何降低過度擬合方法和其它更好方法。
xgboost建模中,如果變量數(shù)量太多,模型容易過度擬合,英文術(shù)語為overfitting,如下圖右。
如果變量太少,容易欠擬合,英文術(shù)語為underfitting,如下圖左。
如果變量剛好合適,模型擬合就會(huì)比較好,如下圖中。

我們用xgboost建模時(shí)應(yīng)當(dāng)如何避免過度擬合呢?
1.我們應(yīng)首先觀察模型變量是否太多,是否包含大量無效變量(噪音變量)?如果模型噪音變量太多,就先變量篩選,踢除無效變量,或用降維手段測試效果。這一條是至關(guān)重要的前提,如果做不好變量篩選和降維,后續(xù)方法效果會(huì)大打折扣。
2.我們可以設(shè)置xgboost中eval_set,eval_metric,early_stopping_rounds參數(shù),來減輕過度擬合。如果因數(shù)據(jù)原因,完全消除過度擬合是不可能的。
3.采用其他集成樹算法進(jìn)一步減輕過度擬合,例如對稱樹算法catboost。對稱樹算法catboost有天然對抗過度擬合優(yōu)點(diǎn),之后我會(huì)安排時(shí)間講解catboost算法。

接下來我將描述如何在 Python 中使用提前停止來限制 XGBoost 的過度擬合。
通過這篇文章,你會(huì)了解:
關(guān)于提前停止作為減少訓(xùn)練數(shù)據(jù)過度擬合的一種方法。
如何在訓(xùn)練期間監(jiān)控 XGBoost 模型的性能并繪制學(xué)習(xí)曲線。
如何使用提前停止在最佳時(shí)期提前停止 XGBoost 模型的訓(xùn)練。
提前停止以避免過度擬合
提前停止是一種訓(xùn)練復(fù)雜機(jī)器學(xué)習(xí)模型以避免過度擬合的方法。
它的工作原理是監(jiān)控在單獨(dú)的測試數(shù)據(jù)集上訓(xùn)練的模型的性能,并在經(jīng)過固定次數(shù)的訓(xùn)練迭代后測試數(shù)據(jù)集的性能沒有提高時(shí)停止訓(xùn)練過程。
它通過嘗試自動(dòng)選擇測試數(shù)據(jù)集性能開始下降的拐點(diǎn)來避免過度擬合,而隨著模型開始過度擬合,訓(xùn)練數(shù)據(jù)集的性能繼續(xù)提高。
性能度量可能是正在優(yōu)化以訓(xùn)練模型的損失函數(shù)(例如對數(shù)損失),或通常對問題感興趣的外部度量(例如分類準(zhǔn)確度)。
使用 XGBoost 監(jiān)控訓(xùn)練表現(xiàn)
XGBoost 模型可以在訓(xùn)練期間評估和報(bào)告模型在測試集上的性能。
它通過在訓(xùn)練模型和指定詳細(xì)輸出時(shí)在調(diào)用model.fit()時(shí)指定測試數(shù)據(jù)集和評估指標(biāo)來支持此功能。
例如,我們可以在訓(xùn)練 XGBoost 模型時(shí)報(bào)告獨(dú)立測試集 (?eval_set?)上的二進(jìn)制分類錯(cuò)誤率 (“ error ”) ,如下所示:
XGBoost 支持一套評估指標(biāo),不僅限于:
“ rmse ”表示均方根誤差。
“ mae ”表示平均絕對誤差。
“ logloss ”用于二進(jìn)制對數(shù)損失,“ mlogloss ”用于多類對數(shù)損失(交叉熵)。
“ error ”表示分類錯(cuò)誤。
“ auc ”表示ROC曲線下的面積。
XGBoost 參數(shù)網(wǎng)頁的“學(xué)習(xí)任務(wù)參數(shù)”部分提供了完整列表。
例如,我們可以演示如何在皮馬印第安人糖尿病數(shù)據(jù)集上跟蹤 XGBoost 模型的訓(xùn)練性能。
下載數(shù)據(jù)集文件并將其放在您當(dāng)前的工作目錄中。
數(shù)據(jù)集下載鏈接:
https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv
數(shù)據(jù)集詳細(xì)信息如下:
完整示例如下:
運(yùn)行此示例在 67% 的數(shù)據(jù)上訓(xùn)練模型,并在 33% 的測試數(shù)據(jù)集上評估每個(gè)訓(xùn)練時(shí)期的模型。
每次迭代都會(huì)報(bào)告分類錯(cuò)誤,最后在最后報(bào)告分類精度。
注意:您的結(jié)果可能會(huì)因算法或評估程序的隨機(jī)性或數(shù)值精度的差異而有所不同??紤]多次運(yùn)行該示例并比較平均結(jié)果。
下面提供了輸出,為簡潔起見被截?cái)?。我們可以看到,每次?xùn)練迭代都會(huì)報(bào)告分類錯(cuò)誤(在將每個(gè)提升樹添加到模型之后)。
查看所有輸出,我們可以看到測試集上的模型性能持平,甚至在訓(xùn)練結(jié)束時(shí)變得更糟。
使用學(xué)習(xí)曲線評估 XGBoost 模型
我們可以在評估數(shù)據(jù)集上檢索模型的性能并繪制它以深入了解訓(xùn)練過程中學(xué)習(xí)的展開方式。
在擬合 XGBoost 模型時(shí),我們?yōu)?strong>eval_metric參數(shù)提供了一組 X 和 y 對。除了測試集,我們還可以提供訓(xùn)練數(shù)據(jù)集。這將提供關(guān)于模型在訓(xùn)練期間在訓(xùn)練集和測試集上的表現(xiàn)如何的報(bào)告。
例如:
此外,模型在每個(gè)評估集上的性能通過調(diào)用model.evals_result()函數(shù)在訓(xùn)練后存儲(chǔ)并由模型提供。這將返回評估數(shù)據(jù)集和分?jǐn)?shù)的字典,例如:
這將打印如下結(jié)果(為簡潔起見被截?cái)啵?/p>
“?validation_0?”和“?validation_1?”中的每一個(gè)都對應(yīng)于在調(diào)用fit() 時(shí)將數(shù)據(jù)集提供給eval_set參數(shù)的順序。
可以按如下方式訪問特定的結(jié)果數(shù)組,例如第一個(gè)數(shù)據(jù)集和錯(cuò)誤度量:
此外,我們可以通過向fit()函數(shù)的 eval_metric 參數(shù)提供一組指標(biāo)來指定更多的評估指標(biāo)來評估和收集。
然后,我們可以使用這些收集到的性能指標(biāo)來創(chuàng)建線圖,并進(jìn)一步了解模型在訓(xùn)練時(shí)期在訓(xùn)練和測試數(shù)據(jù)集上的表現(xiàn)。
下面是完整的代碼示例,顯示了如何在折線圖上可視化收集的結(jié)果。
運(yùn)行此代碼會(huì)報(bào)告每個(gè)時(shí)期訓(xùn)練和測試數(shù)據(jù)集上的分類錯(cuò)誤。我們可以通過在調(diào)用fit()函數(shù)時(shí)設(shè)置verbose=False(默認(rèn)值)來關(guān)閉它。
注意:您的結(jié)果可能會(huì)因算法或評估程序的隨機(jī)性或數(shù)值精度的差異而有所不同??紤]多次運(yùn)行該示例并比較平均結(jié)果。
創(chuàng)建了兩個(gè)圖。第一個(gè)顯示了 XGBoost 模型在訓(xùn)練和測試數(shù)據(jù)集上每個(gè)時(shí)期的對數(shù)損失。

XGBoost 學(xué)習(xí)曲線對數(shù)損失
第二個(gè)圖顯示了 XGBoost 模型在訓(xùn)練和測試數(shù)據(jù)集上每個(gè) epoch 的分類誤差。

XGBoost 學(xué)習(xí)曲線分類錯(cuò)誤
從查看 logloss 圖來看,似乎有機(jī)會(huì)提前停止學(xué)習(xí),可能在 20 到 40 紀(jì)元左右。
我們看到了類似的分類錯(cuò)誤故事,其中錯(cuò)誤似乎在第 40 輪左右回升。
使用 XGBoost 提前停止
XGBoost 支持在固定次數(shù)的迭代后提前停止。
除了指定用于評估每個(gè) epoch 的度量和測試數(shù)據(jù)集之外,您還必須指定一個(gè)窗口,其中包含沒有觀察到改進(jìn)的 epoch 數(shù)。這是在early_stopping_rounds?參數(shù)中指定的。
例如,我們可以檢查 10 個(gè)時(shí)期的對數(shù)損失沒有改善,如下所示:
如果提供了多個(gè)評估數(shù)據(jù)集或多個(gè)評估指標(biāo),則提前停止將使用列表中的最后一個(gè)。
下面提供了一個(gè)完整的例子,說明提前停止的完整性。
注意:您的結(jié)果可能會(huì)因算法或評估程序的隨機(jī)性或數(shù)值精度的差異而有所不同??紤]多次運(yùn)行該示例并比較平均結(jié)果。
運(yùn)行該示例提供以下輸出,為簡潔起見被截?cái)唷?/p>
我們可以看到模型在 epoch 42 停止訓(xùn)練(接近我們手動(dòng)判斷學(xué)習(xí)曲線的預(yù)期),并且在 epoch 32 觀察到損失最好的模型。
通常選擇early_stopping_rounds作為訓(xùn)練時(shí)期總數(shù)的合理函數(shù)(在這種情況下為 10%)或嘗試對應(yīng)于可能在學(xué)習(xí)曲線圖上觀察到的拐點(diǎn)周期是一個(gè)好主意。
總結(jié)
在這篇文章中,我們了解到了:
關(guān)于在模型過度擬合訓(xùn)練數(shù)據(jù)之前停止模型訓(xùn)練的提前停止技術(shù)。
如何在訓(xùn)練期間監(jiān)控 XGBoost 模型的性能并繪制學(xué)習(xí)曲線。
如何在訓(xùn)練 XGBoost 模型時(shí)配置提前停止。
xgboost過度擬合知識(shí)就為大家介紹到這里了,歡迎各位同學(xué)學(xué)習(xí)<python風(fēng)控建模實(shí)戰(zhàn)lendingclub>,更多集成樹算法相關(guān)知識(shí)

版權(quán)聲明:文章來自公眾號(python風(fēng)控模型),未經(jīng)許可,不得抄襲。遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。