機器學習算法--GBDT

轉自 http://blog.csdn.net/u014568921/article/details/49383379html

另一個很容易理解的文章 :http://www.jianshu.com/p/005a4e6ac775git

更多參考以下github

Gradient Boosting Decision Tree,即梯度提高樹,簡稱GBDT,也叫GBRT(Gradient Boosting Regression Tree),也稱爲Multiple Additive Regression Tree(MART),阿里貌似叫treelink。面試

首先學習GBDT要有決策樹的先驗知識。算法

Gradient Boosting Decision Tree,和隨機森林(random forest)算法同樣,也是經過組合弱學習器來造成一個強學習器。GBDT的發明者是Friedman,至於隨機森林則是Friedman的好基友Breiman發明的。不過,GBDT算法中用到的決策樹只能是迴歸樹,這是由於該算法的每顆樹學的是以前全部樹結論之和的殘差,這個殘差就是一個累加預測值後能獲得真實值。經過將每次預測出的結果與目標值的殘差做爲下一次學習的目標。數據結構

其思路來源於數值優化---梯度降低。在使用梯度降低時,更新函數的參數是,w= w-δw
從數值優化推廣到函數空間的優化,能夠獲得δf, f= f-δf.
新生成的每一個樹h(x,m)須要跟-δf(f的梯度)之差最小(若是爲0,則新生成的樹就是所要求的梯度)。

 

想看英文原文的:app


greedy function approximation :a gradient boosting machine.--GBDT發明者Friedman的文章
框架

Stochastic gradient boosting。仍是Friedman的dom

Boosted Regression (Boosting): An introductory tutorial and a Stata plugin。機器學習

決策樹

以CART決策樹爲例,簡單介紹一下回歸樹的構建方法。

下面介紹gradient boost。

gradient boost

Boost是」提高」的意思,通常Boosting算法都是一個迭代的過程,每一次新的訓練都是爲了改進上一次的結果。咱們熟悉的adaboost算法是boost算法體系中的一類。gradient boost也屬於boost算法體系。

Gradient Boost實際上是一個框架,裏面能夠套入不少不一樣的算法。每一次的計算都是爲了減小上一次的殘差,爲了消除殘差,咱們能夠在殘差減小的梯度方向創建一個新的模型,因此說,每個新模型的創建都爲了使得以前的模型殘差向梯度方向上減小。它用來優化loss function有不少種。

下面是通用的gradient boost框架



要學習的迴歸樹的參數就是每一個節點的分裂屬性、最佳切點和節點的預測值。

GBDT算法流程

 Friedman的文章greedy function approximation :a gradient boosting machine.中的least-square regression算法以下:

裏面yi-Fm-1求得的便是殘差,每次就是在這個基礎上學習。

兩個版本的GBDT

目前GBDT有兩個不一樣的描述版本,網上寫GBDT的大都沒有說清楚本身說的是哪一個版本,以及不一樣版本之間的不一樣是什麼,讀者看不一樣的介紹會獲得不一樣的算法描述,實在讓人很頭痛。

殘差版本把GBDT說成一個殘差迭代樹,認爲每一棵迴歸樹都在學習前N-1棵樹的殘差,前面所說的主要在描述這一版本。

Gradient版本把GBDT說成一個梯度迭代樹,使用梯度降低法求解,認爲每一棵迴歸樹在學習前N-1棵樹的梯度降低值。

要解決問題仍是閱讀Friedman的文章。

讀完greedy function approximation :a gradient boosting machine.後,發現4.1-4.4寫的是殘差版本的GBDT,這一個版本主要用來回歸;4.5-4.6寫的是Gradient版本,它在殘差版本的GBDT版本上作了Logistic變換,Gradient版本主要是用來分類的。

分類問題與迴歸問題不一樣,每棵樹的樣本的目標就不是一個數值了,而是每一個樣本在每一個分類下面都有一個估值Fk(x)。

同邏輯迴歸同樣,假若有K類,每個樣本的估計值爲F1(x)...Fk(x),對其做logistic變化以後獲得屬於每一類的機率是P1(x)...pk(x),

則損失函數能夠定義爲負的log似然:

其中,yk爲輸入的樣本數據的估計值,當一個樣本x屬於類別k時,yk = 1,不然yk = 0。

將Logistic變換的式子帶入損失函數,而且對其求導,能夠獲得損失函數的梯度:

能夠看出對多分類問題,新的一棵樹擬合的目標還是殘差向量。

用Logistic變換後的算法以下:

對第一棵樹,能夠初始化每一個樣本在每一個分類上的估計值Fk(x)都爲0;計算logistic變換pk(x),計算殘差向量,做爲當前樹的迴歸的目標,迴歸樹的分裂過程仍可採用【左子樹樣本目標值(殘差)和的平方均值+右子樹樣本目標值(殘差)和的平方均值-父結點全部樣本目標值(殘差)和的平方均值】最大的那個分裂點與分裂特徵值等方法;當迴歸樹的葉子節點數目達到要求示,則該樹創建完成;對每一個葉子節點,利用落到該葉子節點的全部樣本的殘差向量,計算增益rjkm;更新每個樣本的估計值Fk(x);所以,又能夠對估計進行logistic變化,利用樣本的目標值計算殘差向量,訓練第二棵樹了。

正則化regularization

Shrinkage:即學習率


\nu就是學習率。 通常狀況下,越小的學習率,能夠越好的逼近預測值,不容易產生過擬合,迭代次數會增長,經驗上通常選取0.1左右。

使用縮減訓練集

Friedman提出在每次迭代時對base learner從原始訓練集中隨機抽取一部分(a subsample of the training set drawn at random without replacement)做爲本次base learner去擬合的樣本集能夠提升算法最後的準確率。

限制葉節點中樣本的數目

這個在決策樹中已經提到過。

剪枝

這個在決策樹中已經提到過。

限制每顆樹的深度

樹的深度通常取的比較小,須要根據實際狀況來定。

迭代的次數d
也即最多有多少棵樹,樹太多可能形成過擬合,即在訓練集上表現很好,測試集上表現糟糕;太少則會欠擬合。樹的棵樹和shrink有關,shrink越小,樹會越多。

幾個細節提一下

對初始分類器(函數)的選擇就能夠直接用0,經過平方差LOSS函數求得的殘差固然就是樣本自己了;也能夠選擇樣本的均值;
一棵樹的分裂過程只須要找到找到每一個結點的分裂的特徵id與特徵值,而尋找的方法能夠是平均最小均方差,也能夠是使得(左子樹樣本目標值和的平方均值+右子樹樣本目標值和的平方均值-父結點全部樣本目標值和的平方均值)最大的那個分裂點與分裂特徵值等等方法;從而將樣本分到左右子樹中,繼續上面過程;

注意樣本的估計值Fk(x)是前面全部樹的估值之和,所以,計算殘差時,用樣本的目標值減去Fk(x)就能夠獲得殘差了

 

http://www.cnblogs.com/LeftNotEasy/archive/2011/03/07/random-forest-and-gbdt.html這篇文章關於分類講得比較好,借鑑了他寫的一些,例子也很好,你們能夠看看。

GBDT--簡單理解

LightGBM中GBDT的實現

機器學習算法總結--GBDT

https://github.com/MLWave/Kaggle-Ensemble-Guide

相關文章
相關標籤/搜索