使用impurity選擇樹模型拆分節點

在近期的項目中經常會使用到連續值模型以提升模型效果。 例如在項目初期, 訓練數據準備OK後,就會使用原有的LR模型初步訓練model看實際的效果, 同時因爲連續值模型, 特別是樹類模型已經在其他項目中應用並取得較好的效果, 所以我們也會將離散特徵進行變換處理後, 使用GBDT, RF看下實際效果。

雖然GBDT, RF都有現成的model訓練環境,直接用就可以,在項目過程中還是順便複習了一下與樹類模型相關的impurity度量標準;就像侯捷在《STL源碼剖析》中說的,開飛機的人不一定需要了解飛機的原理,但參觀飛機制造廠也是一種樂趣。

常用的使用impurity選擇樹模型拆分節點的度量有以下幾類,他們都來自於信息論:

  1. Information Gain
  2. Gain Ratio
  3. Gini Index

以上三種根據impurity進行拆分的度量方式各有優缺點, 一下具體介紹

Information Gain

首先要定義概念熵(entropy)可以理解爲定義一個分佈的信息量, 具體定義如下:

entropy

 

其中D爲數據集合, pi爲第i類在數據中出現的概率。之所以使用以2爲底的對數, 是因爲我們默認使用bit進行編碼。而該處的info/entropy即描述分佈不純的程度。 而我們可以將樹模型看成是對接點進行分裂, 之後根據拆分條件節點的建立使整棵樹的葉子節點儘快達到較純的狀態。

假設現在有A,B,C作爲拆分feature的候選,且假設我們選擇使用featureA進行拆分, 則拆分後的信息爲:

entropy1

 

其中A爲選擇的feature,Dj爲feature A的值爲j的集合,而Information Gain,即表示在原分佈上,確定待拆分的feature A 後, 所帶來的信息增益(減少的信息量), 拆分時使用貪心算法, 信息減少量越多越好。故:

information_gain

 

每次拆分時,貪心地選擇Gain最大的feature A進行拆分即可。

最經典的Decision Tree算法ID3中即使用Information Gain作爲節點拆分的標準。ID3算法具體描述參見:http://link.springer.com/article/10.1023/A:1022643204877

Gain Ratio

Information Gain在節點拆分時是有傾向的, 傾向於拆分屬性值較多的feature,一個極端的例子,假設feature是具體的ID值,即每條instance的ID值都唯一,則對該feature進行一次拆分後,則每個節點都達到純的狀態,Information Gain值最大。爲了解決該問題,在ID3的升級版Decision Tree中引入另外的拆分標準,Gain Ratio。

定義:

splitinfo

因爲某feature的屬性值越多, SplitInfo就會越大,故可以使用SplitInfo在一定程度上消除Information Gain傾向於多屬性feature的偏好。 具體Gain Ratio如下:

gainratio

在此:屬性值越多Gain越大,但SplitInfo也會越大,這樣就中合了Information Gain帶來的偏向。

P.S. 做策略算法中,類似的操作都是互通的,例如在推薦引擎中,用戶打分可能偏好不一樣,有些習慣打高分,有些習慣打低分,則我們可以使用打分的均值去中和這種偏差;而有些人打分分值比較集中,有些人則分佈比較廣泛,則我們可以使用z-score,即處於標準差去一定程度上消除這種分佈。

Gini Index

Gini Index在CART(Classify and Regression Tree)中使用,定義:

gini

其中D爲數據集, pi爲類Ci在D中出現的概率, 可以直接使用|Dci|/|D|預估。

假設我們在feature A上進行拆分, 並且是進行二分類拆分,拆分得到D1,D2數據集

gini_index

則拆分後的Gini Index如上。

gini_increse

同樣, 我們使用Gini稀疏的減少量選擇拆分的feature。

這裏需要注意,CART中僅進行二分拆分,如果A爲多屬性, 則需要轉化爲二分類拆分。

reference:

induction to decision tree,  J,R,Quinlan

Data Ming: Concepts and Techniques

 也可關注微博: weibo.com/dustinsea

或是直接訪問: http://semocean.com


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章