集成方法:渐进梯度回归树GBRT(迭代决策树)
http://blog.csdn.net/pipisorry/article/details/60776803
單決策樹C4.5由于功能太簡單,并且非常容易出現(xiàn)過擬合的現(xiàn)象,于是引申出了許多變種決策樹,就是將單決策樹進行模型組合,形成多決策樹,比較典型的就是迭代決策樹GBRT和隨機森林RF。在最近幾年的paper上,如iccv這種重量級會議,iccv 09年的里面有不少文章都是與Boosting和隨機森林相關的。模型組合+決策樹相關算法有兩種比較基本的形式:隨機森林RF與GBDT,其他比較新的模型組合+決策樹算法都是來自這兩種算法的延伸。首先說明一下,GBRT這個算法有很多名字,但都是同一個算法:GBRT (Gradient BoostRegression Tree) 漸進梯度回歸樹,GBDT (Gradient BoostDecision Tree) 漸進梯度決策樹,MART (MultipleAdditive Regression Tree) 多決策回歸樹,Tree Net決策樹網(wǎng)絡。
GBDT(Gradient?Boosting?Decision?Tree)?又叫?MART(Multiple?Additive?Regression?Tree),是一種迭代的決策樹算法,該算法由多棵決策樹組成,所有樹的結(jié)論累加起來做最終答案。它在被提出之初就和SVM一起被認為是泛化能力(generalization)較強的算法。近些年更因為被用于搜索排序的機器學習模型而引起大家關注。GBRT是回歸樹,不是分類樹(盡管GBDT調(diào)整后也可用于分類但不代表GBDT的樹是分類樹)。其核心就在于,每一棵樹是從之前所有樹的殘差中來學習的。為了防止過擬合,和Adaboosting一樣,也加入了boosting這一項。
GBDT主要由三個概念組成:Regression?Decistion?Tree(即DT),Gradient?Boosting(即GB),Shrinkage?(算法的一個重要演進分枝,目前大部分源碼都按該版本實現(xiàn))。搞定這三個概念后就能明白GBDT是如何工作的,要繼續(xù)理解它如何用于搜索排序則需要額外理解RankNet概念。
Gradient Tree Boosting或Gradient Boosted Regression Trees(GBRT)是一個boosting的泛化表示,它使用了不同的loss函數(shù)。GBRT是精確、現(xiàn)成的過程,用于解決回歸/分類問題。Gradient Tree Boosting模型則用于許多不同的領域:比如:網(wǎng)頁搜索Ranking、ecology等。
GBRT優(yōu)缺點
GBRT的優(yōu)點是:
??? 天然就可處理不同類型的數(shù)據(jù)(=各種各樣的features)
??? 預測能力強
??? 對空間外的異常點處理很健壯(通過健壯的loss函數(shù))
GBRT的缺點是:
??? 擴展性不好,因為boosting天然就是順序執(zhí)行的,很難并行化
回歸樹是如何工作的?
我們以對人的性別判別/年齡預測為例來說明,每個instance都是一個我們已知性別/年齡的人,而feature則包括這個人上網(wǎng)的時長、上網(wǎng)的時段、網(wǎng)購所花的金額等。
??? 分類樹,我們知道C4.5分類樹在每次分枝時,是窮舉每一個feature的每一個閾值,找到使得按照feature<=閾值,和feature>閾值分成的兩個分枝的熵最大的feature和閾值(熵最大的概念可理解成盡可能每個分枝的男女比例都遠離1:1),按照該標準分枝得到兩個新節(jié)點,用同樣方法繼續(xù)分枝直到所有人都被分入性別唯一的葉子節(jié)點,或達到預設的終止條件,若最終葉子節(jié)點中的性別不唯一,則以多數(shù)人的性別作為該葉子節(jié)點的性別。
??? 回歸樹總體流程類似,不過在每個節(jié)點(不一定是葉子節(jié)點)都會得一個預測值,以年齡為例,該預測值等于屬于這個節(jié)點的所有人年齡的平均值{Note: 分裂點最優(yōu)值是分裂點所有x對應y值的均值c,因內(nèi)部最小平方誤差最小[統(tǒng)計學習方法 5.5CART算法]}。分枝時窮舉每一個feature的每個閾值找最好的分割點,但衡量最好的標準不再是最大熵,而是最小化均方差--即(每個人的年齡-預測年齡)^2 的總和 / N,或者說是每個人的預測誤差平方和 除以 N。這很好理解,被預測出錯的人數(shù)越多,錯的越離譜,均方差就越大,通過最小化均方差能夠找到最靠譜的分枝依據(jù)。分枝直到每個葉子節(jié)點上人的年齡都唯一(這太難了)或者達到預設的終止條件(如葉子個數(shù)上限),若最終葉子節(jié)點上人的年齡不唯一,則以該節(jié)點上所有人的平均年齡做為該葉子節(jié)點的預測年齡。
[統(tǒng)計學習方法 5.5CART算法]
算法原理
不是每棵樹獨立訓練
Boosting,迭代,即通過迭代多棵樹來共同決策。這怎么實現(xiàn)呢?難道是每棵樹獨立訓練一遍,比如A這個人,第一棵樹認為是10歲,第二棵樹認為是0歲,第三棵樹認為是20歲,我們就取平均值10歲做最終結(jié)論?--當然不是!且不說這是投票方法并不是GBDT,只要訓練集不變,獨立訓練三次的三棵樹必定完全相同,這樣做完全沒有意義。之前說過,GBDT是把所有樹的結(jié)論累加起來做最終結(jié)論的,所以可以想到每棵樹的結(jié)論并不是年齡本身,而是年齡的一個累加量。
GBDT的核心就在于,每一棵樹學的是之前所有樹結(jié)論和的殘差,這個殘差就是一個加預測值后能得真實值的累加量。比如A的真實年齡是18歲,但第一棵樹的預測年齡是12歲,差了6歲,即殘差為6歲。那么在第二棵樹里我們把A的年齡設為6歲去學習,如果第二棵樹真的能把A分到6歲的葉子節(jié)點,那累加兩棵樹的結(jié)論就是A的真實年齡;如果第二棵樹的結(jié)論是5歲,則A仍然存在1歲的殘差,第三棵樹里A的年齡就變成1歲,繼續(xù)學。這就是Gradient Boosting在GBDT中的意義。
殘差提升
算法流程解釋1
0.給定一個初始值
1.建立M棵決策樹(迭代M次){Note: 每次迭代生成一棵決策樹}
2.對函數(shù)估計值F(x)進行Logistic變換(Note:只是歸一化而已)
3.對于K各分類進行下面的操作(其實這個for循環(huán)也可以理解為向量的操作,每個樣本點xi都對應了K種可能的分類yi,所以yi,F(xi),p(xi)都是一個K維向量)
4.求得殘差減少的梯度方向
5.根據(jù)每個樣本點x,與其殘差減少的梯度方向,得到一棵由J個葉子節(jié)點組成的決策樹
6.當決策樹建立完成后,通過這個公式,可以得到每個葉子節(jié)點的增益(這個增益在預測時候用的)
???????每個增益的組成其實也是一個K維向量,表示如果在決策樹預測的過程中,如果某個樣本點掉入了這個葉子節(jié)點,則其對應的K個分類的值是多少。比如GBDT得到了三棵決策樹,一個樣本點在預測的時候,也會掉入3個葉子節(jié)點上,其增益分別為(假設為3分類問題):
(0.5, 0.8, 0.1), (0.2, 0.6, 0.3), (0.4, .0.3, 0.3),那么這樣最終得到的分類為第二個,因為選擇分類2的決策樹是最多的。
7.將當前得到的決策樹與之前的那些決策樹合并起來,作為一個新的模型(跟6中的例子差不多)
算法流程解釋2
梯度提升
不同于前面的殘差提升算法,這里使用loss函數(shù)的梯度近似殘差(對于平方loss其實就是殘差,一般loss函數(shù)就是殘差的近似)。解決殘差計算困難問題。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
GBRT示例1(殘差)
? ? ? ? 年齡預測,簡單起見訓練集只有4個人,A,B,C,D,他們的年齡分別是14,16,24,26。其中A、B分別是高一和高三學生;C,D分別是應屆畢業(yè)生和工作兩年的員工。如果是用一棵傳統(tǒng)的回歸決策樹來訓練,會得到如下圖1所示結(jié)果:
? ? ? ? 現(xiàn)在我們使用GBDT來做這件事,由于數(shù)據(jù)太少,我們限定葉子節(jié)點做多有兩個,即每棵樹只有一個分枝,并且限定只學兩棵樹。我們會得到如下圖2所示結(jié)果:?
? ? ? ? 在第一棵樹分枝和圖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的原值,到第二棵樹去學習,如果我們的預測值和它們的殘差相等,則只需把第二棵樹的結(jié)論累加到第一棵樹上就能得到真實年齡了。這里的數(shù)據(jù)顯然是我可以做的,第二棵樹只有兩個值1和-1,直接分成兩個節(jié)點。此時所有人的殘差都是0,即每個人都得到了真實的預測值。換句話說,現(xiàn)在A,B,C,D的預測值都和真實年齡一致了。
A:?14歲高一學生,購物較少,經(jīng)常問學長問題;預測年齡A?=?15?–?1?=?14
B:?16歲高三學生;購物較少,經(jīng)常被學弟問問題;預測年齡B?=?15?+?1?=?16
C:?24歲應屆畢業(yè)生;購物較多,經(jīng)常問師兄問題;預測年齡C?=?25?–?1?=?24
D:?26歲工作兩年員工;購物較多,經(jīng)常被師弟問問題;預測年齡D?=?25?+?1?=?26?
問題
?1)既然圖1和圖2 最終效果相同,為何還需要GBDT呢?
??? 答案是過擬合。過擬合是指為了讓訓練集精度更高,學到了很多”僅在訓練集上成立的規(guī)律“,導致?lián)Q一個數(shù)據(jù)集當前規(guī)律就不適用了。其實只要允許一棵樹的葉子節(jié)點足夠多,訓練集總是能訓練到100%準確率的(大不了最后一個葉子上只有一個instance)。在訓練精度和實際精度(或測試精度)之間,后者才是我們想要真正得到的。
??? 我們發(fā)現(xiàn)圖1為了達到100%精度使用了3個feature(上網(wǎng)時長、時段、網(wǎng)購金額),其中分枝“上網(wǎng)時長>1.1h” 很顯然已經(jīng)過擬合了,這個數(shù)據(jù)集上A,B也許恰好A每天上網(wǎng)1.09h, B上網(wǎng)1.05小時,但用上網(wǎng)時間是不是>1.1小時來判斷所有人的年齡很顯然是有悖常識的;
??? 相對來說圖2的boosting雖然用了兩棵樹 ,但其實只用了2個feature就搞定了,后一個feature是問答比例,顯然圖2的依據(jù)更靠譜。(當然,這里是故意做的數(shù)據(jù),所以才能靠譜得如此) Boosting的最大好處在于,每一步的殘差計算其實變相地增大了分錯instance的權重,而已經(jīng)分對的instance則都趨向于0。這樣后面的樹就能越來越專注那些前面被分錯的instance。就像我們做互聯(lián)網(wǎng),總是先解決60%用戶的需求湊合著,再解決35%用戶的需求,最后才關注那5%人的需求,這樣就能逐漸把產(chǎn)品做好,因為不同類型用戶需求可能完全不同,需要分別獨立分析。
2)Gradient呢?不是“G”BDT么?
?到目前為止,我們的確沒有用到求導的Gradient。在當前版本GBDT描述中,的確沒有用到Gradient,該版本用殘差作為全局最優(yōu)的絕對方向(lz可能不知道具體步長吧?),并不需要Gradient求解。
那么哪里體現(xiàn)了Gradient呢?其實回到第一棵樹結(jié)束時想一想,無論此時的cost?function是什么,是均方差還是均差,只要它以誤差作為衡量標準,殘差向量(-1,?1,?-1,?1)都是它的全局最優(yōu)方向,這就是Gradient。
lz補充一句,均方差的梯度不就是殘差嗎,這就是梯度!(其它的loss函數(shù)就不一定了,但是殘差向量總是全局最優(yōu)的,梯度一般都是殘差的近似)
?3)這是boosting?Adaboost?
這是boosting,但不是Adaboost。GBDT不是Adaboost Decistion Tree。就像提到?jīng)Q策樹大家會想起C4.5,提到boost多數(shù)人也會想到Adaboost。Adaboost是另一種boost方法,它按分類對錯,分配不同的weight,計算cost function時使用這些weight,從而讓“錯分的樣本權重越來越大,使它們更被重視”。Bootstrap也有類似思想,它在每一步迭代時不改變模型本身,也不計算殘差,而是從N個instance訓練集中按一定概率重新抽取N個instance出來(單個instance可以被重復sample),對著這N個新的instance再訓練一輪。由于數(shù)據(jù)集變了迭代模型訓練結(jié)果也不一樣,而一個instance被前面分錯的越厲害,它的概率就被設的越高,這樣就能同樣達到逐步關注被分錯的instance,逐步完善的效果。Adaboost的方法被實踐證明是一種很好的防止過擬合的方法,但至于為什么至今沒從理論上被證明。GBDT也可以在使用殘差的同時引入Bootstrap re-sampling,GBDT多數(shù)實現(xiàn)版本中也增加的這個選項,但是否一定使用則有不同看法。re-sampling一個缺點是它的隨機性,即同樣的數(shù)據(jù)集合訓練兩遍結(jié)果是不一樣的,也就是模型不可穩(wěn)定復現(xiàn),這對評估是很大挑戰(zhàn),比如很難說一個模型變好是因為你選用了更好的feature,還是由于這次sample的隨機因素。
GBRT示例2(殘差)
選取回歸樹的分界點建立回歸樹
使用殘差繼續(xù)訓練新的回歸樹
GBRT適用范圍
??????? 該版本的GBRT幾乎可用于所有的回歸問題(線性/非線性),相對logistic regression僅能用于線性回歸,GBRT的適用面非常廣。亦可用于二分類問題(設定閾值,大于閾值為正例,反之為負例)。
搜索引擎排序應用RankNet
??????? 搜索排序關注各個doc的順序而不是絕對值,所以需要一個新的cost function,而RankNet基本就是在定義這個cost function,它可以兼容不同的算法(GBDT、神經(jīng)網(wǎng)絡...)。
??????? 實際的搜索排序使用的是Lambda MART算法,必須指出的是由于這里要使用排序需要的cost function,LambdaMART迭代用的并不是殘差。Lambda在這里充當替代殘差的計算方法,它使用了一種類似Gradient*步長模擬殘差的方法。這里的MART在求解方法上和之前說的殘差略有不同,其區(qū)別描述見這里。
???????? 搜索排序也需要訓練集,但多數(shù)用人工標注實現(xiàn),即對每個(query, doc)pair給定一個分值(如1, 2, 3, 4),分值越高越相關,越應該排到前面。RankNet就是基于此制定了一個學習誤差衡量方法,即cost function。RankNet對任意兩個文檔A,B,通過它們的人工標注分差,用sigmoid函數(shù)估計兩者順序和逆序的概率P1。然后同理用機器學習到的分差計算概率P2(sigmoid的好處在于它允許機器學習得到的分值是任意實數(shù)值,只要它們的分差和標準分的分差一致,P2就趨近于P1)。這時利用P1和P2求的兩者的交叉熵,該交叉熵就是cost function。
??????? 有了cost function,可以求導求Gradient,Gradient即每個文檔得分的一個下降方向組成的N維向量,N為文檔個數(shù)(應該說是query-doc pair個數(shù))。這里僅僅是把”求殘差“的邏輯替換為”求梯度“。每個樣本通過Shrinkage累加都會得到一個最終得分,直接按分數(shù)從大到小排序就可以了。
[【機器學習】迭代決策樹GBRT(漸進梯度回歸樹)]
皮皮blog
python sklearn實現(xiàn)
分類
sklearn.ensemble.GradientBoostingClassifier(loss='deviance', learning_rate=0.1, n_estimators=100, subsample=1.0, criterion='friedman_mse', min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_split=1e-07, init=None, random_state=None, max_features=None, verbose=0, max_leaf_nodes=None, warm_start=False, presort='auto')
超過2個分類時,需要在每次迭代時引入n_classes的回歸樹,因此,總的索引樹為(n_classes * n_estimators)。對于分類數(shù)目很多的情況,強烈推薦你使用 RandomForestClassifier 來替代GradientBoostingClassifier
回歸
sklearn.ensemble.GradientBoostingRegressor(loss='ls', learning_rate=0.1, n_estimators=100, subsample=1.0, criterion='friedman_mse', min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_split=1e-07, init=None, random_state=None, max_features=None, alpha=0.9, verbose=0, max_leaf_nodes=None, warm_start=False, presort='auto')
參數(shù):
n_estimators : int (default=100) 迭代次數(shù),也就是弱學習器的個數(shù)
The number of boosting stages to perform. Gradient boostingis fairly robust to over-fitting so a large number usuallyresults in better performance.
The plot on the left shows the train and test error at each iteration.The train error at each iteration is stored in thetrain_score_ attributeof the gradient boosting model. The test error at each iterations can be obtainedvia the staged_predict method which returns agenerator that yields the predictions at each stage. Plots like these can be usedto determine the optimal number of trees (i.e. n_estimators) by early stopping.
控制樹的size
回歸樹的基礎學習器(base learners)的size,定義了可以被GB模型捕獲的各種交互的level。通常,一棵樹的深度為h,可以捕獲h階的影響因子(interactions)。控制各個回歸樹的size有兩種方法。
1 指定max_depth=h,那么將會長成深度為h的完整二元樹。這樣的樹至多有2^h個葉子,以及2^h-1中間節(jié)點。
2 另一種方法:你可以通過指定葉子節(jié)點的數(shù)目(max_leaf_nodes)來控制樹的size。這種情況下,樹將使用最優(yōu)搜索(best-first search)的方式生成,并以最高不純度(impurity)的方式展開。如果樹的max_leaf_nodes=k,表示具有k-1個分割節(jié)點,可以建模最高(max_leaf_nodes-1)階的interactions。
我們發(fā)現(xiàn),max_leaf_nodes=k 與 max_depth=k-1 進行比較,訓練會更快,只會增大一點點的訓練誤差(training error)。參數(shù)max_leaf_nodes對應于gradient boosting中的變量J,與R提供的gbm包的參數(shù)interaction.depth相關,為:max_leaf_nodes == interaction.depth + 1。
數(shù)學公式Mathematical formulation
GBRT considers additive models of the following form:
where are the basis functions which are usually called weak learners in the context of boosting. Gradient Tree Boosting uses decision trees of fixed size as weak learners. Decision trees have a number of abilities that make them valuable for boosting, namely the ability to handle data of mixed type and the ability to model complex functions.
Similar to other boosting algorithms GBRT builds the additive model in a forward stage wise fashion: 前向分步算法
At each stage the decision tree is chosen to minimize the loss function given the current model and its fit
???
Note: 應該是F_{m-1}(x_i) + h(x)吧,殘差為yi - (F_{m-1}(x_i) + h(x))訓練下一個回歸樹
The initial model is problem specific, for least-squares regression one usually chooses the mean of the target values.
Note:
The initial model can also be specified via the init argument. The passed object has to implement fit and predict.
Gradient Boosting attempts to solve this minimization problem numerically via steepest descent: The steepest descent direction is the negative gradient of the loss function evaluated at the current model which can be calculated for any differentiable loss function:
??? Note: 這里使用的是殘差的近似--梯度來計算殘差的。
Where the step length is chosen using line search:
The algorithms for regression and classification only differ in the concrete loss function used.
loss函數(shù)
回歸
- 最小二乘法Least squares(’ls’):最自然的選擇,因為它的計算很簡單。初始模型通過target的平均值來給出。
- 最小絕對偏差Least absolute deviation (’lad’):一個健壯的loss函數(shù),用于回歸。初始模型通過target的中值來給出。
- Huber (‘huber’): Another robust loss function that combinesleast squares and least absolute deviation; use alpha tocontrol the sensitivity with regards to outliers (see [F2001] formore details).
- Quantile (‘quantile’):A loss function for quantile regression.Use 0 < alpha < 1 to specify the quantile. This loss functioncan be used to create prediction intervals(see Prediction Intervals for Gradient Boosting Regression).
分類
- Binomial deviance ('deviance'): The negative binomiallog-likelihood loss function for binary classification (providesprobability estimates). The initial model is given by thelog odds-ratio.
- Multinomial deviance ('deviance'): The negative multinomiallog-likelihood loss function for multi-class classification withn_classes mutually exclusive classes. It providesprobability estimates. The initial model is given by theprior probability of each class. At each iteration n_classesregression trees have to be constructed which makes GBRT ratherinefficient for data sets with a large number of classes.
- Exponential loss ('exponential'): The same loss functionas AdaBoostClassifier. Less robust to mislabeledexamples than 'deviance'; can only be used for binaryclassification.
正則化
縮減Shrinkage
?Shrinkage(縮減)的思想認為,每次走一小步逐漸逼近結(jié)果的效果,要比每次邁一大步很快逼近結(jié)果的方式更容易避免過擬合。即它不完全信任每一個棵殘差樹,它認為每棵樹只學到了真理的一小部分,累加的時候只累加一小部分,通過多學幾棵樹彌補不足。用方程來看更清晰,即
沒用Shrinkage時:(yi表示第i棵樹上y的預測值, y(1~i)表示前i棵樹y的綜合預測值)
y(i+1) = 殘差(y1~yi), 其中: 殘差(y1~yi) =? y真實值 - y(1 ~ i)
y(1 ~ i) = SUM(y1, ..., yi)
Shrinkage不改變第一個方程,只把第二個方程改為:
y(1 ~ i) = y(1 ~ i-1) + step * yi
即Shrinkage仍然以殘差作為學習目標,但對于殘差學習出來的結(jié)果,只累加一小部分(step*殘差)逐步逼近目標,step一般都比較小,如0.01~0.001(注意該step非gradient的step),導致各個樹的殘差是漸變的而不是陡變的。直覺上這也很好理解,不像直接用殘差一步修復誤差,而是只修復一點點,其實就是把大步切成了很多小步。本質(zhì)上,Shrinkage為每棵樹設置了一個weight,累加時要乘以這個weight,但和Gradient并沒有關系。這個weight就是step。就像Adaboost一樣,Shrinkage能減少過擬合發(fā)生也是經(jīng)驗證明的,目前還沒有看到從理論的證明。
[f2001]提出了一種簡單的正則化策略,它通過一個因子v將每個弱學習器的貢獻進行歸一化(為什么學習率v能將每個弱學習器的貢獻進行歸一化?)。
參數(shù)v也被稱為學習率(learning rate),因為它可以對梯度下降的步長進行調(diào)整;它可以通過learning_rate參數(shù)進行設定。
參數(shù)learning_rate會強烈影響到參數(shù)n_estimators(即弱學習器個數(shù))。learning_rate的值越小,就需要越多的弱學習器數(shù)來維持一個恒定的訓練誤差(training error)常量。經(jīng)驗上,推薦小一點的learning_rate會對測試誤差(test error)更好。[HTF2009]推薦將learning_rate設置為一個小的常數(shù)(e.g. learning_rate <= 0.1),并通過early stopping機制來選擇n_estimators。我們可以在[R2007]中看到更多關于learning_rate與n_estimators的關系。
子抽樣Subsampling
[F1999]提出了隨機梯度boosting,它將bagging(boostrap averaging)與GradientBoost相結(jié)合。在每次迭代時,基礎分類器(base classifer)都在訓練數(shù)據(jù)的一個子抽樣集中進行訓練。子抽樣以放回抽樣。subsample的典型值為:0.5。
下圖展示了shrinkage的效果,并在模型的擬合優(yōu)度(Goodness of Fit)上進行子抽樣(subsampling)。我們可以很清楚看到:shrinkage的效果比no-shrinkage的要好。
減小variance策略1:使用shrinkage的子抽樣可以進一步提升模型準確率。而不帶shinkage的子抽樣效果差些。
減小variance策略2:對features進行子抽樣(類比于RandomForestClassifier中的隨機split)。子抽樣features的數(shù)目可以通過max_features參數(shù)進行控制。注意:使用小的max_features值可以極大地降低運行時長。
out-of-bag估計
隨機梯度boosting允許計算測試偏差(test deviance)的out-of-bag估計,通過計算沒有落在bootstrap樣本中的其它樣本的偏差改進(i.e. out-of-bag示例)。該提升存在屬性oob_improvement_中。oob_improvement_[i]表示在添加第i步到當前預測中時,OOB樣本中的loss的提升。OOB估計可以被用于模型選擇,例如:決定最優(yōu)的迭代數(shù)。OOB估計通常很少用,我們推薦你使用交叉驗證(cross-validation),除非當cross-validation十分耗時的時候。
示例:[Gradient Boosting regularization; Gradient Boosting Out-of-Bag estimates; OOB Errors for Random Forests]
內(nèi)省Interpretation
單顆決策樹可以通過內(nèi)省進行可視化樹結(jié)構(gòu)。然而,GradientBoost模型由成百的回歸樹組成,不能輕易地通過對各棵決策樹進行內(nèi)省來進行可視化。幸運的是,已經(jīng)提出了許多技術來歸納和內(nèi)省GradientBoost模型。
feature重要程度
通常,features對于target的結(jié)果預期的貢獻不是均等的;在許多情況下,大多數(shù)features都是不相關的。當內(nèi)省一個模型時,第一個問題通常是:在預測我們的target時,哪些features對結(jié)果預測來說是重要的。
單棵決策樹天生就可以通過選擇合適的split節(jié)點進行特征選擇(feature selection)。該信息可以用于計算每個feature的重要性;基本思想是:如果一個feature經(jīng)常用在樹的split節(jié)點上,那么它就越重要。這個重要性的概率可以延伸到?jīng)Q策樹家族ensembles方法上,通過對每棵樹的feature求簡單平均即可。
GradientBoosting模型的重要性分值,可以通過feature_importances_屬性來訪問:
>>> from sklearn.datasets import make_hastie_10_2 >>> from sklearn.ensemble import GradientBoostingClassifier>>> X, y = make_hastie_10_2(random_state=0) >>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, ... max_depth=1, random_state=0).fit(X, y) >>> clf.feature_importances_ array([ 0.11, 0.1 , 0.11, ...示例:Gradient Boosting regression
局部依賴
局部依賴圖(Partial dependence plots :PDP)展示了target結(jié)果與一些目標特征(target feature)之間的依賴;邊緣化(marginalizing)所有其它特征(’complement’ features)。另外,我們可以內(nèi)省這兩者的局部依賴性。
由于人的認知的有限,目標特征的size必須設置的小些(通常:1或2),目標特征可以在最重要的特征當中進行選擇。
下圖展示了關于California居住情況的、4個one-way和一個two-way的局部依賴圖示例:
one-way的PDP圖告訴我們,target結(jié)果與target特征之間的相互關系(e.g. 線性/非線性)。左上圖展示了中等收入(median income)在房價中位數(shù)(median house price)上的分布;我們可以看到它們間存在線性關系。???? 帶有兩個target特征的PDP,展示了和兩個特征的相關關系。例如:上圖最后一張小圖中,兩個變量的PDP展示了房價中位數(shù)(median house price)與房齡(house age)和平均家庭成員數(shù)(avg. occupants)間的關系。我們可以看到兩個特征間的關系:對于AveOccup>2的,房價與房齡(HouseAge)幾乎完全獨立。而AveOccup<2的,房價則強烈依賴年齡。
partial_dependence模塊
提供了一個很方便的函數(shù):plot_partial_dependence 來創(chuàng)建one-way以及two-way的局部依賴圖。下例,我們展示了如何創(chuàng)建一個PDP:兩個two-way的PDP,feature為0和1,以及一個在這兩個feature之間的two-way的PDP:
>>> from sklearn.datasets import make_hastie_10_2 >>> from sklearn.ensemble import GradientBoostingClassifier >>> from sklearn.ensemble.partial_dependence import plot_partial_dependence>>> X, y = make_hastie_10_2(random_state=0) >>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0).fit(X, y) >>> features = [0, 1, (0, 1)] >>> fig, axs = plot_partial_dependence(clf, X, features)對于多分類的模塊,我們需要設置類的label,通過label參數(shù)來創(chuàng)建PDP:
>>> from sklearn.datasets import load_iris >>> iris = load_iris() >>> mc_clf = GradientBoostingClassifier(n_estimators=10, max_depth=1).fit(iris.data, iris.target) >>> features = [3, 2, (3, 2)] >>> fig, axs = plot_partial_dependence(mc_clf, X, features, label=0)如果你需要一個局部依賴函數(shù)的原始值,而非你使用partial_dependence函數(shù)繪制的圖:
>>> from sklearn.ensemble.partial_dependence import partial_dependence>>> pdp, axes = partial_dependence(clf, [0], X=X) >>> pdp array([[ 2.46643157, 2.46643157, ... >>> axes [array([-1.62497054, -1.59201391, ...該函數(shù)需要兩個參數(shù):
- grid: 它控制著要評估的PDP的target特征的值
- X: 它提供了一個很方便的模式來從訓練數(shù)據(jù)集上自動創(chuàng)建grid。
返回值axis:
-如果給定了X,那么通過這個函數(shù)返回的axes給出了每個target特征的axis.
對于在grid上的target特征的每個值,PDP函數(shù)需要邊緣化樹的不重要特征的預測。在決策樹中,這個函數(shù)可以用來評估有效性,不需要訓練集數(shù)據(jù)。對于每個grid點,會執(zhí)行一棵加權樹的遍歷:如果一個split節(jié)點涉及到’target’特征,那么接下去的左、右分枝,每個分枝都會通過根據(jù)進入該分枝的訓練樣本的fraction進行加權。最終,通過訪問所有葉子的平均加權得到局部依賴。對于樹的ensemble來說,每棵樹的結(jié)果都會被平均。
注意點:
- 帶有l(wèi)oss=’deviance’的分類,它的target結(jié)果為logit(p)
- 初始化模型后,target結(jié)果的預測越精確;PDP圖不會包含在init模型中
示例:Partial Dependence Plots
from: http://blog.csdn.net/pipisorry/article/details/60776803
ref: [Sklearn: Gradient Tree Boosting]*
[sklearn中的gbt(gbdt/gbrt)]*
[GBDT(MART) 迭代決策樹入門教程 | 簡介 ]*
[統(tǒng)計學習方法 8.4提升樹]
[Ensemble methods]
[Boosting?Decision?Tree入門教程 http://www.schonlau.net/publication/05stata_boosting.pdf]
[LambdaMART用于搜索排序入門教程?http://research.microsoft.com/pubs/132652/MSR-TR-2010-82.pdf]
總結(jié)
以上是生活随笔為你收集整理的集成方法:渐进梯度回归树GBRT(迭代决策树)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: E001检测到您的环境不支持HTML5,
- 下一篇: 删除计算机中的云u盘,win10系统删除