1. 程式人生 > >GBDT:殘差與梯度;以及相同樣本模型結果不同的原因

GBDT:殘差與梯度;以及相同樣本模型結果不同的原因

我的問題:

1、為什麼決策樹的損失函式的梯度值可以直接有y-f(x)計算出來,即不用去計算像線性迴歸即邏輯迴歸的計算每個引數的梯度下降一樣,如常用的theta(i) := theta(i)-alpha* (J(theta)對theta(i)),theta(j) := theta(j)-alpha* (J(theta)對theta(j))的偏導。此處注意要更新每個引數值之後再去用每個更新後的theta(i)去更新整個損失函式,而不是每更新一個theta(i)就去更新整體的損失函式式。

這篇博文對此有詳細的數學解釋,在後記部分,主要是由於決策樹的構建可以得到損失函式的預測值。這個有待詳細驗證。不過是一個思考方向。

通過本文不難發現其實 GBDT 與邏輯迴歸的本質差別只在於 h 的不同。如果 h函式中的 x 為決策樹,預測值通過決策樹預測得到,那就是 GBDT;如果將 h 中的x變為一個權重向量,預測值為x與d的內積,則演算法就變成了邏輯迴歸(LR)

2、GBDT所謂殘差版本與梯度版本有什麼區別?隨機梯度下降是否可運用於GBDT?sklearn中的GBDTRegression演算法除了樣本處可以做隨機抽樣,在確定樣本之後的演算法環節,哪些做了隨機處理?為什麼在給定一樣的引數,如學習率等得情況下,兩次 

pipeline fit出來的結果和clf fit出來的結果不一樣?

params = {'n_estimators': 500, 'max_depth': 4, 'min_samples_split': 2,
        'learning_rate': 0.01, 'loss': 'ls'}


clf = ensemble.GradientBoostingRegressor(**params)

clf.fit(X_train, y_train)

pipeline = PMMLPipeline([
    ("gbdtgressor", GradientBoostingRegressor(**params))
])

pipeline.fit(X_train],y_train)

(1)殘差版本 
  殘差其實就是真實值和預測值之間的差值,在學習的過程中,首先學習一顆迴歸樹,然後將“真實值-預測值”得到殘差,再把殘差作為一個學習目標,學習下一棵迴歸樹,依次類推,直到殘差小於某個接近0的閥值或迴歸樹數目達到某一閥值。其核心思想是每輪通過擬合殘差來降低損失函式。 
  總的來說,第一棵樹是正常的,之後所有的樹的決策全是由殘差來決定。

(2)梯度版本 
  與殘差版本把GBDT說成一個殘差迭代樹,認為每一棵迴歸樹都在學習前N-1棵樹的殘差不同,Gradient版本把GBDT說成一個梯度迭代樹,使用梯度下降法求解,認為每一棵迴歸樹在學習前N-1棵樹的梯度下降值。總的來說兩者相同之處在於,都是迭代迴歸樹,都是累加每顆樹結果作為最終結果(Multiple Additive Regression Tree),每棵樹都在學習前N-1棵樹尚存的不足,從總體流程和輸入輸出上兩者是沒有區別的; 
  兩者的不同主要在於每步迭代時,是否使用Gradient作為求解方法。前者不用Gradient而是用殘差—-殘差是全域性最優值,Gradient是區域性最優方向*步長,即前者每一步都在試圖讓結果變成最好,後者則每步試圖讓結果更好一點。 
  兩者優缺點。看起來前者更科學一點–有絕對最優方向不學,為什麼捨近求遠去估計一個區域性最優方向呢?原因在於靈活性。前者最大問題是,由於它依賴殘差,cost function一般固定為反映殘差的均方差,因此很難處理純迴歸問題之外的問題。而後者求解方法為梯度下降,只要可求導的cost function都可以使用。 

上段引用參考部落格: 

https://blog.csdn.net/shenxiaoming77/article/details/62045963

gbdt通過經驗極小化來確定下一個弱分類器的引數,具體化一點就是損失函式的選擇,當損失函式是平房損失函式時,梯度值就是殘差。,利用損失函式的負梯度在當前模型的值作為迴歸問題提升樹演算法中的殘差的近似值取擬合一個迴歸樹。gdbt每輪迭代的時候,都去擬合損失函式在當前模型下的負梯度。

The features are always randomly permuted at each split. Therefore,

the best found split may vary, even with the same training data and

``max_features=n_features``, if the improvement of the criterion is

identical for several splits enumerated during the search of the best

split. To obtain a deterministic behaviour during fitting,

``random_state`` has to be fixed.

上面這段引用是sklearn的BaseDecisionTree類中的註釋,random_state這個引數設定了隨機值。也就是說決策樹在尋找最優劃分特徵的時候不是尋找的最優解,而是在考慮計算量的情況下選取的貪心解,劃分特徵時沒有遍歷所有的特徵,所有的特徵可劃分值去計算損失函式,如mse,而是隨機地選取了特徵來劃分。

在sklearn的記錄文件裡是這麼寫的,考慮到數值特徵的存在,訓練一個最優的決策樹是NP-complete。因此比較實際的做法是努力去找一個比較優的,而不是最優的。比如用貪婪演算法,隨機地從一些特徵開始建立次優化的決策樹,再從這些樹中選擇最好的,這樣的樹能達到較優。

  • 在多方面效能最優和簡單化概念的要求下,學習一棵最優決策樹通常是一個NP難問題。因此,實際的決策樹學習演算法是基於啟發式演算法,例如在每個節點進 行區域性最優決策的貪心演算法。這樣的演算法不能保證返回全域性最優決策樹。這個問題可以通過整合學習來訓練多棵決策樹來緩解,這多棵決策樹一般通過對特徵和樣本有放回的隨機取樣來生成。

參考:http://sklearn.apachecn.org/cn/0.19.0/modules/tree.html

為什麼是NP難呢?因為每個節點得劃分,比如使用mse,都是選取當前的最優解,但是下一個節點劃分時候的最優解可能和上一個節點的非最優解匹配的時候才是全域性最優的。