GBDT(Gradient Boosting Decision Tree)算法是集成算法中的一種,它的最基本分類器為CART二分類回歸樹,集成方式為梯度提升。

CART二分類回歸樹
CART回歸樹是GBDT算法的最基本分類器,CART回歸樹決定了每次分類時,葉子結(jié)點只能分出兩個樹枝,它與ID3,C4.5是不同的。
CART回歸樹經(jīng)常涉及到一些問題。
選擇哪個特征作為最優(yōu)分裂特征?
怎么去切分一個特征?
確定分裂結(jié)束的條件?
模型的剪枝(后剪枝,預(yù)剪枝)?
Boosting
Boosting是一種模型的組合方式,我們熟悉的Adaboost就是一種Boosting的組合方式。
這里我們簡述下Adaboost的核心思想。
首先我們拿到一個數(shù)據(jù)集,第一次切分是隨意的,我們將數(shù)據(jù)集分為紅色和藍色兩類,可以看到我們的紅色數(shù)據(jù)集中含有藍色的數(shù)據(jù),然后調(diào)整權(quán)重,對于分錯的數(shù)據(jù),增加其權(quán)重,對于分對的數(shù)據(jù),減小權(quán)重,再次進行切分,直到將兩類數(shù)據(jù)徹底分開。

Adaboost的過程如下,它是在進行完一次切分之后(一次切分是指將兩種類別完全分開),再進行第二次,第二次切分仍是原始數(shù)據(jù)集開始,之后進行第三次直到第n次。

Adaboost算法最終的結(jié)果:由每次算法結(jié)果疊加而來,α1,α2,α3是每一種結(jié)果的權(quán)重,哪種結(jié)果比較好,相應(yīng)的α值就比較大。

Adaboost與隨機森林都屬于集成算法,隨機森林是通過每次并行使用大量的樹(通過樹的多樣性)來提升效果,同時隨機森林也有其極限值,當(dāng)樹的規(guī)模達到一定程度時,效果無法再得到提升。Adaboost通過串行的方式,對每一次的分類結(jié)果賦一個權(quán)重值,最后通過累加的方式求得最終結(jié)果。
Gradient Boosting
GBDT算法是通過梯度提升的方式不斷的優(yōu)化參數(shù),直到達到局部最優(yōu)解。GBDT算法每一步優(yōu)化的對象是不同的。第一步是以label值為目標(biāo),來優(yōu)化參數(shù)。第二步優(yōu)化的目標(biāo)就是第一步的殘差,第三步優(yōu)化的目標(biāo)是第二步的殘差,以此類推。最終的預(yù)測結(jié)果:F(x) = f1(x) + f2(x) +···+fn(x)。
GBDT算法的數(shù)學(xué)表達形式:
第m次的結(jié)果等于第m-1次的結(jié)果加上第m-1次所預(yù)測的殘差。GBDT通過不斷模型的迭代,來減小殘差,達到無限逼近目標(biāo)值的效果。

GBDT算法要優(yōu)化的目標(biāo)函數(shù)如下:
對損失函數(shù)Hm求一階偏導(dǎo),按照逆梯度的方式求解最優(yōu)參數(shù)。

GBDT API文檔介紹
GBDT官方文檔:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html
GradientBoostingClassifier(loss=’deviance’, learning_rate=0.1, n_estimators=100,
subsample=1.0, criterion=’friedman_mse’, min_samples_split=2, min_samples_leaf=1,
min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_decrease=0.0,
min_impurity_split=None, init=None, random_state=None, max_features=None, verbose=0,
max_leaf_nodes=None, warm_start=False, presort=’auto’, validation_fraction=0.1,
n_iter_no_change=None, tol=0.0001)
GBDT算法參數(shù)說明:
learning_rate:學(xué)習(xí)率控制著模型參數(shù)改變的大小,默認(rèn)=0.1
n_estimators:回歸樹的數(shù)量,默認(rèn) = 100
subsample:采樣的比例,默認(rèn) = 1
min_samples_split:分類節(jié)點的最小樣本數(shù),小于這個值,葉子節(jié)點是不可再分的,默認(rèn) = 2
min_samples_leaf:葉子節(jié)點的最小樣本數(shù),默認(rèn) = 1
min_weight_fraction_leaf:樣本的權(quán)重
max_depth:回歸樹的最大深度,默認(rèn) = 3
max_features:最好特征的個數(shù),隨機選擇。
max_leaf_nodes:葉子節(jié)點的數(shù)量。
min_impurity_decrease:一個節(jié)點能否再分,取決于熵值的降低值是否大于指定值。
GBDT算法樣例演示
Mnist數(shù)據(jù)集:鏈接:https://pan.baidu.com/s/1Tz573QiMLuaD-fEXcr4qYA
提取碼:xozg
import gzip
import pickle as pkl
from sklearn.model_selection import train_test_split
def load_data(path):
f = gzip.open(path,'rb')
train_set,valid_set,test_set = pkl.load(f,encoding = 'latin1')
f.close()
return(train_set,valid_set,test_set)
path = 'D:\\Py_dataset\\mnist.pkl.gz'
train_set,valid_set,test_set = load_data(path)
Xtrain,_,ytrain,_ = train_test_split(train_set[0],train_set[1],test_size = 0.9)
Xtest,_,ytest,_ = train_test_split(test_set[0],test_set[1],test_size = 0.9)
from sklearn.ensemble import GradientBoostingClassifier
import numpy as np
import time
clf = GradientBoostingClassifier(n_estimators = 10,learning_rate = 0.1,max_depth = 3)
start_time = time.time()
clf.fit(Xtrain,ytrain)
end_time = time.time()
print('The training time {}'.format(end_time - start_time))
pred = clf.predict(Xtest)
accuracy = np.sum(pred == ytest)/pred.shape[0]
print('Test accuracy {}'.format(accuracy))
The training time 19.14890456199646 #模型的訓(xùn)練時間
Test accuracy 0.829 #精度值
#集成算法都可以獲得特征的重要程度
import matplotlib.pyplot as plt
plt.hist(clf.feature_importances_)
plt.show()
特征重要性分布圖,橫軸代表重要性,縱軸代表特征數(shù)量。

GBDT算法小結(jié)
相比較單一算法,集成算法的效果更好。GBDT是一種boosting形式的集成算法,通斷不斷的優(yōu)化殘差值,最后達到一個非常好的效果。隨機森林是一種bagging的算法,通過并行訓(xùn)練大量的模型,通過模型的多樣性去達到一個非常不錯的效果。