機器學習之XGBoost集成算法、牛頓法

一、XGBoost算法

基本構成
boosted tree作爲有監督學習算法有幾個重要部分:模型、參數、目標函數、優化算法
模型
模型指給定輸入x如何去預測輸出y
參數
參數指我們需要學習的東西,在線性模型中,參數指我們的線性係數w
目標函數
目標函數:損失 + 正則,教我們如何去尋找一個比較好的參數
一般的目標函數包含下面兩項:
這裏寫圖片描述
Bias-variance tradeoff,Bias可以理解爲假設我們有無限多數據的時候,可以訓練出最好的模型所拿到的誤差。而Variance是因爲我們只有有限數據,其中隨機性帶來的誤差。
誤差函數儘量去擬合訓練數據,正則化項則鼓勵更加簡單的模型。因爲當模型簡單之後,有限數據擬合出來結果的隨機性比較小,不容易過擬合,使得最後模型的預測更加穩定。
優化算法
給定目標函數之後怎麼學的問題
Boosted Tree
###1、基學習器:分類和迴歸樹(CART)
這裏寫圖片描述
CART會把輸入根據輸入的屬性分配到各個葉子節點,而每個葉子節點上面都會對應一個實數分數。

Tree Ensemble構成
一個CART往往過於簡單無法有效地預測,因此一個更加強力的模型叫做tree ensemble。
這裏寫圖片描述
用兩棵樹來進行預測。我們對於每個樣本的預測結果就是每棵樹預測分數的和。
tree ensemble
預測函數:
yi^=k=1Kfk(xi),fkf \hat{y_i}=\sum_{k=1}^Kf_k(x_i),f_k \in f
目標函數:
Obj(Θ)=inl(yi,yi^)+k=1KΩ(fk) Obj(\Theta)=\sum_{i}^nl(y_i,\hat{y_i})+\sum_{k=1}^K\Omega(f_k)
模型學習:additive training
第一部分是訓練誤差,第二部分是每棵樹的複雜度的和。
每一次保留原來的模型不變,加入一個新的函數f到我們的模型中。
這裏寫圖片描述
如何選擇每一輪加入什麼f呢?
選取一個f來使得我們的目標函數儘量最大地降低(加入f後的預測結果與實際結果誤差減少)。
這裏寫圖片描述
對於l是平方誤差時:
這裏寫圖片描述
對於l不是平方誤差的情況:
採用如下的泰勒展開近似來定義一個近似的目標函數
這裏寫圖片描述
移除常數項(真實值與上一輪的預測值之差),目標函數只依賴於每個數據點的在誤差函數上的一階導數和二階導數
這裏寫圖片描述
樹的複雜度
以上是目標函數中訓練誤差的部分,接下來定義樹的複雜度。
對於f的定義做一下細化,把樹拆分成結構函數q(輸入x輸出葉子節點索引)和葉子權重部分w(輸入葉子節點索引輸出葉子節點分數),結構函數q把輸入映射到葉子的索引號上面去,而w給定了每個索引號對應的葉子分數是什麼。
這裏寫圖片描述
定義一棵樹的複雜度如下:
一棵樹裏面葉子節點的個數,以及每個樹葉子節點上面輸出分數的L2模平方。
這裏寫圖片描述
目標函數改寫:
這裏寫圖片描述
其中I被定義爲每個葉子上面樣本集合Ij={i|q(xi)=ji} (每個葉子節點裏面樣本集合);
f(xi)等價於求出w(q(xi))的值(每一個樣本所在葉子索引的分數) ;T爲葉子節點數量。
定義Gj(每個葉子節點裏面一階梯度的和)Hj(每個葉子節點裏面二階梯度的和)
Gj=iIjgi,  Hj=iIjhj G_j=\sum_{i\in I_j}g_i ,\ \ H_j=\sum_{i \in I_j}h_j
目標函數改寫:
這裏寫圖片描述
求偏導得出:
wj=GjHj+λw_j^*=-\frac{G_j}{H_j+\lambda} Obj=12j=1TGj2Hj+λ+λTObj=-\frac{1}{2}\sum_{j=1}^T\frac{G_j^2}{H_j+\lambda}+\lambda T
Obj代表了當我們指定一個樹的結構的時候,我們在目標上面最多減少多少,可叫做結構分數(structure score),Obj計算示例:
這裏寫圖片描述
枚舉所有不同樹結構的貪心法
exact greedy algorithm 貪心算法獲取最優切分點
利用這個打分函數來尋找出一個最優結構的樹,加入到我們的模型中,再重複這樣的操作。
常用的方法是貪心法,每一次嘗試去對已有的葉子加入一個分割。對於一個具體的分割方案,計算增益:
這裏寫圖片描述
對於每次擴展,如何高效地枚舉所有的分割呢
假設我們要枚舉所有 x

引入新葉子的懲罰項
優化這個目標對應了樹的剪枝, 當引入的分割帶來的增益小於一個閥值的時候,我們可以剪掉這個分割。
這樣根據推導引入了分裂節點的選取計算分數和葉子的懲罰項,替代了迴歸樹的基尼係數與剪枝操作。
當我們正式地推導目標的時候,像計算分數和剪枝這樣的策略都會自然地出現,而不再是一種因爲heuristic(啓發式)而進行的操作了。
縮減與列抽樣
縮減,每一個樹生成結果乘以一個步長係數 防止過擬合
列採樣樣 類似隨機森林每個樹特徵抽樣 防止過擬合
以上來自:https://blog.csdn.net/q383700092/article/details/60954996

二、牛頓法

隨便找一個曲線上的A點(爲什麼隨便找,根據切線是切點附近的曲線的近似,應該在根點附近找,但是很顯然我們現在還不知道根點在哪裏),做一個切線,切線的根(就是和x軸的交點)與曲線的根,還有一定的距離。此時從這個切線的根出發,做一根垂線,和曲線相交於B點,繼續上面的步驟:
這裏寫圖片描述
這裏寫圖片描述
經過多次迭代後,很明顯越來越接近曲線的根了(但只會更接近根),此時稱爲迭代收斂了。
牛頓法的代數解法:當曲線方程爲f(x) ,我們在xn點做切線,求xn+1:
此時容易得出,xn點的切線方程爲:f(xn)+f(xn)(xxn)f(x_n)+f'(x_n)(x-x_n)要求xn+1x_n+1,即相當於求f(xn)+f(xn)(xxn)=0f(x_n)+f'(x_n)(x-x_n)=0的解,即f(xn)+f(xn)(xn+1xn)=0    xn+1=xnf(xn)f(xn)f(x_n)+f'(x_n)(x_{n+1}-x_n)=0\implies x_{n+1}=x_{n}-{\frac {f(x_{n})}{f'(x_{n})}}
但還有一些形式的函數是不收斂的,所以要注意以下問題:

  • 函數在整個定義域內最好是二階可導的
  • 注意起始點的選擇

牛頓法的基本思想是:在現有極小點估計值的附近對f(x)做二階泰勒展開,進而找到極小點的下一個估計值。設xk爲當前的極小點估計值,則:
φ(x)=f(xk)+f(xk)(xxk)+12f(xk)(xxk)2\varphi(x)=f(x_k)+f'(x_k)(x-x_k)+\frac{1}{2}f''(x_k)(x-x_k)^2
表示f(x)在xk附近的二階泰勒展開式(略去了關於xxkx−x_k的高階項),由於求的是最值,由極值必要條件可知,φ(x)應滿足φ(x)=0φ'(x)=0,即f(xk)+f(xk)(xxk)=0f'(x_k)+f''(x_k)(x-x_k)=0
從而得到
x=xkf(xk)f(xk)x=x_k-\frac{f'(x_k)}{f''(x_k)}
於是,若給定初始值x0,則可以構造如下的迭代格式
xk+1=xkf(xk)f(xk),k=0,1....x_{k+1}=x_k-\frac{f'(x_k)}{f''(x_k)}, k=0,1....
可通過產生序列xk{x_k}來逼近f(x)的極小點.在一定條件下,xk{x_k}可以收斂到f(x)的極小點。
對於N>1的情形,二階泰勒展開式可以做推廣,此時
φ(X)=f(Xk)+f(Xk)(XXk)+12(XXk)T2f(Xk)(XXk)\varphi(X)=f(X_k)+\bigtriangledown f(X_k)(X-X_k)+\frac{1}{2}(X-X_k)^T\bigtriangledown ^2f(X_k)(X-X_k)
其中▽f爲f的梯度向量,▽2f爲f的海森矩陣,其定義如下:
這裏寫圖片描述
注意,▽f和▽2f中的元素均爲關於X的函數,以下簡記爲g和H.特別是若f的混合偏導數可交換次序,則海森矩陣爲對稱矩陣。而f(Xk)2f(Xk)▽f(X_k)和▽2f(X_k)則表示將X取爲xkx_k後得到的實值向量和矩陣,以下分別將其簡記爲gkg_kHkH_k
同樣的,由於是求極小點,極值必要條件 要求它爲φ(X)的駐點,即φ(X)=0▽φ(X)=0
通過在上式中兩邊作用一個梯度算子,得到:
gk+Hk(XXk)=0g_k+H_k(X-X_k)=0
此時若矩陣Hk非奇異,可解得
X=XkHk1gkX=X_k-H_k^{-1}g_k
若給定初始值X0,則可同樣構造出迭代格式
Xk+1=XkHk1gkX_{k+1}=X_k-H_k^{-1}g_k
這就是牛頓迭代法,其迭代格式中的搜索方向爲Hk1gk-H_k^{-1}g_k稱爲牛頓方向。
當目標函數是二次函數時,由於二次泰勒展開函數與原目標函數不是近似而是完全相同的二次式,海森矩陣退化爲一個常數矩陣,從任一初始點出發,只需一步迭代即可達到極小點,因此牛頓法是一種具有二次收斂的算法。對於非二次函數,若函數的二次性態較強,或迭代點已進入極小點的鄰域,則其收斂速度也是很快的。
牛頓法來自:https://blog.csdn.net/lilong117194/article/details/78111779

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章