對梯度提升樹GBDT最通俗的介紹
本文是小編能找到的對GBDT最通俗的介紹了。
GBDT主要由三個概念組成:Regression Decistion Tree(即DT),Gradient Boosting(即GB),Shrinkage (演算法的一個重要演進分枝,目前大部分原始碼都按該版本實現)。搞定這三個概念後就能明白GBDT是如何工作的,要繼續理解它如何用於搜尋排序則需要額外理解RankNet概念,之後便功德圓滿。下文將逐個碎片介紹,最終把整張圖拼出來。
一、 DT:迴歸樹 Regression Decision Tree
提起決策樹(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),按照該標準分枝得到兩個新節點,用同樣方法繼續分枝直到所有人都被分入性別唯一的葉子節點,或達到預設的終止條件,若最終葉子節點中的性別不唯一,則以多數人的性別作為該葉子節點的性別。
迴歸樹總體流程也是類似,不過在每個節點(不一定是葉子節點)都會得一個預測值,以年齡為例,該預測值等於屬於這個節點的所有人年齡的平均值。分枝時窮舉每一個feature的每個閾值找最好的分割點,但衡量最好的標準不再是最大熵,而是最小化均方差--即(每個人的年齡-預測年齡)^2 的總和 / N,或者說是每個人的預測誤差平方和除以 N。
這很好理解,被預測出錯的人數越多,錯的越離譜,均方差就越大,通過最小化均方差能夠找到最靠譜的分枝依據。
分枝直到每個葉子節點上人的年齡都唯一(這太難了)或者達到預設的終止條件(如葉子個數上限),若最終葉子節點上人的年齡不唯一,則以該節點上所有人的平均年齡做為該葉子節點的預測年齡。
二、 GB:梯度迭代 Gradient Boosting
Boosting,迭代,即通過迭代多棵樹來共同決策。這怎麼實現呢?難道是每棵樹獨立訓練一遍,比如A這個人,第一棵樹認為是10歲,第二棵樹認為是0歲,第三棵樹認為是20歲,我們就取平均值10歲做最終結論?--當然不是!且不說這是投票方法並不是GBDT,只要訓練集不變,獨立訓練三次的三棵樹必定完全相同,這樣做完全沒有意義。
之前說過,GBDT是把所有樹的結論累加起來做最終結論的,所以可以想到每棵樹的結論並不是年齡本身,而是年齡的一個累加量。
GBDT的核心就在於,每一棵樹學的是之前所有樹結論和的殘差,這個殘差就是一個加預測值後能得真實值的累加量。
比如A的真實年齡是18歲,但第一棵樹的預測年齡是12歲,差了6歲(即殘差為6歲)。
那麼在第二棵樹裡我們把A的年齡設為6歲去學習
如果第二棵樹真的能把A分到6歲的葉子節點(殘差為12歲),那累加兩棵樹的結論就是A的真實年齡18歲;
如果第二棵樹的結論是5歲,則A仍然存在1歲的殘差,第三棵樹裡A的年齡就變成1歲,繼續學。
這就是Gradient Boosting在GBDT中的意義,簡單吧。
三、 GBDT工作過程例項
還是年齡預測,簡單起見訓練集只有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的預測值都和真實年齡一致了。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最核心的概念、運算過程講完了!沒錯就是這麼簡單。
不過講到這裡很容易發現三個問題:
1)既然圖1和圖2 最終效果相同,為何還需要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%人的需求,這樣就能逐漸把產品做好,因為不同型別使用者需求可能完全不同,需要分別獨立分析。如果反過來做,或者剛上來就一定要做到盡善盡美,往往最終會竹籃打水一場空。
2)Gradient呢?不是“G”BDT麼?
到目前為止,我們的確沒有用到求導的Gradient。在當前版本GBDT描述中,的確沒有用到Gradient,該版本用殘差作為全域性最優的絕對方向,並不需要Gradient求解。
3)這不是boosting吧?Adaboost可不是這麼定義的。
這是boosting,但不是Adaboost。GBDT不是Adaboost Decistion Tree。就像提到決策樹大家會想起C4.5,提到boost多數人也會想到Adaboost。
Adaboost是另一種boost方法,它按分類對錯,分配不同的weight,計算cost function時使用這些weight,從而讓“錯分的樣本權重越來越大,使它們更被重視”。詳情參見:https://blog.csdn.net/v_july_v/article/details/40718799
Bootstrap也有類似思想,它在每一步迭代時不改變模型本身,也不計算殘差,而是從N個instance訓練集中按一定概率重新抽取N個instance出來(單個instance可以被重複sample),對著這N個新的instance再訓練一輪。由於資料集變了迭代模型訓練結果也不一樣,而一個instance被前面分錯的越厲害,它的概率就被設的越高,這樣就能同樣達到逐步關注被分錯的instance,逐步完善的效果。
Adaboost的方法被實踐證明是一種很好的防止過擬合的方法,但至於為什麼則至今沒從理論上被證明。GBDT也可以在使用殘差的同時引入Bootstrap re-sampling,GBDT多數實現版本中也增加的這個選項,但是否一定使用則有不同看法。
re-sampling一個缺點是它的隨機性,即同樣的資料集合訓練兩遍結果是不一樣的,也就是模型不可穩定復現,這對評估是很大挑戰,比如很難說一個模型變好是因為你選用了更好的feature,還是由於這次sample的隨機因素。
https://blog.csdn.net/w28971023/article/details/8240756
題目來源:
七月線上官網(https://www.julyedu.com/)——面試題庫——面試大題——機器學習 第132題。
梯度提升樹(Gradient Boosting Decision Tree,GBDT)演算法是近年來被提及比較多的一個演算法,這主要得益於其演算法的效能,以及該演算法在各類資料探勘以及機器學習比賽中的卓越表現。為了幫助大家系統地學習機器學習課程的相關知識,我們特意推出了機器學習集訓營系列課程。迄今為止,「機器學習集訓營」已經舉辦了四期,每一期都湧現出了不少優秀offer,特別是上一期很多同學從Java、Android、iOS等傳統IT行業成功轉行轉型轉崗AI拿到年薪三四十萬,部分甚至超過四十萬拿到五十萬。
本第五期,在第四期的基礎上,除了繼續維持“入學測評、直播答疑、佈置作業、階段考試、畢業考核、一對一批改、線上線下結合、CPU&GPU雙雲平臺、組織比賽、面試輔導、就業推薦”十一位一體的教學模式,本期特地推出機器學習工程師聯合認證。且線下在北京、上海、深圳、廣州、杭州、瀋陽、濟南、鄭州、成都的基礎上,新增武漢、西安兩個線下點,十一城同步開營。
此外,本期依然沿用前四期線上線下相結合的授課方式,加強專案實訓的同時引入線下BAT專家面對面、手把手的教學方式;突出BAT級工業專案實戰輔導 + 一對一面試求職輔導,並提供一年GPU雲實驗平臺免費使用,精講面試考點。讓每一位學員不用再為遇到問題沒人解答,缺乏實戰經驗以及簡歷上沒有專案經驗,面試屢屢遭拒而發愁。
本期限150個名額,歷時3個月,10多個BAT級工業專案,保障每一位學員所學更多、效率更高、收穫更大。
機器學習集訓營 第五期 課程詳情可點選文末“閱讀原文”進行檢視,或者加微信客服:julyedukefu_02進行諮詢。
掃碼加客服微信
相關文章
- 一文讀懂:GBDT梯度提升梯度
- 【小白學AI】GBDT梯度提升詳解AI梯度
- 最通俗的機器學習介紹機器學習
- 【機器學習基礎】GBDT--梯度提升樹例項分析完全解讀機器學習梯度
- 機器學習 | 詳解GBDT梯度提升樹原理,看完再也不怕面試了機器學習梯度面試
- 機器學習演算法系列(二十)-梯度提升決策樹演算法(Gradient Boosted Decision Trees / GBDT)機器學習演算法梯度
- ML《整合學習(四)Boosting之迴歸樹、提升樹和GBDT》
- CSS文件流通俗介紹CSS
- 機器學習梯度下降法,最通俗易懂的解釋機器學習梯度
- 通俗地說決策樹演算法(一)基礎概念介紹演算法
- ThunderGBM:快成一道閃電的梯度提升決策樹梯度
- Cart迴歸樹、GBDT、XGBoost
- 這是我見過最通俗易懂的SVD(奇異值分解)演算法介紹演算法
- R:梯度提升器梯度
- LSM樹的不同實現介紹
- 從提升樹到 XGBoost, 原理簡介
- JavaScript中的預解析(變數提升)介紹JavaScript變數
- JavaScript中的預解析(變數提升)介紹!JavaScript變數
- 通俗易懂的生產環境Web應用架構介紹Web應用架構
- tensorboard 視覺化的最詳細介紹ORB視覺化
- 咬文嚼圖式的介紹二叉樹、B樹/B-樹二叉樹
- 淺談樹模型與整合學習-從決策樹到GBDT模型
- 通俗易懂Vuex原始碼導讀0-全域性介紹Vue原始碼
- 決策樹模型(1)總體介紹模型
- 渲染樹與css解析詳細介紹CSS
- Bagging和Boosting的介紹及對比
- AI中有關概率統計的直觀且通俗易懂的圖片介紹AI
- 如何使用 CatBoost 進行快速梯度提升梯度
- 求逆序對(介紹+題目)
- Javascript - 物件對映automapper介紹JavaScript物件APP
- AI中有關機率統計的直觀且通俗易懂的圖片介紹AI
- [翻譯]資料結構——trie樹介紹資料結構
- 通俗易懂的紅黑樹圖解(下)圖解
- Android除錯工具-ADB史上最強介紹Android除錯
- (一)區塊鏈的共識演算法:整體介紹 及 分叉 的通俗講解區塊鏈演算法
- Python入門課程—最詳細的Python庫介紹Python
- 全網最通俗易懂的Kafka入門!Kafka
- 最通俗易懂搞定HashMap的底層原理HashMap