(XGBoost)提高樹入門介紹(Inrtoduction to Boosted Trees)

提高樹入門介紹(Inrtoduction to Boosted Trees)

  • Author : Jasper Yanghtml

  • School : Buptgit

這是一篇翻譯文,翻譯的內容是 XGBoost 官網的原理介紹 Introduction to Boosted Trees 這篇文章。github

如需轉載請註明。我本身在作實驗中感受遇到了瓶頸,我認爲是我對這個模型的熟悉度太差,於是須要補一補知識,也但願能幫到你們。app

在本文以前給你們推薦一個別人寫的關於 XGBoost 參數調優的,仍是挺詳細的,分享一下 XGBOOST參數調優 。好了,下面就是翻譯內容了,可能會夾雜着我本身的理解。dom

正文

XGBoost 是 極致梯度迭代(這個翻譯不知道準不許確)的縮寫。梯度迭代這個概念是在 Greedy Function Approximation: A Gradient Boosting Machine, by Friedman 這篇文章中提出來的。XGBoost正是基於這個原始模型。函數

GBM(boosted trees) 已經出現了有段時日了,在這個話題上有不少的資料。這篇導讀但願用監督學習的元素來獨立有原則地解釋提高樹(boosted trees)。性能

Elements of Supervised Learning (監督學習的元素)

XGBoost 用於解決監督學習的問題,咱們用 $ x_{i} $ 去預測 $y_{i}$。在進入樹以前,咱們先回顧一下監督學習中的基本元素。學習

Model and Parameters(模型和參數)

監督學習裏的模型一般與如何經過$ x_{i} $ 去預測 $y_{i}$的算術結構有關。舉例來講,一個線性模型,預測函數是
$$ y^i=\sum_{j}θ_jx_{ij}y^i=\sum_{j}θ_jx_{ij} $$。
預測值能夠有基於不一樣任務的不一樣的解釋(好比,迴歸或是分類)。舉例,當咱們須要對輸出排序時,能夠用邏輯斯蒂轉換獲得在邏輯迴歸中正類的機率,也能夠把輸出值當成排序得分。優化

參數是咱們須要從數據中獲得的不肯定部分。在線性迴歸問題中,參數是係數 θ 。一般咱們用 θ 來指示參數(在模型中有不少參數,咱們的定義十分草率)spa

Objective Function : Training Loss + Regularization(損失函數:訓練偏差 + 正則)

基於不一樣的 $y_i$的理解咱們能夠有不用的問題,好比迴歸,分類,排序等等。咱們須要找出訓練數據最好的參數。爲了找出,咱們須要定義所謂的損失函數來衡量模型的性能

損失韓式必定須要包括兩個部分:訓練偏差 + 正則。

$$Obj(Θ)=L(θ)+Ω(Θ)$$

L 是訓練偏差函數,Ω 是正則項。訓練偏差衡量咱們的模型對訓練數據的預測的能力。通常來說是方差,以下(這個使用什麼樣的偏差衡量在參數中能夠設置,如均方根-rsme),

$$L(θ)=\sum_{i}(y_i−\hat{y_i})2 $$

另外一個經常使用的損失函數,是邏輯迴歸函數的邏輯損失函數。

$$L(θ)=\sum_{i}[y_iln(1+e^{−y^i})+(1−y_i)ln(1+e^\hat{y^i})]$$

人們常常會忘記加上正則項。正則項控制了模型的複雜程度,可以幫助咱們去防止過擬合。這樣聽起來有點抽象。讓咱們考慮下圖這樣一個問題。(我認爲過擬合這類東西咱們已經倒背如流了,這裏不必翻譯了,這篇文章講的是有點雞婆了)

overfitting

紅色的是正確的作法。

Why introduce the general principle?(爲何介紹廣泛原理)

上面介紹的東西組成了監督學習的基礎元素。(因此說監督學習很簡單 :)))咱們可使用上面的原理來衡量提高樹和隨機森林的不一樣和公平性。在書面意義上理解原理能夠幫助咱們學習例如剪枝和平滑這類發散式方法後面的緣由。

Tree Ensemble (樹的集合)

介紹完了監督學習的基本內容,如今讓咱們開始接觸真正的樹。開始以前,咱們先學習XGBoost的模型:樹的集合。一個樹集合模型是一個分類迴歸樹(CART)的集合。下面是CART的一個例子,對是否喜歡電腦遊戲進行分類。

CART

咱們將家庭成員分到不一樣的葉子節點中,並在相應的葉子節點上賦予得分。一個CART和決策樹有些許不一樣,決策樹的葉子結點只有決策值。在 CART 裏,最終的得分和每個葉子結點有關,給予咱們一個更加豐富的分類以外的解釋。這同時讓統一優化的步驟更加容易,在後面咱們會見到。

通常來說,單棵樹在現實中不夠強大。這就是爲何咱們須要可以把多棵樹預測值想加的樹集合的模型。

這裏寫圖片描述

上面這是兩棵樹的樹集合的例子。每一棵樹的結果想加獲得最後的結果。一個重要的因素,兩棵樹都嘗試去補充對方。數學上來說,咱們能夠將咱們的模型寫出以下形式。

$$\hat{y^i}=\sum_{k=1}^{K}f_k(x_i),f_k∈\mathcal{F}$$

K表明樹的個數,f是函數空間$mathcal{F}$裏的一個函數,$mathcal{F}$是全部可能的 CART 的集合。因此咱們優化的目標函數(也就是加了正則後的損失函數)能夠寫成

$$obj(θ)=\sum_{i}^{n}l(y_i,\hat{y_i})+\sum_{k=1}^{K}Ω(f_k)$$

如今咱們有個問題,隨機森林的模型是什麼樣的?就正是樹集合!因此隨機森林和提高樹在模型的形式上沒有不一樣,不一樣在與咱們怎麼去訓練他們。這意味着你若是寫了一個樹集合的預測服務,你僅僅須要去實現其中一種而且這個服務隨機森林或者提高樹下都能運行。

# 這一段我想把英文貼出來,由於我不肯定最後兩句話我翻譯的是否準確

Now here comes the question, what is the model for random forests? It is exactly tree ensembles! So random forests and boosted trees are not different in terms of model, the difference is how we train them. This means if you write a predictive service of tree ensembles, you only need to write one of them and they should directly work for both random forests and boosted trees. One example of why elements of supervised learning rock

Tree Boosting

模型介紹完了,讓咱們開始真實的訓練環節。咱們怎麼去學習這些樹呢?答案和全部的監督學習模型的方法是同樣的:定義一個目標函數並優化它

假設咱們有以下目標函數。

$$obj=\sum_{i}^{n}l(y_i,\hat{y_i}^{(t)})+\sum_{i=1}^{t}Ω(f_i)$$

Additive Training

咱們要問樹的參數是什麼?你發現咱們須要學習的是 $f_i $ 函數(每一個都包含了樹的結構和葉子得分)。這比起傳統的能夠用梯度降低解決的優化問題可貴多。一會兒訓練全部的樹不太現實。因此咱們採用了加和策略:擬合咱們已經學習的,而後每一次增長一個新的樹。咱們把在step t 的預測值寫成
$$\hat{y_i}^{(t)}$$

,因此咱們獲得以下

$$\hat{y}_i^{(0)} = 0$$
$$\hat{y}_i^{(1)} = f_1(x_i) = \hat{y}_i^{(0)} + f_1(x_i) $$
$$\hat{y}_i^{(2)} = f_1(x_i) + f_2(x_i)= \hat{y}_i^{(1)} + f_2(x_i) $$
$$\dots $$
$$\hat{y}_i^{(t)} = \sum_{k=1}^t f_k(x_i)= \hat{y}_i^{(t-1)} + f_t(x_i)$$

咱們仍是須要提問:在每一步中,哪一棵樹咱們須要?最天然的作法是加上一個咱們的優化目標。

$$\text{obj}^{(t)} = \sum_{i=1}^n l(y_i, \hat{y}_i^{(t)}) + \sum_{i=1}^t\Omega(f_i) $$

$$\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad = \sum_{i=1}^n l(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)) + \Omega(f_t) + constant$$

若是咱們使用MSE當咱們的損失函數,上式就變成以下形式

$$\text{obj}^{(t)} = \sum_{i=1}^n (y_i - (\hat{y}_i^{(t-1)} + f_t(x_i)))^2 + \sum_{i=1}^t\Omega(f_i) $$
$$\quad\quad\quad\quad\quad\quad\quad\quad = \sum_{i=1}^n [2(\hat{y}_i^{(t-1)} - y_i)f_t(x_i) + f_t(x_i)^2] + \Omega(f_t) + constant$$

MSE的形式很友好(包含一個一次項,也叫冗餘項,和一個二次項)。對於其餘的損失函數來講,獲得一個好的形式很不容易。因此在大部分的狀況下,咱們用展開到二級的泰勒展式

$$\text{obj}^{(t)} = \sum_{i=1}^n [l(y_i, \hat{y}_i^{(t-1)}) + g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)] + \Omega(f_t) + constant$$

$g_i$和$h_i$定義以下

$$g_i = \partial_{\hat{y}_i^{(t-1)}} l(y_i, \hat{y}_i^{(t-1)})$$
$$h_i = \partial_{\hat{y}_i^{(t-1)}}^2 l(y_i, \hat{y}_i^{(t-1)})$$

當咱們把全部的常熟都去除掉後,在step t的特殊的目標函數變成了

$$\sum_{i=1}^n [g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)] + \Omega(f_t)$$

這變成了咱們對新樹的目標函數。這樣的定義的一個重要的優勢是這個方程只依賴於$g_i$和$h_i$。這就是XGBoost怎麼支持定製的損失函數。咱們用只需$g_i$和$h_i$做爲輸入的求解程序最優化包括邏輯迴歸和加權邏輯迴歸的每個損失函數。

Model Complexity

咱們已經介紹了訓練的步驟,可是還有一個重要的事情沒提到!就是正則!咱們須要定義樹的複雜度 Ω(f)。讓咱們先定義樹的方程 f(x)

$$f_t(x) = w_{q(x)}, w \in R^T, q:R^d\rightarrow \{1,2,\cdots,T\}$$

在這裏 w 是葉子結點上得分的向量,q是一個給每一個相應葉子結點賦值的方程,以及 T 是葉子結點的數量。在XGBoost中咱們定義複雜度以下

$$\Omega(f) = \gamma T + \frac{1}{2}\lambda \sum_{j=1}^T w_j^2$$

固然,有許許多多的方式去定義複雜度,但這個是在實踐中特別有效的一個。正則在不少 的樹實現的包裏不受重視。這是由於傳統的樹學習僅僅強調減小雜質。定義了正則後,咱們能夠更好的知道咱們在學習什麼。

The Structure Score

這裏有關於求導的一個神奇的地方。當咱們從新定義樹模型後,咱們能夠把第t棵樹的目標函數寫成以下

$$Obj^{(t)} \approx \sum_{i=1}^n [g_i w_{q(x_i)} + \frac{1}{2} h_i w_{q(x_i)}^2] + \gamma T + \frac{1}{2}\lambda \sum_{j=1}^T w_j^2$$
$$\quad= \sum^T_{j=1} [(\sum_{i\in I_j} g_i) w_j + \frac{1}{2} (\sum_{i\in I_j} h_i + \lambda) w_j^2 ] + \gamma T$$

$I_j = {i|q(x_i)=j}$是對於$q(x_i)=j$的一系列數據點的集合。注意到在第二行咱們修改了求和的索引,由於同一個葉子結點上的全部數據有一樣的得分。咱們能夠再次壓縮這個方程,定義:
$$G_j = \sum_{i\in I_j} g_i $,$H_j = \sum_{i\in I_j} h_i$$。

$$\text{obj}^{(t)} = \sum^T_{j=1} [G_jw_j + \frac{1}{2} (H_j+\lambda) w_j^2] +\gamma T$$

在這個方程中,$w_j$是相互獨立的,
$$G_jw_j+12(H_j+λ)w^2_jG_jw_j+12(H_j+λ)w_j^2 $$
是二次的,在給定q(x)狀況下咱們能獲得的最好的$w_j$和最好的目標函數的減小以下

$$w_j^\ast = -\frac{G_j}{H_j+\lambda}$$
$$\text{obj}^\ast = -\frac{1}{2} \sum_{j=1}^T \frac{G_j^2}{H_j+\lambda} + \gamma T$$

後一個方程衡量了樹結構q(x)有多好

這裏寫圖片描述

若是以上全部聽起來有點複雜,讓咱們看一看這幅圖,看看得分是怎麼倍計算的。基本上,咱們在每一個葉子節點上計算$g_i$和$h_i$,將統計累加起來,再使用公式計算得出樹的好壞。若是不考慮計算得分中加入了模型複雜度,其實得分就像是在決策樹裏的不純度。

Learn the tree structure

如今咱們知道怎麼去衡量一棵樹的好壞了,理想狀況下咱們會枚舉全部可能的樹而後選擇最好的。但其實是不可能的,因此咱們會嘗試去一次優化一個等級。特別是在咱們嘗試去講一個葉子結點分紅兩個葉子是,這個葉子的得分計算爲

$$Gain = \frac{1}{2} \left[\frac{G_L^2}{H_L+\lambda}+\frac{G_R^2}{H_R+\lambda}-\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}\right] - \gamma$$

這個公式能夠分解成

  1. 新的左葉子的得分

  2. 新的右葉子的得分

  3. 原始葉子的得分

  4. 新加的葉子的正則

咱們能夠觀察到一個重要的因素:若是 gain 小於 γ,咱們就決定不分叉。這就是基於樹模型的剪枝技術。使用了監督學習的原則,咱們很天然地想到爲何這個技術可以有效 :)

對於真實值得數據,咱們老是想找到最佳的切分。爲了有效地達到目的,咱們將全部的實例排序,以下圖

這裏寫圖片描述

從左到右的掃描後咱們就能獲得最可能的切分方式。

Final words on XGBoost

如今你明白了什麼事提高樹,你也許會問,哪裏有XGBoost的文檔。 Github 傳送門在此,別的很少說了,去實踐吧。

翻譯的很辛苦,但願可以幫到大家!~

paper done 2017/4/23
相關文章
相關標籤/搜索