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