決策樹ID3、C4.5、C5.0以及CART算法之間的比較-並用scikit-learn決策樹擬合Iris數據集

引言

在這篇文章中,我主要介紹一下關於信息增益,並比較ID3、C4.5、C5.0以及CART算法之間的不同,並給出一些細節的實現。最後,我用scikit-learn的決策樹擬合了Iris數據集,並生成了最後的決策樹圖片

信息增益(information gain (IG))

在介紹信息增益之前,我想先介紹3種不純度的度量手段,它們分別是Gini index(IG)entropy(IH)classification error(IE)

下面,我先介紹熵(entropy)的定義如下:

IH(P)=i=1npi×log(pi)
  • P:P=(p1,p2,p3,,pn)

假設我們的樣本S中只有一個類別,因此我們的概率分佈P=(p1=1)IH(P)=1log(1)=0 ;假設我們的樣本S中只有兩個相等數量的類別並服從均勻分佈,因此我們的概率分佈P=(p1=0.5,p2=0.5)IH(P)=0.5log(0.5)+0.5log(0.5)=1

下面,我給出Gini index的定義:

IH(P)=1i=1np2i

在實際應用中,Gini index和熵最終會得到非常相似的結果,因此我們不要花費太多的時間用這個兩個不純度來生成決策樹。在下面的所有例子中,我都會用熵作爲不純度度量的手段,Gini index大家瞭解一下就行了。

下面,我給出分類誤差(classification error)的定義:

IE(P)=1max{p(i)}

通過上面的定義我們可以看出,對於樣本類別概率分佈的變化很不敏感。在這個標準下,我們的決策樹會有較淺的高度。

相信大家已經對不純度的度量手段有了一定的瞭解,下面讓我來給出信息增益的定義:

IG(Ex,a)=H(Ex)vvalues(a)(|{xEx|value(x,a)=v}||Ex|H({xEx|value(x,a)=v}))
  • Ex:
  • Attr:
  • H: , 你也可以指定其它的不純度度量手段
  • value(x,a):xExaAttr
  • values(a):aAttr

ID3算法

它的僞代碼如下:

ID3 (Examples, Target_Attribute, Attributes)
    Create a root node for the tree
    If all examples are positive, Return the single-node tree Root, with label = +.
    If all examples are negative, Return the single-node tree Root, with label = -.
    If number of predicting attributes is empty, then Return the single node tree Root,
    with label = most common value of the target attribute in the examples.
    Otherwise Begin
        A ← The Attribute that best classifies examples.
        Decision Tree attribute for Root = A.
        For each possible value, vi, of A,
            Add a new tree branch below Root, corresponding to the test A = vi.
            Let Examples(vi) be the subset of examples that have the value vi for A
            If Examples(vi) is empty
                Then below this new branch add a leaf node with label = most common target value in the examples
            Else below this new branch add the subtree ID3 (Examples(vi), Target_Attribute, Attributes – {A})
    End
    Return Root

僞代碼來源:https://en.wikipedia.org/wiki/ID3_algorithm#Pseudocode

下面,讓我們舉個例子來應用一下ID3算法。

下圖爲我們的訓練集。總共有14個訓練樣本,每個樣本中有4個關於天氣的屬性,這些屬性都是標稱值。輸出結果只有2個類別,玩(yes)或者不玩(no).

ID3算法訓練集

現在,讓我們來看看怎麼構建決策樹的根結點。首先,我們算出整個數據集(S)的熵和按每個屬性劃分數據集以後的熵。

從數據集上我們可以看出:數據集只有兩個類別,它們的概率分佈分別爲p1=914p2=514 ,根據我上面給出的熵公式,可得:

Entropy(S)=(914log2(914)+514log2(514))=0.94Entropy(Ssun)=(25log2(25)+35log2(35))=0.971Entropy(Sovercast)=(44log2(44)+0log2(0))=0Entropy(SRain)=(35log2(35)+25log2(25))=0.971

現在,我們已經求出了熵,根據我上面給出的信息增益公式我們就可以求出信息增益了:

IG(S,Outlook)=Entropy(S)(514Entropy(SSun)+414Entropy(SOvercast)+514Entropy(SRain))=0.246

因此,同樣的步驟我們可以求出其它幾個信息增益:

IG(S,Wind)=0.048IG(S,Temperature)=0.0289IG(S,Humidity)=0.1515

按照Outlook屬性劃分獲得的信息增益最大,因此我們用這個屬性作爲我們決策樹的根結點。我們不斷地重複上面的步驟,會得到一個決策樹,如下圖:

決策樹

ID3算法有幾個缺點:

  • 對於具有很多值的屬性它是非常敏感的,例如,如果我們數據集中的某個屬性值對不同的樣本基本上是不相同的,甚至更極端點,對於每個樣本都是唯一的,如果我們用這個屬性來劃分數據集,它會得到很大的信息增益,但是,這樣的結果並不是我們想要的。
  • ID3算法不能處理具有連續值的屬性。
  • ID3算法不能處理屬性具有缺失值的樣本。
  • 由於按照上面的算法會生成很深的樹,所有容易產生過擬合現象。

下面,我將引入更加強大的C4.5算法,它可以解決上面的問題。

C4.5算法

對於具有很多值的屬性,ID3算法是非常敏感的。而C4.5算法用增益率(Gain ratio)解決了這個問題。在給出增益率的定義之前,我先給出關於內在價值(Intrinsic Value)的定義:

IV(Ex,a)=vvalues(a)|{xEx|value(x,a)=v}||Ex|log2(|{xEx|value(x,a)=v}||Ex|)

增益率的定義如下:

IGR(Ex,a)=IG(Ex,a)IV(Ex,a)

假設我們要構建一個決策樹來分類公司的客戶,那麼其中的一個屬性可能是客戶的信用卡號,這個屬性具有很高的信息增益,因爲它唯一標識每個客戶。但是,我們並不想在決策樹中包含這個屬性,這是因爲它雖然在訓練集上表現地很好,而對於沒見過的樣本它是不可能表現好的。

但是,如果我們用增益率來作爲度量的手段,我們可以很好地避免這個問題。也就是說,對於客戶的信用卡號這個屬性,雖然你的信息增益很大,但是同時你的內在價值也很大,因此你的增益率不會太大。

ID3算法不能處理具有連續值的屬性。而C4.5算法很好地解決了這個問題。下面,我舉例說明一下它的解決方式。假設訓練集中每個樣本的某個屬性爲:{65, 70, 70, 70, 75, 78, 80, 80, 80, 85, 90, 90, 95, 96}。現在我們要計算這個屬性的信息增益。我們首先要移除重複的值並對剩下的值進行排序:{65, 70, 75, 78, 80, 85, 90, 95, 96}。接着,我們分別求用每個數字拆分的信息增益(比如用65做拆分:用65>65 做拆分,其它數字同理),然後找出使信息增益獲得最大的拆分值。因此,C4.5算法很好地解決了不能處理具有連續值屬性的問題。

ID3算法不能處理屬性具有缺失值的樣本。下面的鏈接非常好地闡述了C4.5算法解決這個問題的方法:https://www.quora.com/In-simple-language-how-does-C4-5-deal-with-missing-values/answer/Aurelian-Tutuianu?srid=IayD
這裏我就不在重複這個問題了。

C5.0和CART算法

C5.0是一個商業軟件,對於公衆是不可得到的。它是在C4.5算法做了一些改進,具體請參考:C5.0算法改進

C5.0主要增加了對Boosting的支持,它同時也用更少地內存。它與C4.5算法相比,它構建了更小地規則集,因此它更加準確。

CART (Classification and Regression Trees)與C4.5算法是非常相似的,但是CART支持預測連續的值(迴歸)。CART構建二叉樹,而C4.5則不一定。

CART用訓練集和交叉驗證集不斷地評估決策樹的性能來修剪決策樹,從而使訓練誤差和測試誤差達到一個很好地平衡點。

scikit-learn的實現爲CART算法的最優版本,詳細文檔請參考:scikit-learn實現CART

下面,我要用scikit-learn的決策樹來分類Iris數據集,讓大家體驗一下決策樹算法的強大!!!

scikit-learn實現決策樹分類Iris數據集

代碼如下:

from sklearn.datasets import load_iris
from sklearn import tree

iris = load_iris() # 加載Iris數據集
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)


from sklearn.externals.six import StringIO
# 這個需要額外安裝,安裝方法:https://github.com/erocarrera/pydot,如果遇到問題給我留言
import pydot

dot_data = StringIO()
tree.export_graphviz(clf, out_file=dot_data) 
graph = pydot.graph_from_dot_data(dot_data.getvalue()) 
graph.write_png('iris_simple.png')

上面的代碼生成的圖片如下:

決策樹

我們還可以讓決策樹更加漂亮一些,代碼如下:

dot_data = StringIO()  
tree.export_graphviz(clf, out_file=dot_data, feature_names=iris.feature_names, class_names=iris.target_names, filled=True, rounded=True, special_characters=True)  
graph = pydot.graph_from_dot_data(dot_data.getvalue())  
graph.write_png('iris.png')

上面的代碼生成的圖片如下:

決策樹

發佈了106 篇原創文章 · 獲贊 213 · 訪問量 59萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章