1. 程式人生 > >樹模型的一些理解(從決策樹到GBDT)

樹模型的一些理解(從決策樹到GBDT)

1.決策樹

  • 基本流程:

整體是一個遞迴的過程,返回條件有三種:
當前結點中所有樣本的類別都為c,返回值為c;
當前結點中樣本集合為空,此時返回父結點中類別數最多的類。把父節點的樣本分佈作為先驗
當前結點中樣本的屬性集合為空,或者所有樣本屬性取值相同,將當前結點標記為葉節點,返回樣本最多的類別。利用樣本的後驗分佈
對當前結點,從屬性集合A中選擇最優劃分屬性a
對每一個屬性a的取值,都生成一個結點
如果結點為空,將分支結點標記為葉結點,類別標記為D中樣本最多的類
如果不為空,遞迴進行上述過程。

  • 劃分選擇:
    • 基於資訊增益,對應ID3演算法。選擇資訊增益最大的屬性值
    • 基於資訊增益比,對應C4.5演算法。基於資訊增益傾向於選擇取值多的屬性,所以提出資訊增益比。但是資訊增益比又傾向於選擇取值少的屬性,為了平衡,在進行屬性劃分的時候,先選出一些資訊增益大的屬性集合,再從中選擇資訊增益比比較大的。
    • 基於基尼指數,對應CART演算法。選擇基尼指數小的
  • 剪枝處理:防止過擬合

    • 預剪枝:每個結點在劃分的時候的都先進行估計,能夠帶來效能的提升,如果不能,就不劃分;
      • 優點:使得很多分枝都沒有展開,降低過擬合風險,而且減少了訓練時間;
      • 缺點:有些分支可能當前劃分不能帶來效能提升,但其基礎上的後續劃分可以,預剪枝杜絕了這種展開,有可能欠擬合。
    • 後剪枝:先生成一個完整的樹,再自底向上對非葉結點進行考察,將該結點對應的子樹替換為葉結點能否帶來效能的提升,如果能則將子樹替換為葉結點。

      • 優點:欠擬合風險小,與預剪枝相比保留了更多的分枝,泛化效能優於預剪枝,欠擬合風險小。

      • 缺點:計算開銷大

  • 連續與缺失值處理

    • 連續值處理
      • 連續值離散化,最簡單的是二分法——C4.5
    • 缺失值處理 解決兩個問題:

      • 屬性值缺失的情況下如何進行劃分屬性的選擇——-給樣本賦予權重

      • 選好了劃分屬性,樣本在在該屬性值上缺失,如何對樣本進行劃分——–將樣本同時劃入所有子結點,並更改權值

  • 多變數決策時:

對於普通的決策樹,每次都是沿著軸劃分
多變數決策樹,可以產生斜的劃分邊界

2.隨機森林

  • Bagging方法
  • 建樹的時候對樣本進行有放回取樣(Bootstrap),由極限,這樣大概會有30%多的資料從未被採到過,可以用來做包外估計———–行取樣,樣本層面的隨機性
  • 在選擇屬性進行劃分時,先隨機選擇k個屬性,從這裡選擇最優的,減少計算量,增加隨機性——–列取樣,屬性層面的隨機性
  • 取樣之後建樹的過程是完全分裂,最後不用進行剪枝。剪枝策略是用來防止過擬合的,但這裡用到了行抽樣,在一定程度上預防了過擬合,所以可以不用進行剪枝的操作。
  • 隨機森林可以生成一個相似性矩陣,用於度量樣本之間的相似性。構造過程:統計樣本i和樣本j出現在同一個葉子結點的次數,除以隨機森林中樹的個數
  • 可以得到特徵的重要性:
    • 對隨機森林中的每一棵樹,利用包外資料計算誤差記為Error1;
      依次對包外資料的屬性x,加入隨機誤差,再計算每棵樹的誤差記為Error2; 計算 ( E r r o r 2 E r r o r 1 ) N ,這個數值越大,說明改變屬性值x之後對模型精度的影響就越大,那麼這個屬性也就越重要。
  • 從偏差方差分解的角度,bagging關注的是降低方差,對於不剪枝的決策樹、神經網路等易受樣本影響的模型效果更為明顯。
  • 結合策略:
    • 平均/加權平均
    • 投票/加權投票
    • 學習法(Stacking):也是一種重要的整合方法:初級學習器+次級學習器,次級學習器的訓練資料是由初級學習器的輸出組成的,為了防止過擬合,用的不是初級學習器訓練集的輸出,而是通過交叉驗證的方法,用驗證集產生的結果作為輸入去訓練次級學習器。當初級學習器的輸出為類概率作為次級學習器的輸入時,效果比較好。

3.Adaboost

  • Boosting方法的代表
  • 整體思路:先從初始訓練集訓練出一個基學習器,根據基學習器的表現對訓練樣本分佈進行調整,提高之前被分錯的樣本的權重,然後基於調整後的樣本分佈繼續訓練出下一個學習器,如此重複,直到學習器的數目達到設定值。最終將這T個學習器進行加權結合。
  • y_i \in {-1,+1}
  • 兩個關鍵點:
    • 樣本的權值分佈怎麼改變(小藍書)p139
    • 基學習器的權重怎麼設定
  • 最終得到的組合f(x),值的符號代表所屬的類別,絕對值的大小代表分類的確信度。
  • 推導
    • 模型為加法模型,損失函式為指數函式,學習演算法為前向分步演算法的二類分類方法。
      前向分步演算法思想:因為學習的是加法模型,所以從前向後,一次只學習一個模型及其係數,逐步逼近。

4.GBDT(連結的博文寫的很好)

(嘗試多次看論文,終以失敗告終······看的部落格,等理解了再看原文吧,嚶嚶嚶)

  • GBDT中的樹都是迴歸樹(CART)
  • 理解過程:單一的迴歸樹的構建->boosting decision tree-> gradient boosting decision
    tree
  • 利用損失函式的負梯度在當前模型的值,作為迴歸問題中提升樹演算法的殘差近似值,擬合一個迴歸樹。所以其核心還是擬合殘差,只不過殘差是用負梯度近似的。殘差的使用,在一定程度上也是增大了那些被分錯的樣例的權重。為了達到這個目的,也可以用boostrap的re-sampling做,但是會帶來問題,每次都是隨機取樣,那麼相同引數的情況下跑兩遍結果可能都不一樣,即模型不可穩定復現。
  • 用xgboost/gbdt在在調參的時候把樹的最大深度調成6就有很高的精度了。但是用DecisionTree/RandomForest的時候需要把樹的深度調到15或更高。
    • 一句話的解釋,來自周志華老師的機器學習教科書(
      機器學習-周志華):Boosting主要關注降低偏差,因此Boosting能基於泛化效能相當弱的學習器構建出很強的整合;Bagging主要關注降低方差,因此它在不剪枝的決策樹、神經網路等學習器上效用更為明顯。
    • 偏差指的是演算法的期望預測與真實預測之間的偏差程度,反應了模型本身的擬合能力;方差度量了同等大小的訓練集的變動導致學習效能的變化,刻畫了資料擾動所導致的影響。
    • 當模型越複雜時,擬合的程度就越高,模型的訓練偏差就越小。但此時如果換一組資料可能模型的變化就會很大,即模型的方差很大。所以模型過於複雜的時候會導致過擬合。
      當模型越簡單時,即使我們再換一組資料,最後得出的學習器和之前的學習器的差別就不那麼大,模型的方差很小。還是因為模型簡單,所以偏差會很大(所以方差描述了模型的抗擾動能力?)
    • 對於Bagging演算法來說,由於我們會並行地訓練很多不同的分類器的目的就是降低這個方差(variance)
      ,因為採用了相互獨立的基分類器多了以後,h的值自然就會靠近.所以對於每個基分類器來說,目標就是如何降低這個偏差(bias),所以我們會採用深度很深甚至不剪枝的決策樹。
      對於Boosting來說,每一步我們都會在上一輪的基礎上更加擬合原資料,所以可以保證偏差(bias),所以對於每個基分類器來說,問題就在於如何選擇variance更小的分類器,即更簡單的分類器,所以我們選擇了深度很淺的決策樹。
  • Shrinkage
    • 相當於每次只逼近一小步,除了第一棵樹之外,其他的都乘以一個shrinkage係數(或者說step)。但是這個step並不是梯度的step,是樹的step,相當於給樹加了個權重。
  • GBDT如何做分類: