單決策樹C4.5因爲功能太簡單,而且很是容易出現過擬合的現象,因而引伸出了許多變種決策樹,就是將單決策樹進行模型組合,造成多決策樹,比較典型的就是迭代決策樹GBRT和隨機森林RF。面試
在最近幾年的paper上,如iccv這種重量級會議,iccv 09年的裏面有很多文章都是與Boosting和隨機森林相關的。模型組合+決策樹相關算法有兩種比較基本的形式:隨機森林RF與GBDT,其餘比較新的模型組合+決策樹算法都是來自這兩種算法的延伸。算法
核心思想:其實不少「漸進梯度」Gradient Boost都只是一個框架,裏面能夠套用不少不一樣的算法。網絡
首先說明一下,GBRT這個算法有不少名字,但都是同一個算法:框架
GBRT (Gradient BoostRegression Tree) 漸進梯度迴歸樹機器學習
GBDT (Gradient BoostDecision Tree) 漸進梯度決策樹函數
MART (MultipleAdditive Regression Tree) 多決策迴歸樹學習
Tree Net決策樹網絡搜索引擎
迭代決策樹算法,在阿里內部用得比較多(因此阿里算法崗位面試時可能會問到),由多棵決策樹組成,全部樹的輸出結果累加起來就是最終答案。它在被提出之初就和SVM一塊兒被認爲是泛化能力(generalization)較強的算法。近些年更由於被用於搜索排序的機器學習模型而引發你們關注。spa
GBRT是迴歸樹,不是分類樹。其核心就在於,每一棵樹是從以前全部樹的殘差中來學習的。爲了防止過擬合,和Adaboosting同樣,也加入了boosting這一項。排序
關於GBRT的介紹能夠能夠參考:GBDT(MART) 迭代決策樹入門教程 | 簡介。
提起決策樹(DT, DecisionTree)不要只想到C4.5單分類決策樹,GBRT不是分類樹而是迴歸樹!
決策樹分爲迴歸樹和分類樹:
迴歸樹用於預測實數值,如明天溫度、用戶年齡
分類樹用於分類標籤值,如晴天/陰天/霧/雨、用戶性別
注意前者結果加減是有意義的,如10歲+5歲-3歲=12歲,後者結果加減無心義,如男+女=究竟是男仍是女?GBRT的核心在於累加全部樹的結果做爲最終結果,而分類樹是沒有辦法累加的。因此GBDT中的樹都是迴歸樹而非分類樹。
第一棵樹是正常的,以後全部的樹的決策全是由殘差(這次的值與上次的值之差)來做決策。
0.給定一個初始值
1.創建M棵決策樹(迭代M次)
2.對函數估計值F(x)進行Logistic變換
3.對於K各分類進行下面的操做(其實這個for循環也能夠理解爲向量的操做,每一個樣本點xi都對應了K種可能的分類yi,因此yi,F(xi),p(xi)都是一個K維向量)
4.求得殘差減小的梯度方向
5.根據每一個樣本點x,與其殘差減小的梯度方向,獲得一棵由J個葉子節點組成的決策樹
6.當決策樹創建完成後,經過這個公式,能夠獲得每一個葉子節點的增益(這個增益在預測時候用的)
每一個增益的組成其實也是一個K維向量,表示若是在決策樹預測的過程當中,若是某個樣本點掉入了這個葉子節點,則其對應的K個分類的值是多少。好比GBDT獲得了三棵決策樹,一個樣本點在預測的時候,也會掉入3個葉子節點上,其增益分別爲(假設爲3分類問題):
(0.5, 0.8, 0.1), (0.2, 0.6, 0.3), (0.4, .0.3, 0.3),那麼這樣最終獲得的分類爲第二個,由於選擇分類2的決策樹是最多的。
7.將當前獲得的決策樹與以前的那些決策樹合併起來,做爲一個新的模型(跟6中的例子差很少)
--------------------------------------------------------------------------------------------------------------
仍是年齡預測,簡單起見訓練集只有4我的,A,B,C,D,他們的年齡分別是14,16,24,26。其中A、B分別是高一和高三學生;C,D分別是應屆畢業生和工做兩年的員工。若是是用一棵傳統的迴歸決策樹來訓練,會獲得以下圖1所示結果:
如今咱們使用GBDT來作這件事,因爲數據太少,咱們限定葉子節點作多有兩個,即每棵樹只有一個分枝,而且限定只學兩棵樹。咱們會獲得以下圖2所示結果:
在第一棵樹分枝和圖1同樣,因爲A,B年齡較爲相近,C,D年齡較爲相近,他們被分爲兩撥,每撥用平均年齡做爲預測值。此時計算殘差(殘差的意思就是: A的預測值 + A的殘差 = A的實際值),因此A的殘差就是16-15=1(注意,A的預測值是指前面全部樹累加的和,這裏前面只有一棵樹因此直接是15,若是還有樹則須要都累加起來做爲A的預測值)。進而獲得A,B,C,D的殘差分別爲-1,1,-1,1。而後咱們拿殘差替代A,B,C,D的原值,到第二棵樹去學習,若是咱們的預測值和它們的殘差相等,則只需把第二棵樹的結論累加到第一棵樹上就能獲得真實年齡了。這裏的數據顯然是我能夠作的,第二棵樹只有兩個值1和-1,直接分紅兩個節點。此時全部人的殘差都是0,即每一個人都獲得了真實的預測值。
換句話說,如今A,B,C,D的預測值都和真實年齡一致了。
A: 14歲高一學生,購物較少,常常問學長問題;預測年齡A = 15 – 1 = 14
B: 16歲高三學生;購物較少,常常被學弟問問題;預測年齡B = 15 + 1 = 16
C: 24歲應屆畢業生;購物較多,常常問師兄問題;預測年齡C = 25 – 1 = 24
D: 26歲工做兩年員工;購物較多,常常被師弟問問題;預測年齡D = 25 + 1 = 26
那麼哪裏體現了Gradient呢?其實回到第一棵樹結束時想想,不管此時的cost function是什麼,是均方差仍是均差,只要它以偏差做爲衡量標準,殘差向量(-1, 1, -1, 1)都是它的全局最優方向,這就是Gradient。
該版本的GBRT幾乎可用於全部的迴歸問題(線性/非線性),相對logistic regression僅能用於線性迴歸,GBRT的適用面很是廣。亦可用於二分類問題(設定閾值,大於閾值爲正例,反之爲負例)。
搜索排序關注各個doc的順序而不是絕對值,因此須要一個新的cost function,而RankNet基本就是在定義這個cost function,它能夠兼容不一樣的算法(GBDT、神經網絡...)。
實際的搜索排序使用的是Lambda MART算法,必須指出的是因爲這裏要使用排序須要的cost function,LambdaMART迭代用的並非殘差。Lambda在這裏充當替代殘差的計算方法,它使用了一種相似Gradient*步長模擬殘差的方法。這裏的MART在求解方法上和以前說的殘差略有不一樣,其區別描述見這裏。
搜索排序也須要訓練集,但多數用人工標註實現,即對每一個(query, doc)pair給定一個分值(如1, 2, 3, 4),分值越高越相關,越應該排到前面。RankNet就是基於此制定了一個學習偏差衡量方法,即cost function。RankNet對任意兩個文檔A,B,經過它們的人工標註分差,用sigmoid函數估計二者順序和逆序的機率P1。而後同理用機器學習到的分差計算機率P2(sigmoid的好處在於它容許機器學習獲得的分值是任意實數值,只要它們的分差和標準分的分差一致,P2就趨近於P1)。這時利用P1和P2求的二者的交叉熵,該交叉熵就是cost function。
有了cost function,能夠求導求Gradient,Gradient即每一個文檔得分的一個降低方向組成的N維向量,N爲文檔個數(應該說是query-doc pair個數)。這裏僅僅是把」求殘差「的邏輯替換爲」求梯度「。每一個樣本經過Shrinkage累加都會獲得一個最終得分,直接按分數從大到小排序就能夠了。