一、概述
??GBDT(Gradient Boosting Decision Tree,梯度提升決策樹)是集成學習中提升(Boosting)方法的典型代表。它以決策樹(通常是 CART 樹,即分類回歸樹)作為弱學習器,通過迭代的方式,不斷擬合殘差(回歸任務)或負梯度(分類任務),逐步構建一系列決策樹,最終將這些樹的預測結果進行累加,得到最終的預測值。
二、算法原理
1. 梯度下降思想?
??梯度下降是一種常用的優化算法,用于尋找函數的最小值。在 GBDT 中,它扮演著至關重要的角色。假設我們有一個損失函數 L ( y , y ^ ) L\left( y,\hat{y} \right) L(y,y^?),其中 y y y是真實值, y ^ \hat y y^?是預測值。梯度下降的目標就是通過不斷調整模型參數,使得損失函數的值最小化。具體來說,每次迭代時,沿著損失函數關于參數的負梯度方向更新參數,以逐步接近最優解。在 GBDT 中,雖然沒有顯式地更新參數(通過構建多顆決策樹來擬合目標),但擬合的目標是損失函數的負梯度,本質上也是利用了梯度下降的思想。
2. 決策樹的構建?
??GBDT 使用決策樹作為弱學習器。決策樹是一種基于樹結構的預測模型,它通過對數據特征的不斷分裂,將數據劃分成不同的子集,每個子集對應樹的一個節點。在每個節點上,通過某種準則(如回歸任務中的平方誤差最小化,分類任務中的基尼指數最小化)選擇最優的特征和分裂點,使得劃分后的子集在目標變量上更加 “純凈” 或具有更好的區分度。通過遞歸地進行特征分裂,直到滿足停止條件(如達到最大樹深度、節點樣本數小于閾值等),從而構建出一棵完整的決策樹。
3. 迭代擬合的過程?
(1) 初始化模型
??首先,初始化一個簡單的模型,通常是一個常數模型,記為 f 0 ( X ) f_0(X) f0?(X) ,其預測值為所有樣本真實值的均值(回歸任務)或多數類(分類任務),記為 y ^ 0 \hat y_0 y^?0?。此時,模型的預測結果與真實值之間存在誤差。
(2) 計算殘差或負梯度
??在回歸任務中,計算每個樣本的殘差,即真實值 y i y_i yi?與當前模型預測值 y ^ i , t ? 1 \hat y_{i,t-1} y^?i,t?1?的差值 r i , t = y i ? y ^ i , t ? 1 r_{i,t}=y_i-\hat y_{i,t-1} ri,t?=yi??y^?i,t?1?,其中表示迭代的輪數。在分類任務中,計算損失函數關于當前模型預測值的負梯度 g i , t = ? ? L ( y i , y ^ i , t ? 1 ) ? y ^ i , t ? 1 g_{i,t}=-\frac{\vartheta L(y_i,\hat y_{i,t-1})}{\vartheta \hat y_{i,t-1}} gi,t?=??y^?i,t?1??L(yi?,y^?i,t?1?)?
(3) 擬合決策樹
??使用計算得到的殘差(回歸任務)或負梯度(分類任務)作為新的目標值,訓練一棵新的決策樹 f t ( X ) f_t(X) ft?(X)。這棵樹旨在擬合當前模型的誤差,從而彌補當前模型的不足。
(4) 更新模型
??根據新訓練的決策樹,更新當前模型。更新公式為 y ^ i , t = y ^ i , t ? 1 + α f t ( x i ) \hat y_{i,t}=\hat y_{i,t-1}+\alpha f_t(x_i) y^?i,t?=y^?i,t?1?+αft?(xi?),其中是學習率(也稱為步長),用于控制每棵樹對模型更新的貢獻程度。學習率較小可以使模型訓練更加穩定,但需要更多的迭代次數;學習率較大則可能導致模型收斂過快,甚至無法收斂。
(5) 重復迭代
??重復步驟 (2)–(4)步,不斷訓練新的決策樹并更新模型,直到達到預設的迭代次數、損失函數收斂到一定程度或滿足其他停止條件為止。最終,GBDT 模型由多棵決策樹組成,其預測結果是所有決策樹預測結果的累加。
算法過程圖示
??GBDT 算法將梯度下降思想與決策樹相結合,通過迭代擬合殘差或負梯度,逐步構建一個強大的集成模型。它在處理復雜數據和非線性關系時表現較為出色,在數據挖掘、機器學習等領域得到了廣泛的應用。然而,GBDT 也存在一些缺點,如訓練時間較長、對異常值較為敏感等,在實際應用中需要根據具體情況進行優化和調整 。
三、Python實現
(環境:Python 3.11,scikit-learn 1.5.1)
分類情形
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn import metrics# 生成樣本數據
X, y = make_classification(n_samples=1000, n_features=50, n_informative=10, n_redundant=5, random_state=1)# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)# 創建GDBT分類模型
gbc = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=1)# 訓練模型
gbc.fit(X_train, y_train)# 進行預測
y_pred = gbc.predict(X_test)# 計算準確率
accuracy = metrics.accuracy_score(y_test,y_pred)
print('準確率為:',accuracy)
回歸情形
from sklearn.datasets import make_regression
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error# 生成樣本數據
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, noise=0.1, random_state=42)# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 創建GDBT回歸模型
model = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, random_state=42)# 訓練模型
model.fit(X_train, y_train)# 在測試集上進行預測
y_pred = model.predict(X_test)# 計算均方誤差
mse = mean_squared_error(y_test, y_pred)
print(f"MSE: {mse}")
End.
下載