天天看點

《機器學習算法-Boost》GBDT(Gradient Boosting Decision Tree)

1、提升樹的思想

        提升樹是以分類樹或者回歸樹為基本分類器的提升方法,實際采用的是加法模型(基函數的線性組合),以決策樹為基函數的提升方法稱為提升樹。提升樹的核心思想就是在不斷的拟合殘差,比如一個人的年齡是25歲,第一次猜到16,那麼9就是我們接下來要拟合的殘差,不斷的疊代更新這個樹,最終使得誤差或者疊代次數滿足我們的要求即可。

2、前向分布算法

《機器學習算法-Boost》GBDT(Gradient Boosting Decision Tree)

        初始化一個基分類器,存在一個資料集T,通過進行M輪的疊代更新不斷更新β和γ,再更新

《機器學習算法-Boost》GBDT(Gradient Boosting Decision Tree)

,最終得到加法模型。 

3、回歸問題的提升樹算法

《機器學習算法-Boost》GBDT(Gradient Boosting Decision Tree)

 (3)得到回歸提升樹fMx=m=1MT(x:θm)

《機器學習算法-Boost》GBDT(Gradient Boosting Decision Tree)
《機器學習算法-Boost》GBDT(Gradient Boosting Decision Tree)

         回歸問題提升樹算法的執行個體:https://zhuanlan.zhihu.com/p/84139957

4、XGBD算法

《機器學習算法-Boost》GBDT(Gradient Boosting Decision Tree)
  • 初始化,估計使損失函數極小化的常數值,它是隻有一個根節點的樹,即γ是一個常數值。
  • 計算損失函數的負梯度在目前模型的值,将它作為殘差的估計
  • 估計回歸樹葉節點區域,以拟合殘差的近似值
  • 利用線性搜尋估計葉節點區域的值,使損失函數極小化
  • 更新回歸樹
  • 得到輸出的最終模型 f(x)
《機器學習算法-Boost》GBDT(Gradient Boosting Decision Tree)

        當損失函數是平方損失函數的時候,我們就可以這個負梯度恰好就是我們提升樹中的殘差。

        當提升樹的損失函數是指數函數和平方損失函數的時候,每一步的優化是比較簡單的,但是當換成别的函數的時候就比較複雜了,是以提出來用負梯度做為回歸問題殘差的近似值然後取拟合一個回歸樹。利用最速下降法的近似方法,關鍵是利用損失函數的負梯度在目前模型的值作為回歸問題提升樹算法中的殘差的近似值,拟合一個回歸樹。

        為啥用負梯度可以拟合殘內插補點呢?

        這個問題本身就是錯誤的,是GBDT拟合的是負梯度,不過恰好損失函數是平方損失函數的時候這個拟合的負梯度是殘差。具體的原理是這樣的:

           對于一個函數進行一節泰勒展開

《機器學習算法-Boost》GBDT(Gradient Boosting Decision Tree)

        二進制函數的泰勒展開 

《機器學習算法-Boost》GBDT(Gradient Boosting Decision Tree)
《機器學習算法-Boost》GBDT(Gradient Boosting Decision Tree)

5、各路”豪傑”與GBDT的對比

  • AdaBoost  vs  GBDT

        AdaBoost主要是改變資料的權重來有重點的進行學習,然後進行線性組合得到一個較好的分類器。GBDT主要是根據拟合目前的負梯度減小分類誤差,改進模型。

  • LR  vs GBDT

        從決策邊界來說,線性回歸的決策邊界是一條直線,邏輯回歸的決策邊界根據是否使用核函數可以是一條直線或者曲線,而GBDT的決策邊界可能是很多條線。

6、優缺點

        優點     

       ① 可以靈活處理各種類型的資料,包括連續值和離散值。

       ②在相對少的調參時間情況下,預測的準備率也可以比較高。這個是相對SVM來說的。

       ③使用一些健壯的損失函數,對異常值的魯棒性非常強

        缺點

       ①由于弱學習器之間存在依賴關系,難以并行訓練資料。不過可以通過自采樣的SGBT來達到部分并行

7、代碼

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn import metrics
from sklearn.ensemble import GradientBoostingClassifier


iris_data = datasets.load_iris()
x = iris_data['data']
y = iris_data['target']
x_train,x_test,y_train,y_test = train_test_split(x, y, test_size=0.2,random_state=6)
ss = StandardScaler()
x_train = ss.fit_transform(x_train)
x_test = ss.transform(x_test)

clf = GradientBoostingClassifier(random_state=6)
clf.fit(x_train, y_train)
predict = clf.predict(x_test)
acc = metrics.accuracy_score(y_true=y_test,y_pred=predict)
recall = metrics.recall_score(y_true=y_test,y_pred=predict,average='micro')
precision = metrics.precision_score(y_true=y_test,y_pred=predict,average='micro')
print('acc',acc)
print('recall',recall)
print('precision',precision)



           

8、參考

        https://zhuanlan.zhihu.com/p/348776985