XGBoost中正則化的九個超參數(shù)
正則化是一種強(qiáng)大的技術(shù),通過防止過擬合來提高模型性能。本文將探索各種XGBoost中的正則化方法及其優(yōu)勢。
為什么正則化在XGBoost中很重要?
XGBoost是一種以其在各種機(jī)器學(xué)習(xí)任務(wù)中的效率和性能而聞名的強(qiáng)大算法。像任何其他復(fù)雜模型一樣,它可能會過擬合,特別是在處理噪聲數(shù)據(jù)或過多特征時。XGBoost中的正則化有助于通過以下方式緩解這一問題:
- 降低模型復(fù)雜度: 通過懲罰較大的系數(shù),正則化簡化了模型。
- 改善泛化能力: 確保模型在新數(shù)據(jù)上表現(xiàn)良好。
- 防止過擬合: 防止模型過度適應(yīng)訓(xùn)練數(shù)據(jù)。
下面我們介紹在XGBoost中實(shí)現(xiàn)正則化的方法
1. 減少估計(jì)器的數(shù)量
減少估計(jì)器的數(shù)量可以防止模型變得過于復(fù)雜。兩個關(guān)鍵超超參數(shù)包括:
n_estimators: 設(shè)置較低的樹的數(shù)量可以幫助防止模型學(xué)習(xí)訓(xùn)練數(shù)據(jù)中的噪聲。n_estimators的高值會導(dǎo)致過擬合,而低值可能導(dǎo)致欠擬合。
early_stopping_rounds: 這種技術(shù)在驗(yàn)證集上的性能停止改善時停止訓(xùn)練過程,防止過擬合。
上圖為沒有早停的模型指標(biāo)
上面的模型中,即使損失不再下降,訓(xùn)練也會繼續(xù)。相比之下,使用early_stopping_rounds=10,當(dāng)連續(xù)10輪損失沒有改善時,訓(xùn)練就會停止。
# 初始化帶有早停的XGBoost回歸器
model = xgb.XGBRegressor(n_estimators=1000, learning_rate=0.1, max_depth=5)
# 使用早停訓(xùn)練模型
model.fit(X_train, y_train,
eval_set=[(X_test, y_test)],
early_stopping_rounds=10,
verbose=True)
使用early_stopping_rounds=10的模型指標(biāo)
2. 使用更簡單的樹
簡化每棵樹的結(jié)構(gòu)也可以幫助正則化模型。關(guān)鍵參數(shù)包括:
gamma: 在葉節(jié)點(diǎn)上進(jìn)行進(jìn)一步分區(qū)所需的最小損失減少。較高的值會導(dǎo)致更保守的模型。
下面是XGBoost的目標(biāo)函數(shù)。如果增加gamma,葉節(jié)點(diǎn)的數(shù)量(T)就會減少。gamma懲罰T并幫助防止樹變得過于復(fù)雜。
Gamma是一個后剪枝參數(shù)。以下復(fù)雜公式表示在每次分裂時計(jì)算的增益。第一、第二和第三項(xiàng)分別是左子節(jié)點(diǎn)、右子節(jié)點(diǎn)和父節(jié)點(diǎn)的相似度分?jǐn)?shù)。Gamma(最后一項(xiàng))是增益的閾值。
在下面的例子中,每個節(jié)點(diǎn)內(nèi)的值代表不包含gamma項(xiàng)的增益。當(dāng)gamma設(shè)置為400時,最底部的分支被刪除,因?yàn)樗粷M足閾值標(biāo)準(zhǔn),這樣樹就變得更簡單了。
那么問題來了:gamma的最佳值是多少?答案在于超參數(shù)調(diào)優(yōu)。
# 獲取樹的詳細(xì)轉(zhuǎn)儲,包括統(tǒng)計(jì)信息
tree_dump = model.get_booster().get_dump(dump_format='text', with_stats=True)
# 打印樹的轉(zhuǎn)儲以查看詳細(xì)信息,包括每個節(jié)點(diǎn)的增益
for tree in tree_dump:
print(tree)
上面的代碼將顯示所有決策樹的轉(zhuǎn)儲。通過觀察所有節(jié)點(diǎn)的增益,我們可以嘗試不同的gamma值。
import xgboost as xgb
# Gamma的實(shí)現(xiàn)
model = xgb.XGBRegressor(n_estimators=3, random_state=42, gamma = 25000)
但是有一點(diǎn),gamma值過高會導(dǎo)致欠擬合,因?yàn)樗鼫p少了樹的深度,而gamma值過低會導(dǎo)致過擬合。
max_depth: 限制樹的最大深度。較低的值可以防止模型學(xué)習(xí)過于具體的模式。這是一個預(yù)剪枝參數(shù)。
思考題1:當(dāng)我們有g(shù)amma時,為什么還需要max_depth?(答案在最后)
min_child_weight: 要解釋這個參數(shù)就要先了解什么是cover。
當(dāng)我們進(jìn)行樹轉(zhuǎn)儲時,我們會看到所有節(jié)點(diǎn)的cover值。Cover是hessians的總和,而hessian是損失函數(shù)相對于預(yù)測值的二階導(dǎo)數(shù)。
我們以一個簡單的損失為例,對于均方損失函數(shù)的回歸問題,hessian的值為1。所以在這種情況下,cover基本上是每個節(jié)點(diǎn)中的數(shù)據(jù)點(diǎn)數(shù)量。因此min_child_weight是每個節(jié)點(diǎn)中應(yīng)該存在的最小數(shù)據(jù)點(diǎn)數(shù)量。它對每個節(jié)點(diǎn)設(shè)置以下條件:cover > min_child_weight。
xgboost中回歸問題的min_child_weight類似于決策樹中的min_sample_split。
import xgboost as xgb
# min_child_weight的例子
model = xgb.XGBRegressor(n_estimators=100, learning_rate=0.1, max_depth=5, min_child_weight=10, gamma=1, random_state=42)
對于分類問題,理解這一點(diǎn)有點(diǎn)棘手,但是簡單來說分類中min_child_weight的一句話描述是:它為數(shù)據(jù)點(diǎn)的重要性設(shè)置了一個閾值。
所以我們只要記住min_child_weight是一個預(yù)剪枝參數(shù)。增加min_child_weight會減少過擬合。
3. 采樣
采樣涉及在數(shù)據(jù)的子集上訓(xùn)練模型,這可以通過引入隨機(jī)性來減少過擬合。
subsample: 用于訓(xùn)練每棵樹的訓(xùn)練數(shù)據(jù)的百分比。較低的值可以防止過擬合。子采樣使每個決策樹成為數(shù)據(jù)子集的專家,遵循"群眾的智慧"原則。根據(jù)數(shù)據(jù)的不同,0.5到0.8的范圍通常會給出良好的結(jié)果。
colsample: 用于訓(xùn)練每棵樹的特征的百分比。這也可以用來引入隨機(jī)性并防止過擬合。colsample有以下三種類型,它們的值范圍從0到1。這些按引入隨機(jī)性的增加順序排列如下。假設(shè)我們的數(shù)據(jù)中有10個特征,所有這些超參數(shù)的值都設(shè)置為0.5:
- colsample_bytree : 為每棵樹隨機(jī)選擇5個特征,并根據(jù)這些特征進(jìn)行分裂。
- colsample_bylevel : 為每個級隨機(jī)選擇5個特征,并根據(jù)這些特征進(jìn)行分裂。
- colsample_bynode : 為每個節(jié)點(diǎn)隨機(jī)選擇5個特征,并根據(jù)這些特征進(jìn)行分裂。
import xgboost as xgb
# subsample和colsample的例子
model = xgb.XGBRegressor(n_estimators=100, subsample=0.8,
max_depth=5, colsample_bytree=0.5,
colsample_bylevel=0.5, colsample_bynode=0.5)
4. 收縮
收縮減少了每棵單獨(dú)樹的影響,使模型更加穩(wěn)健:
learning_rate (收縮): 減少每棵樹的影響。較低的值意味著模型構(gòu)建更多的樹,但不太可能過擬合。0.3是許多模型的合適學(xué)習(xí)率。
lambda和alpha: L2(嶺)和L1(Lasso)正則化項(xiàng),懲罰大系數(shù)。
當(dāng)增益小于gamma時,該節(jié)點(diǎn)就會被剪枝。當(dāng)lambda增加時,過擬合減少,欠擬合增加。Lambda與gamma一起用于正則化。
思考題2:當(dāng)我們有g(shù)amma時,為什么還需要lambda?
import xgboost as xgb
# reg_lambda是lambda的超參數(shù),reg_alpha是alpha的超參數(shù)
model = xgb.XGBRegressor(n_estimators=3, learning_rate=0.3, reg_lambda=100, reg_alpha=100, gamma=10000)
思考題答案
1、XGBoost中即使有了gamma參數(shù),我們?nèi)匀恍枰猰ax_depth參數(shù)。
在XGBoost中,gamma和max_depth雖然都用于控制樹的生長,但它們的工作方式和目的略有不同:
- gamma(最小分裂損失):
- gamma是一個后剪枝參數(shù)。
- 它控制節(jié)點(diǎn)分裂時所需的最小損失減少量。
- 如果分裂導(dǎo)致的損失減少小于gamma,那么這個分裂就不會發(fā)生。
- gamma更關(guān)注的是分裂的質(zhì)量。
- max_depth(最大樹深):
- max_depth是一個預(yù)剪枝參數(shù)。
- 它直接限制了樹可以生長的最大深度。
- 無論分裂的質(zhì)量如何,一旦達(dá)到max_depth,樹就會停止生長。
- max_depth更關(guān)注的是樹的整體結(jié)構(gòu)。
為什么兩者都需要:
1.不同的控制粒度:
- gamma提供了一種基于性能的細(xì)粒度控制。
- max_depth提供了一種簡單直接的粗粒度控制。
2.計(jì)算效率:
- 只使用gamma可能導(dǎo)致在某些情況下樹過度生長,增加計(jì)算復(fù)雜度。
- max_depth可以有效地限制計(jì)算資源的使用。
3.模型可解釋性:
- 過深的樹可能難以解釋,即使每次分裂都是有意義的。
- max_depth可以保持樹的結(jié)構(gòu)相對簡單。
4.處理不同類型的數(shù)據(jù):
- 對于某些數(shù)據(jù)集,基于gamma的剪枝可能不夠,樹仍然可能過度生長。
- max_depth提供了一個絕對的上限。
5.互補(bǔ)作用:
- 兩個參數(shù)一起使用可以更靈活地控制模型的復(fù)雜度。
- 它們共同作用,可以在模型性能和復(fù)雜度之間取得更好的平衡。
總之,gamma和max_depth在控制樹的生長方面起著互補(bǔ)的作用。gamma關(guān)注分裂的質(zhì)量,而max_depth確保樹不會變得過于復(fù)雜。同時使用這兩個參數(shù),可以更好地平衡模型的性能、復(fù)雜度和可解釋性。
2、為什么在XGBoost中即使有了gamma參數(shù),我們?nèi)匀恍枰猯ambda參數(shù)。
在XGBoost中,gamma和lambda雖然都用于正則化,但它們的工作方式和目的是不同的:
- gamma(最小分裂損失):
- gamma主要用于控制樹的生長。
- 它設(shè)置了節(jié)點(diǎn)分裂所需的最小損失減少量。
- 如果分裂導(dǎo)致的損失減少小于gamma,那么這個分裂就不會發(fā)生。
- gamma更關(guān)注的是樹的結(jié)構(gòu)和復(fù)雜度。
- lambda(L2正則化項(xiàng)):
- lambda是應(yīng)用于葉子權(quán)重的L2正則化項(xiàng)。
- 它直接懲罰模型的權(quán)重。
- lambda幫助防止模型對個別特征過度依賴。
- 它可以使模型更加穩(wěn)定和泛化能力更強(qiáng)。
為什么兩者都需要:
- 不同的正則化目標(biāo):
- gamma主要影響樹的結(jié)構(gòu)。
- lambda主要影響葉子節(jié)點(diǎn)的權(quán)重。
- 模型復(fù)雜度的不同方面:
- gamma通過限制樹的生長來減少復(fù)雜度。
- lambda通過縮小權(quán)重來減少復(fù)雜度。
- 處理不同類型的過擬合:
- gamma可以防止模型學(xué)習(xí)訓(xùn)練數(shù)據(jù)中的噪聲。
- lambda可以防止模型對某些特征過度敏感。
- 互補(bǔ)作用:
- 同時使用這兩個參數(shù)可以更全面地控制模型的復(fù)雜度。
- 它們一起工作可以在模型的結(jié)構(gòu)和權(quán)重上都實(shí)現(xiàn)正則化。
- 靈活性:
- 在某些情況下,你可能想要一個深度較大但權(quán)重較小的樹,或者相反。
- 有了這兩個參數(shù),你可以更靈活地調(diào)整模型以適應(yīng)不同的數(shù)據(jù)集和問題。
- 收縮效果:
- 如之前提到的,lambda還有一個額外的作用,就是對樹的輸出進(jìn)行收縮。
- 這種收縮效果可以進(jìn)一步幫助防止過擬合,特別是在梯度提升的早期階段。
gamma和lambda在XGBoost中起著互補(bǔ)的作用。gamma主要控制樹的結(jié)構(gòu),而lambda主要控制葉子節(jié)點(diǎn)的權(quán)重和樹的輸出。同時使用這兩個參數(shù),可以更全面、更靈活地控制模型的復(fù)雜度,從而在不同層面上防止過擬合,提高模型的泛化能力。這種多層面的正則化策略是XGBoost強(qiáng)大性能的關(guān)鍵因素之一。