從提高樹到 XGBoost, 原理簡介

提高樹是以分類樹或迴歸樹爲基本分類器的提高方法, 模型表示爲決策樹的加法模型:html

\[ F_M(x) = \sum_{m=0}^M f(x;\Theta_m), \]算法

其中 \(M\) 爲樹的個數, \(f(x;\Theta_m)\) 表示決策樹, \(\Theta_m\) 爲其參數.緩存

1. 提高樹算法

提高樹算法採用向前分步 (forward stagewise) 算法 (本質上是一種貪心算法). 對於訓練數據集 \(D = \{(x_i, y_i)\}_{i=1}^N\), 首先肯定初始提高樹 \(F_0(x)=0\), 而後第 \(m\) 步的模型是框架

\[ F_m(x) = F_{m-1}(x) + f(x;\Theta_m), \]函數

其中 \(F_{m-1}\) 爲當前模型, 經過經驗風險最小化肯定下一顆決策樹的參數,性能

\[ \hat\Theta_m = \operatorname*{argmin}_{\Theta_m}\sum_{i=1}^N l(y_i, F_{m-1}(x_i) + f(x_i;\Theta_m)), \]學習

其中 \(l\) 爲損失函數.優化

迴歸問題的提高樹能夠表示爲簡單函數編碼

\[ f(x;\Theta) = \sum_{j=1}^T c_j 1_{R_j}(x), \]spa

其中 \(R_j\) 互不相交, \(1_{R_j}(x)\) 爲示性函數, \(c_j\) 爲常數, 參數 \(\Theta=\{(R_j,c_j)\}_{j=1}^T\), \(T\) 爲葉節點個數.

綜上,

迴歸問題的提高樹算法

  1. 初始化 \(F_0(x) = 0\).
  2. \(m = 1,\dots,M\): (a) 經過經驗風險最小化學習一個迴歸樹 \(f(x;\Theta_m)\). (b) 更新 \(F_m(x) = F_{m-1}(x) + f(x;\Theta_m)\).
  3. 輸出迴歸問題提高樹 \(F_M(x) = \sum_{m=1}^M f(x;\Theta_m)\).

2. 梯度提高樹 (Gradient Boosting Decision Trees)

對於通常的損失函數, 每一步經驗風險最小化都不容易. GBDT 是爲了便於計算而提出的方法, 它的主要想法來自於梯度降低法.

記損失函數的梯度在當前模型的值爲

\[ g_{im} = \left(\frac{\partial l(y_i,F(x_i))}{\partial F(x_i)}\right)_{F = F_{m-1}}. \]

則由梯度降低法,

\[ F_m(x_i) = F_{m-1}(x_i) -\rho_m g_{im}, \]

其中步長 \(\rho_m\) 能夠經過線搜索得到, 即

\[ \rho_m = \operatorname*{argmin}_{\rho} \sum_{i=1}^Nl(y_i, F_{m-1}(x_i)-\rho g_{im}). \]

梯度降低法是一個很貪心的算法, 即在當前點取函數降低最快的方向. 但如上這樣作的話咱們只得到了在訓練數據點上的預測, 爲了獲得能夠預測新數據的決策樹, 一種可行的作法是, 用 \(f\) 逼近負梯度方向, ESL [2] p. 321 使用了平方偏差來度量 \(f\) 與負梯度的距離, 即

\[ \tilde\Theta_m = \operatorname*{argmin}_{\Theta}\sum_{i=1}^N (-g_{im} - f(x_i;\Theta))^2. \]

注意到對於 \(l(x,y) = \frac12(x-y)^2\) 的情形, \(\tilde\Theta_m\)\(\hat\Theta_m\) 相等.

其他操做同提高樹算法, 從略.

3. XGBoost

3.1. 整體框架

XGBoost 的主要想法是, 除了原有的損失函數, 在目標函數中加入正則項, 利用二階 Taylor 近似代替損失函數再極小化目標函數, 其他操做同提高樹算法. 回憶以前的梯度提高樹只用了一階導數, 想法是來自梯度降低, 而梯度降低的想法來自用一階 Taylor 展開近似, XGB 中的 'GB' 由此而來; 而 X 是指 extreme, 指的是 XGB 相比之前的 GB 算法性能 (精度和速度) 有了極大的提高.

\(F_m(x_i) = \hat y_i^{(m)}\),
\(\hat y_i^{(0)}=0\),
\(\hat y_i^{(m)} = \hat y_i^{(m-1)} + f_m(x_i)\), \(m=1,\dots,M\).

\(f_m\) 表示第 \(m\) 輪時所得的樹, 是由最小化目標函數而得; \(\hat y_i^{(m)}\) 表示第 \(m\) 輪時 \(y_i\) 的預測值.

\(m\) 輪目標函數爲

\[ \mathrm{Obj}^{(m)} = \sum_{i=1}^N l\left(y_i, \hat y_i^{(m-1)} + f_m(x_i)\right) + \Omega(f_m), \]

其中 \(l\) 爲損失函數; \(\Omega\) 爲正則項, 是人爲定義的複雜度, 能夠下降模型複雜度, 減少過擬合的風險, 在原論文 [3] 中定義爲

\[ \Omega(f) = \gamma T + \frac12 \lambda\sum_{j=1}^T w_j^2, \]

其中 \(\gamma\), \(\lambda\) 爲參數, \(T\)\(f\) 表示的樹的葉節點數, \(w_j\) 爲第 \(j\) 個葉節點的預測值 (權重).

除了加入正則項外, 還能夠經過 shrinkage 來下降過擬合風險, 即 \(F_m = F_{m-1} + \nu f_m\), 其中 \(0<\nu<1\), 能夠看爲學習率, 原來的作法至關於取 \(\nu=1\). 這麼作主要的理由是減小每顆樹對總模型的影響, 防止前幾顆樹擬合地太好 (過擬合) 以致於後面的樹沒有了學習空間.

3.2. 尋找分裂點

對目標函數作二階 Taylor 展開, 略去更高階的無窮小量. 記

\[ g_i = \frac{\partial l(y_i, \hat y_i^{(m-1)})}{\partial{\hat y^{(m-1)}}},\quad h_i = \frac{\partial^2 l(y_i, \hat y_i^{(m-1)})}{\partial{\left(\hat y^{(m-1)}\right)^2}}. \]

例如對於平方損失函數 \((y_i - \hat y_i^{(m-1)})^2\) 來講, \(g_i = 2(\hat y_i^{(m-1)} - y_i)\), \(h_i = 2\).

通過簡單的推導可得最優權重爲

\[ w_j^* = -\frac{\sum_{i\in I_j}g_i}{\sum_{i\in I_j} h_i + \lambda}, \]

其中 \(I_j\) 表示被歸到第 \(j\) 個葉節點的全體實例 (的腳標) 集合.

通常而言, 窮舉全部可能的樹結構是不可能的, 做爲代替, 咱們考慮貪心算法. 從一個葉節點開始二分, 假設 \(I_L\)\(I_R\) 分別表示分裂後歸爲左節點和右節點的實例集合, 記 \(I = I_L \cup I_R\), 則易得分裂後的目標函數減小值 (loss reduction) 爲

\[ \frac12\left[\frac{(\sum_{i\in I_L}g_i)^2}{\sum_{i\in I_L} h_i + \lambda} + \frac{(\sum_{i\in I_R}g_i)^2}{\sum_{i\in I_R} h_i + \lambda} - \frac{(\sum_{i\in I}g_i)^2}{\sum_{i\in I} h_i + \lambda}\right] - \gamma \]

把上式第一項視爲 gain, 則 \(\gamma\) 至關於設置了分裂所需的最小的 gain, 起到了剪枝的做用.

尋找分裂點的精確貪心算法 (原文 [3] 中本段有一些 typo)
輸入: \(I\), 當前節點的實例集; \(d\), 特徵維數 (個數).
初始化 \(\mathrm{gain} \leftarrow 0\)
\(G \leftarrow \sum_{i\in I}g_i\), \(H \leftarrow \sum_{i\in I}h_i\)
for \(k=1\) to \(d\) do
     \(G_L \leftarrow 0\), \(H_L \leftarrow 0\)
     for \(j\) in sorted (\(I\), by \(x_{jk}\)) do
         \(G_L\leftarrow G_L + g_j\), \(H_L\leftarrow H_L + h_j\)
         \(G_R \leftarrow G-G_L\), \(H_R \leftarrow H- H_L\)
         \(\mathrm{gain} \leftarrow \max(\mathrm{gain}, \frac{G_L^2}{H_L + \lambda} + \frac{G_R^2}{H_R + \lambda} - \frac{G^2}{H + \lambda})\)
輸出: 最大 gain 的分裂

精確貪心法是在全部特徵上, 對全部可能的分裂點都進行遍歷, 在數據量大的時候是不現實的. 一個簡單的近似方法是, 排序後 (for \(j\) in sorted (\(I\), by \(x_{jk}\)) 那步), 取適當的分位數做爲分裂候選點進行貪心算法.

3.3. 稀疏數據的分裂點尋找 (sparsity-aware)

主要分爲兩種狀況:

  1. 若數據有缺失值, 則把缺失值都歸到同一個節點 (即所謂默認方向, 把缺失值統一歸到左子節點或右子節點). 這是處理缺失值的經常使用方法之一 (另外一種經常使用方法是用適當的方法填補缺失值), 這使得 XGB 能夠直接訓練和預測帶有缺失值的數據.
  2. 若數據稀疏 (好比 one-hot 編碼, 使得數據包含大量的 0), 則把 0 當作缺失值處理. 這個作法的關鍵點在於遍歷時只對非缺失 (非零) 數據遍歷, 在稀疏數據的狀況下會大大提升訓練速率.

注: 按照原論文 [3] 的說法, 做者彷佛把缺失和稀疏時的 0 都統稱爲 "稀疏/缺失", 用一樣的方式處理, [5] 也證明了這一點.

圖來自原論文 [3], 圖中 \(m\) 應該爲 \(d\), score 應該爲 gain. 據論文做者所言, 這是一種新穎的處理稀疏數據的方法, 並且效果很好 (第二部分實驗部分也證明了這一點).

3.4. XGB 的優勢

  • XGB 把決策樹的許多啓發式的想法經過最小化目標函數統一塊兒來處理.
  • 除了使用近似算法, 在系統設計上, 經過並行處理, 優化緩存等技術, 大幅提升了運行速度, 減少了內存使用.

References

[1] 李航. (2012). 統計學習方法 (pp. 55-74, 137-153). 北京: 清華大學出版社.
[2] Friedman, J., Hastie, T., & Tibshirani, R. (2001). The elements of statistical learning (pp. 299-344). New York: Springer series in statistics.
[3] Chen, T., & Guestrin, C. (2016). Xgboost: A scalable tree boosting system. Proceedings of the 22nd acm sigkdd international conference on knowledge discovery and data mining (pp. 785-794). ACM.
[4] Introduction to Boosted Trees. (n.d.). Retrieved from https://xgboost.readthedocs.io/en/latest/tutorials/model.html#
[5] Kodi Arfer. XGBoost, missing values, and sparsity. (2018). Retrieved from http://arfer.net/w/xgboost-sparsity

相關文章
相關標籤/搜索