【小白學AI】GBDT梯度提升詳解

忽逢桃林發表於2020-08-30

文章來自微信公眾號:【機器學習煉丹術】

文章目錄:

0 前言

先縷一縷幾個關係:

  • GBDT是gradient-boost decision tree
  • GBDT的核心就是gradient boost,我們搞清楚什麼是gradient boost就可以了
  • GBDT是boost中的一種方法,boost還有XGBoost,adaboost。
  • GBDT的基模型一般是CART

1 基本概念

【Boost】 就是讓多個弱分類器,通過不同的整合方式,來讓多個弱分類器變成一個強分類器。

【gradient-boost】 梯度提升。簡單的說,先訓練一個弱分類器,然後弱分類器和目標值之間的殘差,作為下一個弱分類器訓練的目標值。這裡有一個非常簡單的例子
在這裡插入圖片描述

  • 第一個模型預測年齡,雖然真實值是30歲,第一個模型只給出了20歲的估計值;
  • 第二棵樹要預測的就是這個10歲的殘差,但是第二棵樹只給出了6歲的估計值;
  • 第三棵樹預測的是第二棵樹的4歲的殘差,但是………………(禁止套娃)

2 梯度 or 殘差 ?

對於GBDT,網上的很多文章都沒有講清楚,學習梯度還是學習殘差?從上面的那個例子來看,是學習殘差的。

其實,從來GBDT都是學習梯度的,學習殘差只是學習梯度的一個特例!

如果我們是在做一個迴歸任務(就像是上面例子中預測年齡),採用平方損失:\(loss = \frac{1}{2}\sum^n_i{(y_i-\hat{y_i})^2}\)
其中\(y_i\)是真實數值,\(\hat{y_i}\)是模型預測的值。

然後想求取這個關於\(\hat{y_i}\)的梯度,那就是:
\(\frac{\partial loss}{\partial \hat{y^i}}=(-1)(y_i-\hat{y_i})\)

所以殘差在平方損失的情況下,就是等於負梯度,所以兩者一回事。

3 殘差過於敏感

對於資料不乾淨,沒有清晰掉異常值的資料樣本。使用平方損失對異常值過於敏感了

敏感就是因為,異常值的損失過大了,導致下一個弱分類器就會強行擬合這個5.445的樣本,擬合異常值就意味著弱化了泛化能力,從而整體精度就可能會下降。

所以,這裡在迴歸問題中,也可以考慮使用下面的兩個損失函式:

  • Absolute loss:
    \(loss=|y-\hat{y}|\)

  • Huber loss:
    這個是設定一個閾值,當\(|y-\hat{y}|\)小於這個閾值的時候,採用平方損失,當\(|y-\hat{y}|\)大於這個閾值的時候,採用類似於絕對損失的線性損失:

    這裡看一下huber loss的函式影像:

    就是一個平方損失,一個線性損失。

然後看一下平方損失,絕對損失,huber損失對於異常值的容忍程度:


【小小的總結】

GBDT是基於boosting的思想,序列地構造多棵決策樹來進行資料的預測,它是在損失函式所在的函式空間中做梯度下降,即把待求的決策樹模型當作引數,每輪迭代都去擬合損失函式在當前模型下的負梯度,從而使得引數朝著最小化損失函式的方向更新。

【現在還用嗎?】

學肯定是要學的,因為GBDT是非常經典的整合模型,知道了可以擴充知識面。但是其實在2010年橫霸大資料競賽的,現在10年過去了,在競賽中已經是老古董了。

【GBDT vs Adaboost】

Adaboost是boost整合的另一個非常經典的演算法。Adaboost只能採用指數損失的二分類任務,而GBDT可以使用各種可微分的損失函式來處理多分類、迴歸等任務。


4 兩個基模型的問題

【問題:為什麼GBDT模型都會使用CART(分類和迴歸樹)來作為基模型呢?】

這與決策樹演算法自身的優點有很大的關係。決策樹可以認為是if-then規則的集合,易於理解,可解釋性強,預測速度快 。同時,決策樹演算法相比於其他的演算法需要更少的特徵工程,比如可以不用做特徵標準化,可以很好的處理欄位缺失的資料,也可以不用關心特徵間是否相互依賴 等。決策樹能夠自動組合多個特徵,它可以毫無壓力地處理特徵間的互動關係並且是非引數化 的,因此你不必擔心異常值或者資料是否線性可分(舉個例子,決策樹能輕鬆處理好類別A在某個特徵維度x的末端,類別B在中間,然後類別A又出現在特徵維度x前端的情況)不過,單獨使用決策樹演算法時,有容易過擬合缺點。所幸的是,通過各種方法(比如剪枝、最大樹深度、最小葉子樣本數量、正則項等),抑制決策樹的複雜性,降低單顆決策樹的擬合能力,再通過梯度提升的方法整合多個決策樹,最終能夠很好的解決過擬合的問題。由此可見,梯度提升方法和決策樹學習演算法可以互相取長補短,是一對完美的搭檔。


【還有什麼抑制單棵決策樹的複雜度的方法?換言之,決策樹的避免過擬合的方法?】

  1. 限制樹的最大深度
  2. 限制葉子節點的最少樣本數量
  3. 限制節點分裂時的最少樣本數量
  4. 吸收bagging的思想對訓練樣本取樣(subsample)在學習單顆決策樹時只使用一部分訓練樣本(樣本取樣)
  5. 借鑑隨機森林的思路在學習單顆決策樹時只取樣一部分特徵(特徵取樣,同樣是bagging的思想)
  6. 在目標函式中新增正則項懲罰複雜的樹結構等。

相關文章