GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一種迭代的決策樹算法,該算法由多棵決策樹組成,全部樹的結論累加起來作最終答案。它在被提出之初就和SVM一塊兒被認爲是泛化能力(generalization)較強的算法。近些年更由於被用於搜索排序的機器學習模型而引發你們關注。算法
提起決策樹(DT, Decision Tree) 絕大部分人首先想到的就是C4.5分類決策樹。但若是一開始就把GBDT中的樹想成分類樹,那就是一條歪路走到黑,一路各類坑,最終摔得都要咯血了仍是一頭霧水說的就是LZ本身啊有木有。咳嗯,因此說千萬不要覺得GBDT是不少棵分類樹。機器學習
決策樹分爲兩大類,迴歸樹和分類樹。前者用於預測實數值,如明天的溫度、用戶的年齡、網頁的相關程度;後者用於分類標籤值,如晴天/陰天/霧/雨、用戶性別、網頁是不是垃圾頁面。這裏要強調的是,前者的結果加減是有意義的,如10歲+5歲-3歲=12歲,後者則無心義,如男+男+女=究竟是男是女? GBDT的核心在於累加全部樹的結果做爲最終結果,就像前面對年齡的累加(-3是加負3),而分類樹的結果顯然是沒辦法累加的,因此GBDT中的樹都是迴歸樹,不是分類樹, 這點對理解GBDT至關重要(儘管GBDT調整後也可用於分類但不表明GBDT的樹是分類樹)。那麼迴歸樹是如何工做的呢?學習
下面咱們以對人的性別判別/年齡預測爲例來講明,每一個instance都是一個咱們已知性別/年齡的人,而feature則包括這我的上網的時長、上網的時段、網購所花的金額等。測試
做爲對比,先說分類樹,咱們知道C4.5分類樹在每次分枝時,是窮舉每個feature的每個閾值,找到使得按照feature<=閾值,和feature>閾值分紅的兩個分枝的熵最大的feature和閾值(熵最大的概念可理解成儘量每一個分枝的男女比例都遠離1:1,其實應該使用特徵選擇的術語進行描述,應該使用信息增益或者信息增益比來表示) ,按照該標準分枝獲得兩個新節點,用一樣方法繼續分枝直到全部人都被分入性別惟一的葉子節點,或達到預設的終止條件,若最終葉子節點中的性別不惟一,則以多數人的性別做爲該葉子節點的性別。(這個地方的熵最大可能沒把問題解釋清楚)spa
迴歸樹整體流程也是相似,不過在每一個節點(不必定是葉子節點)都會得一個預測值,以年齡爲例,該預測值等於屬於這個節點的全部人年齡的平均值。分枝時窮舉每個feature的每一個閾值找最好的分割點,但衡量最好的標準再也不是最大熵,而是 最小化均方差--即(每一個人的年齡-預測年齡)^2 的總和 / N ,或者說是每一個人的預測偏差平方和 除以 N。這很好理解,被預測出錯的人數越多,錯的越離譜,均方差就越大,經過最小化均方差可以找到最靠譜的分枝依據。分枝直到每一個葉子節點上人的年齡都惟一(這太難了)或者達到預設的終止條件(如葉子個數上限),若最終葉子節點上人的年齡不惟一,則以該節點上全部人的平均年齡作爲該葉子節點的預測年齡。若還不明白能夠Google "Regression Tree",或閱讀本文的第一篇論文中Regression Tree部分。code
好吧,我起了一個很大的標題,但事實上我並不想多講Gradient Boosting的原理,由於不明白原理並沒有礙於理解GBDT中的Gradient Boosting。喜歡打破砂鍋問到底的同窗能夠閱讀這篇英文wikihttp://en.wikipedia.org/wiki/Gradient_boosted_trees#Gradient_tree_boostingblog
Boosting,迭代,即經過迭代多棵樹來共同決策。這怎麼實現呢?難道是每棵樹獨立訓練一遍,好比A這我的,第一棵樹認爲是10歲,第二棵樹認爲是0歲,第三棵樹認爲是20歲,咱們就取平均值10歲作最終結論?--固然不是!且不說這是投票方法並非GBDT,只要訓練集不變,獨立訓練三次的三棵樹一定徹底相同,這樣作徹底沒有意義。以前說過,GBDT是把全部樹的結論累加起來作最終結論的,因此能夠想到每棵樹的結論並非年齡自己,而是年齡的一個累加量。GBDT的核心就在於,每一棵樹學的是以前全部樹結論和的殘差,這個殘差就是一個加預測值後能得真實值的累加量。 好比A的真實年齡是18歲,但第一棵樹的預測年齡是12歲,差了6歲,即殘差爲6歲。那麼在第二棵樹裏咱們把A的年齡設爲6歲去學習,若是第二棵樹真的能把A分到6歲的葉子節點,那累加兩棵樹的結論就是A的真實年齡;若是第二棵樹的結論是5歲,則A仍然存在1歲的殘差,第三棵樹裏A的年齡就變成1歲,繼續學。這就是Gradient Boosting在GBDT中的意義,簡單吧。排序
若是是用一棵傳統的迴歸決策樹來訓練,會獲得以下圖1所示結果:ip
如今咱們使用GBDT來作這件事,因爲數據太少,咱們限定葉子節點最多有兩個,即每棵樹都只有一個分枝,而且限定只學兩棵樹。咱們會獲得以下圖2所示結果:ci
在第一棵樹分枝和圖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的預測值都和真實年齡一致了。Perfect!:
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。
講到這裏咱們已經把GBDT最核心的概念、運算過程講完了!沒錯就是這麼簡單。 不過講到這裏很容易發現三個問題:
答案是過擬合。過擬合是指爲了讓訓練集精度更高, 學到了不少」僅在訓練集上成立的規律「,致使換一個數據集當前規律就不適用了。 其實只要容許一棵樹的葉子節點足夠多,訓練集老是能訓練到100%準確率的 (大不了最後一個葉子上只有一個instance)。 在訓練精度和實際精度(或測試精度)之間,後者纔是咱們想要真正獲得的。
咱們發現圖1爲了達到100%精度使用了3個feature(上網時長、時段、網購金額), 其中分枝「上網時長>1.1h」 很顯然已通過擬合了,這個數據集上A,B也許剛好A 天天上網1.09h, B上網1.05小時,但用上網時間是否是>1.1小時來判斷全部人 的年齡很顯然是有悖常識的;
相對來講圖2的boosting雖然用了兩棵樹 ,但其實只用了2個feature就搞定了,後一個 feature是問答比例,顯然圖2的依據更靠譜。(固然,這裏是LZ故意作的數據,因此才能 靠譜得如此狗血。實際中靠譜不靠譜老是相對的) Boosting的最大好處在於,每一步的 殘差計算其實變相地增大了分錯instance的權重,而已經分對的instance則都趨向於0。 這樣後面的樹就能愈來愈專一那些前面被分錯的instance。 就像咱們作互聯網,老是先解決60%用戶的需求湊合着,再解決35%用戶的需求,最後才關 注那5%人的需求。 這樣就能逐漸把產品作好,由於不一樣類型用戶需求可能徹底不一樣,須要分別獨立分析。 若是反過來作,或者剛上來就必定要作到盡善盡美,每每最終會竹籃打水一場空。
到目前爲止,咱們的確沒有用到求導的Gradient。在當前版本GBDT描述中,的確沒有用 到Gradient,該版本用殘差做爲全局最優的絕對方向,並不須要Gradient求解.
該版本GBDT幾乎可用於全部迴歸問題(線性/非線性),相對logistic regression僅能用於線性迴歸,GBDT的適用面很是廣。亦可用於二分類問題(設定閾值,大於閾值爲正例,反之爲負例)。根據sklearn官網上的說明,對於多分類的數據:
The advantages of GBRT are:
The disadvantages of GBRT are: