boost集成模型

boost集成模型

簡述:

常用集成樹模型有隨機森林、gbdt、xgb、lgb;bagging隨機森林很簡單,隨機取特徵和樣本,不容易過擬合,不做介紹。主要介紹一下gbdt和xgb.

cart決策樹:

  • 分類樹使用基尼係數增益,原理上和id3差不多,本質上還是將概率分佈進行了一種轉換。
  • 分類二叉樹的特性讓cart相較於id3而言,不會選擇離散值多的特徵,但是另外一方面也加大了計算量,id3相當於把數據集分成n份,而cart樹要每個特徵的每個分割值都要計算所有的數據集,而且特徵還可以重複使用。
  • 迴歸二叉樹通過均方誤差最小尋找切分特徵和切分點

boost 模型:

boost方法的原理幾乎都是一樣,模型都是加法模型
fM(x)=ΣT(x;Θ)f_M(x)=\Sigma T(x;\Theta)
學習方法都是迭代:
f(x)=fm1(x)+T(x;Θ)f(x)=f_{m-1}(x)+T(x;\Theta)

爲什麼需要boost模型?
理論上決策樹只要樹的深度足夠深,就可以很好的擬合當前數據,但是容易過擬合驗證,有一個形象的解釋,單決策樹相當於把樣本空間切分的過細,容易過擬合,boost每次迭代一個新的模型都是一個新的樣本空間,因此不容易過擬合。

adaboost 模型:

adaboost沒有指定分類器類型,因此可以說它只是提供了一個框架,當指定基分類器是決策樹的時候, adaboost就是提升樹,其迭代方法與boost思想一致,指定了指數損失:exp[-yf(x)],其收斂速度也是指數級的,需要注意的是指數損失一般用於 分類 ,這個是因爲分類確實用指數損失計算方便。
adaboost加法模型同boost一致:
fM(x)=ΣGm(x;Θ)f_M(x)=\Sigma G_{m}(x;\Theta)
損失函數是指數函數:
L=argminΣe[yi(fm1(x)+αG(x))]L = argmin\Sigma e^{[-y_i(f_{m-1}(x)+\alpha G(x))]}
L=argminΣwˉeyiαG(x)L = argmin\Sigma\bar{w}e^{-y_i\alpha G(x)}
這裏wˉ=eyifm1(x)\bar{w}=e^{-y_if_{m-1}(x)}因爲fm1f_{m-1}是已知的
接下來我們要求的就是讓L最小,我們直接對損失函數求一階導, 然後令導函數爲0,求解析解即可得到α\alpha的值,計算如下:
L=ΣwˉeyiαG(x)L = \Sigma\bar{w}e^{-y_i\alpha G(x)}
L=Σyi!=G(x)wˉeα+Σyi=G(x)wˉeαL = \Sigma_{y_i!=G(x)}\bar{w}e^{-\alpha} + \Sigma_{y_i=G(x)}\bar{w}e^{\alpha}
上面的損失函數轉化求導後可得:這裏詳細的過程參考李航的<統計學習方法>
α^=12log1emem\hat{\alpha}=\frac{1}{2}log\frac{1-e_m}{e_m}其中eme_m標識分類錯誤率.

我們總結一下即可得到:
wˉ\bar{w}就是adaboost中未歸一化的樣本權重更新值,依賴於上一層模型的錯誤分類,α\alpha就是每個模型的權重,依賴於當前模型的錯誤分類和輸入的樣本權重。

提升樹模型:

提升樹模型通常是指定了以cart決策樹爲基分類器,因此可以說它只是提供了一個框架,其迭代方法與boost思想一致,未指定損失函數(與adaboost比較),一般有均方誤差和huber損失(迴歸), 指數損失(分類)等。
如果損失函數爲均方誤差, 我們來看看利用boost方法的推導過程。我們用TT標識樹,則加法模型表示爲:
fM(x)=T(x;θ)f_M(x) = T(x;\theta)

迭代算法:
fm(x)=fm1(x)+T(x;θ)f_m(x) = f_{m-1}(x) + T(x;\theta)

損失函數:
ΣL(yi,fm1(xi)+T(xi;θ))\Sigma L(y_i,f_{m-1}(x_i) + T(x_i;\theta))

採用均方誤差時:
L(y,f(x))=(yf(x))2L(y, f(x))=(y-f(x))^2
L(y,f(x))=(yfm1(x)T(x;θ))2L(y, f(x))=(y-f_{m-1}(x)-T(x;\theta))^2
L(y,f(x))=(rT(x;θ))2L(y, f(x))=(r-T(x;\theta))^2
其中r=yfm1(x)r=y-f_{m-1}(x),就是殘差了。
通過adaboost的指數損失和提升樹的均方誤差我們知道這些迭代求解是比較簡單的。指數損失直接解析解可以求出,均方誤差都不用求導,但是並不是所有的損失函數都這麼方便。但是通過均方誤差我們也很容易發現一個規律,那就是rr和梯度的關係,該關係可以通過上述的損失函數求一階導得到L˙=fm1y=r\dot{L}=f_{m-1}-y=-r,解釋下來就是集成樹只要負責擬合之前模型的梯度即可,那麼在優化損失函數沒那麼方便的時候自然可以使用泰勒公式簡化運算,找到近似解。

gbdt:梯度提升樹

梯度提升樹同提升樹是一樣的,只需要將上面的
r改成
r=[dL(y,fm1(x))d(fm1(x))]r = - [ \frac{dL(y, f_{m-1}(x))}{d(f_{m-1}(x))} ]
通常將上述函數用一階泰勒展開式近似替換以方便計算。

xgb:

xgb也是提升樹,與gbdt最重要的不同的是,

  • xgb對損失函數的梯度求解是用二階泰勒展開式近似替換以方便計算,顯然更接近真實負梯度,推導過程省略.
  • 在gbdt可以隨機採樣的基礎上,xgb加入了列抽樣,即特徵抽樣,復刻了隨機森林的做法
  • xgb沒有規定基分類器,傳統gbdt指定以cart迴歸樹爲基分類器,這一點有點像adaboost,但是一般在使用xgb的時候還是用cart分類樹。
  • xgb在gbdt基礎上在損失函數中加入了正則化,可以進行預剪枝,進一步防止過擬合,而gbdt則主要是通過
  • 1、學習速率,
  • 2、隨機採樣(跟隨機森林一樣)
  • 3、cart樹的後剪枝
  • xgb在工程上實現了並行化,注意這裏並不是在迭代的過程中並行,而是在樹分裂計算的時候並行,cart迴歸樹在計算的時候通常是需要線性搜索所有的分裂節點,計算收益, 這個過程其實可以多線程並行,另外也可以通過直方圖算法在降低內存使用的同事近似獲取最優分裂點。
  • 與gbdt一樣,都可以設置學習速率

總結一下:xgb相較於gbdt在工程效率和算法魯棒性都有了提高。

lightgbm:

  • lightgbm相對於xgb基本上是樹分裂過程速度優化,使用goss方法.
  • lightgbm可以通過傳參的形式告知模型哪些是類別特徵,lightgbm,xgb跟隨機森林還有gbdt一樣,對於類別特徵需要自己one—hot編碼,但是如果類別過多會導致切分增益很小,解決方案可以使用nn訓練一個embedding向量出來,或者統計每個類別對應label的均值等。

一些細節:

1、迴歸樹爲什麼用二叉樹?每次分裂,非二叉樹的計算量是二叉樹的指數倍,遍歷難度會比較大,不如二叉樹來的簡單,直接增加樹的深度即可。

2、gbdt在解決迴歸問題上不是一個好的選擇?前提是使用均方誤差作爲損失函數的話,gbdt會對異常值"過於"敏感,其實這是均方誤差通病,迴歸問題可以改爲huber損失或絕對損失,如果沒有做異常值、離羣值處理, 那麼確實不是一個好的選擇。

3、以上屬於個人理解總結,如有錯誤或遺漏煩請指正,未完待續,持續更新

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