機器學習讀書筆記(三)

By RaySaint 2011/07/08

 

決策樹

 

決策樹可以說是用的非常廣泛的學習算法,對噪聲數據有很好的健壯性,而且表達能力也很強(機器學習讀書筆記(二)中的候選消除算法只能表示屬性的合取,決策樹可以表示屬性的析取)。雖然決策樹不是最好的學習算法,但是目前最牛哄哄的幾個學習算法,如boosting和隨機森林(Random Forest)在內部都使用了決策樹,因此很有必要深入瞭解一下決策樹。


簡介及決策樹表示法

 

在《機器學習》By Mitchell書中講到決策樹是一種逼近離散值目標函數的方法,也就是說決策樹適用於分類(classification)問題,事實上,決策樹也可以用來做迴歸(regression),例如有名的CART(Classfication and Regression Tree,分類與迴歸樹)系統(由Friedman和Breiman兩個大牛提出來的)。這裏還是主要講如何使用決策樹學習來解決分類問題。

 

下面的圖是一個通常的決策樹表示:

 

image

 

由於以樹的形式表達,決策樹的一個優點就是讓人一目瞭然,也很符合人的思維習慣(人在做某個決定時,總會將一系列需要考慮的”因素”按某種重要性準則先排個序,然後優先考慮該因素)。圖上是一個根據天氣情況分類“星期六上午是否適合打網球“的決策樹,每一個非葉子節點都指定了對待分類實例的某個屬性的測試(如Outlook表示測試天氣預報的情況,即詢問天氣預報的情況是晴天Sunny,陰天Overcast,還是下雨Rain?),並且該節點的每一個後繼分支對應於該屬性的一個可能值;每一個葉子節點即爲實例所屬的分類。分類實例的方法就是從樹的根節點開始,測試這個節點指定的屬性,然後按照給定實例的該屬性值對應的樹枝向下移動。然後這個過程在新節點爲根的子樹上重複,直到到達葉子節點。

 

舉一個例子,假設實例的表示形式爲<Outlook, Temperature, Humidity, Wind, PlayTennis>,令某一個具體的實例爲x = <Rain,  Hot, High, Weak, ?>,在根節點上測試屬性Outlook,該樣例的Outlook = “Rain”,那麼就沿着標記“Rain”的樹枝向下移動達到新的節點Wind,於是再測試實例的屬性Wind = “Weak”,沿着”Weak”樹枝移動到葉子節點,葉子節點把x分類爲Yes,也即目標屬性PlayTennis = Yes。

這裏要注意,上圖中的樹爲一棵多叉樹,節點的後繼分支數由節點上測試屬性取值的個數決定。然而在計算機中,多叉樹比較難於表示,而二叉樹易於表示,且二叉樹有很多優良的屬性,因此在編寫程序時,一般以二叉樹的形式來表示決策樹,稱爲二叉決策樹,也就是上面提到的CART系統。             

 

本質上,決策樹代表實例屬性值約束的合取的析取式。從樹根到樹葉的每一條路徑對應一組屬性測試的合取,樹本身對應這些合取的析取。例如上圖表示的決策樹對應於以下表達式:

(Outlook = Sunny ∧ Humidity = Normal) ∨ (Outlook = Overcast) ∨ (Outlook=Rain ∧ Wind = Weak)


決策樹學習的適用問題

 

通常決策樹學習最適合具有以下特徵的問題:

1.實例是由“屬性-值”對錶示的:實例是用一系列固定的屬性和它們的值來描述的(如上面的例子中的x)。最簡單的決策樹學習中,每一個屬性只取少數的離散的值(例如,Temperature取Hot、Mild和Cold)。然而,很容易擴展到也允許處理值域爲實數(連續值)的屬性。

2.目標函數具有離散的輸出值,也就是說要解決的問題是一個分類問題。實際上,如一開始講述的,決策樹也可以用來做迴歸問題。

3.可能需要析取的描述。

4.訓練數據可以包含錯誤。決策樹對於噪聲有很好的健壯性。無論是目標值屬性的錯誤(即分類錯誤)還是描述屬性錯誤。

5.訓練樣例可以包含缺少屬性值的實例:決策樹學習甚至可以在有未知屬性值的訓練樣例中使用。這個問題後面會進行討論

 

理解決策樹算法思路的關鍵是決策樹的歸納偏置(歸納偏置的概念參見機器學習讀書筆記(二),它是學習算法的一個重要特徵),這個偏置被稱爲奧坎姆剃刀(occam’s razor)。


基本的決策學習算法

 

大多數已開發的決策樹學習算法是一種核心算法的變體。該算法採用自頂向下的貪婪搜索遍歷可能的決策樹空間。這種方法是ID3算法(Quinlan 1986)和後繼的C4.5算法(Quinlan 1993)的基礎。下面給出經典的ID3算法的概要:

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

ID3(Examples, Target_attribute, Attributes)

輸入:

Examples即訓練樣例集。Target_attribute是這棵樹要預測的目標屬性。Attributes是除目標屬性外供學習到得決策樹測試的屬性列表。

輸出:

返回一棵能正確分類給定Examples的決策樹

僞代碼表示:

{
    創建樹的Root節點
    if(Examples 都爲正)    // 決策樹增長終止條件
        返回label = + 的單節點樹Root
    if(Examples 都爲反)    // 決策樹增長終止條件
        返回label = - 的單節點樹Root
    if(Attributes爲空)       // 決策樹增長終止條件
        那麼返回單節點樹Root, label=Examples中最普遍的Target_attributes值
    A <- Attributes中分類Examples能力最好的屬性
    Root的決策屬性 <- A
    foreach (a in A)    // a爲屬性A的每個可能取值a
    {
        在Root下加一個新的分支對應測試A = a
        令Examples(a)爲Examples中滿足A屬性值爲a的子集
        在這個新分支下加一個子樹ID3(Examples(a), Target_attribute, Attributes - {A})
    }
   
    返回Root
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

算法的過程並不複雜,就是不斷選取某個屬性對樣例集劃分直到決策樹增長終止條件滿足爲止。終止條件爲:

1. 節點是一個純節點,即從某一分支到達該節點上所有的樣例(這些樣例滿足分支上的屬性測試的值)屬於同一個分類。

2. 所有屬性都已經被作爲測試屬性使用過了。

總之,上面的算法就是一種自頂向下增長樹的貪婪算法,在每個節點選取最好地劃分樣例的屬性。繼續這個過程直到這棵樹完美分類訓練樣例,或所有的屬性都已被使用過。

 

現在有一個重要的問題是:如何選擇在樹的每個節點要測試的屬性?這裏頂一個統計屬性,稱爲信息增益它用來來衡量給定的屬性區分訓練樣例的能力


熵和信息增益

 

什麼樣的屬性纔是最好地分類樣例的屬性?直覺上講,如果訓練樣例集被某個屬性A劃分,得到的所有子樣例集(每個子樣例集中的子樣例滿足A的某個取值a)如果都是“純淨”的,也就是說各個子樣例集中的子樣例(根據目標屬性的取值)都屬於同一個分類,那麼這個屬性A絕對是對能夠最好的區分樣例的屬性(因爲只要用這個屬性對樣例測試,那麼就可以得到分類的結果)。也就是說,根據某個屬性對樣例集進行劃分後,得到的子樣例集越”純淨“,那麼這個屬性對樣例集的區分能力越強。

 

注意,這裏不是很嚴謹,上面一段話中前後兩個“純淨”並不是相同的含義。第一個”純淨”是一個二值判斷,如果樣例集中的子樣例都屬於同一個分類,那麼樣例集就是純淨的,反之則是不純淨的。上面一段話中第二個“純淨”是一種程度的描述,把它稱爲樣例集的純度(也就是說第一個“純淨”是第二個“純淨”的特例,或者說極端情況)。這裏把比較兩個屬性對樣例集的區分能力轉化爲比較使用兩個屬性對樣例集劃分後得到的子樣例的純度。

 

如何刻畫樣例集的純度呢?這裏引入信息論中廣泛使用的一個度量標準,稱爲熵(entropy)。給定樣例集S,目標屬性有c個不同的值,那麼S相對於這c個分類的熵定義爲:

image

在熵的計算中,我們定義0log0爲0。

上式中,pi是S中屬於類別i的比例。舉一個例子:假設S是一個關於某布爾概念(目標屬性的取值有2個,“+”和“-”表示正樣本和負樣本)的有14個樣例的集合,它包括9個正例和5個反例(我們採用記號[9+,5-]來概括這樣的數據樣例)。那麼S相對於這個布爾分類的熵爲:

Entropy([9+, 5]) = –(9/14)log(9/14) – (5/14)log(5/14) = 0.94

注意,如果S的所有成員屬於同一類,那麼S的熵爲0。如果S中的正反樣例的數量相等時,熵爲1。下面的圖刻畫了布爾分類的熵函數隨着p+(正樣例佔總樣例的比例)從0到1變化的曲線

image

從上面的圖可知道也就是說樣例集越“純”的時候(對應途中橫軸兩邊的情況),熵越小。這個結論可以由只有兩個分類的情況推廣到有多個分類的情況。

(信息論中的熵可以解釋爲用二進制位0和1對某個信息(如字串)進行編碼所需的二進制位的長度,樣例集越純的時候,其中包含的信息越少,因此要編碼樣例集的目標值的時候所需的二進制位越少,熵就越小。對於熵的更詳細解釋會在後面講到貝葉斯學習時給出)

 

有了這個結論之後,我們就可以衡量屬性對於樣例的區分能力了。用某個屬性劃分樣例集後,每個樣例子集越“純淨”,那麼該屬性對於樣例的區分能力就越高,這樣每個子集的熵就越小,這些子集組成的整個樣例集的期望熵也就越小,也就是期望熵相對於原樣例集(在未用該屬性劃分樣例前)的熵降低地越多。這個熵降低的大小就稱爲信息增益

 

因此,要求出信息增益,首先求出樣例集S在劃分前的熵Entropy(S);然後,樣例集S被某個屬性A劃分爲多個子集,求出每個子集S(a)的熵Entropy(S(a)),並求出樣例集S被屬性A劃分後熵的期望∑|S(a)|/|S|*Entropy(S(a));最後用Entropy(S) - ∑|S(a)|/|S|*Entropy(S(a))得到由於使用這個屬性劃分樣例導致的期望熵降低,這個就是一個屬性A相對於集合S的信息增益Gain(S,A)。下面給出精確定義:

image

注意,等式右邊第二項描述的期望熵就是每個子集的熵的加權和,權值爲屬於S(a)的樣例佔原始樣例S的比例。

再次強調,信息增益Gain(S,A)是由於知道屬性A而導致的期望熵的減少。換句話講,就是給定屬性A,得到的關於目標函數(如何分類樣例)的信息量,或者說是知道屬性A的值後對S的任意一個成員的目標值進行編碼時,可以節省的二進制位數。


決策樹學習中的假設空間搜索

 

機器學習讀書筆記(一)中提到過,任何一個歸納學習算法可以被描述爲從一個假設空間(稱爲知識的表示)中搜索(稱爲搜索策略)一個擬合訓練樣例的假設。上面提到的ID3算法搜索的假設空間就是可能的決策樹的集合。ID3算法一種從簡單到複雜的爬山算法遍歷這個假設空間,引導這種爬山搜索的評估函數是信息增益度量。

 

通過觀察ID3算法的搜索空間和搜索策略,可以深入認識這個算法的優勢和不足。

ID3算法中的假設空間包含所有的決策樹,它是關於現有屬性的有限離散值函數的一個完整空間。因爲每個有限離散值函數可被表示爲某個決策樹,所以ID3算法避免了搜索不完整假設空間的一個主要風險:假設空間不包含目標函數。

當遍歷決策樹空間時,ID3僅維護單一的當前假設。因爲僅考慮單一的假設,ID3算法失去了表示所有一致假設所帶來的優勢(這個與機器學習讀書筆記(二)中變型空間的候選消除算法不同,候選消除算法維護了與當前的訓練樣例一致的所有假設的集合)它不能判斷有多少個其他決策樹也是與現有的訓練數據一致的。

基本的ID3算法在搜索中不進行回溯。每當在樹的某一層次選擇了一個屬性進行測試,它不會再回溯重新考慮這個選擇。所以,它易受無回溯的爬山搜索中的常見風險影響:收斂到局部最優的答案,而不是全局最優的。後面會討論一個擴展,增加一種形式的回溯(後修剪決策樹)

ID3算法在搜索的每一步都使用當前的所有訓練樣例,以統計爲基礎決定怎樣精化當前的假設。使用所有樣例的統計屬性(例如信息增益)大大降低了對個別訓練樣例錯誤的敏感性。因此,通過修改ID3算法的終止準則以接受不完全擬合訓練數據的假設,他可以被很容易地擴展到處理含有噪聲的訓練數據。


 

 決策樹學習的歸納偏置

 

回憶機器學習讀書筆記(二)中提到的,歸納偏置是一系列前提,這些前提與訓練數據一起演繹論證未來實例的分類。

要描述ID3算法的歸納偏置,應找到它從所有一致的假設中選擇一個的根據。ID3選擇在使用簡單到複雜的爬山算法遍歷可能的樹空間時遇到的第一個可接受的樹。從上面的描述可知道,ID3的搜索策略爲:

(a)優先選擇較短的樹而不是較長的。(由簡單到複雜的自頂向下的貪心算法決定)

(b)選擇那些信息增益高的屬性里根節點較近的樹。(由信息增益的屬性選擇度量決定)

上面的兩點決定了ID3算法的歸納偏置,注意,它們並沒有先後順序,而是存在一種微妙的相互作用的關係,也就是說,雖然較短的樹優先與較長的樹,但ID3算法並不是總是選擇最短的樹,而又傾向於那些信息增益高的屬性更靠近根節點的樹,因此準確刻畫ID3歸納偏置是很難的。下面給出一個近似的刻畫。

 

ID3歸納偏置的近似:較短的樹比較長的樹優先。那些信息增益高的屬性更靠近根節點的樹優先。

 

ID3算法的和第二章中討論的候選消除算法顯示出的歸納偏置之間有一個有趣的差別。

1.ID3算法的假設空間是一個完整的假設空間,從ID3的歸納偏置可知,它不徹底搜索這個空間,而是從簡單的假設到複雜的假設,直到遇到終止條件。因此ID3的歸納偏置完全是搜索策略排序假設的結果。

2.變型空間的候選消除算法的搜索範圍是不完整的假設空間(只搜索由屬性的合取表示的假設),但它徹底搜索這個空間,查找所有與訓練樣例一致的假設。它的歸納偏置完全是假設表示的表達能力的結果。

總結一下,ID3算法的歸納偏置來自它的搜索策略,該策略假定某種假設勝過其他假設(較短的假設比較長的更優),因此稱這種歸納偏置爲優選偏置(preference bias)或搜索偏置(search bias)。相反,候選消除算法的偏置是對待考慮假設的一種限定。這種形式的偏置通常稱爲限定偏置(restriction bias)語言偏置(language)。

 

通常,優先偏置比限定偏置更符合需要,因爲它保證了位置的目標函數被包含在學習器工作的假設空間中(要不然很可能白忙活一場)。但在實際中,綜合使用兩者的學習系統是很常見的(例如使用最小均方差(優選偏置)的以線性函數(限定偏置)來表示評估函數的問題)。


奧坎姆剃刀

 

上面有一個很重要的問題沒有討論,也是你最可能產生疑惑的地方:ID3算法中優選較短決策樹的歸納偏置,是不是從訓練數據中泛化的一個可靠基礎?

有趣的是,這是一個爭論很久的哲學問題,威廉·奧坎姆對於此問題提出了一個論點(據說是刮鬍子時想到的,牛人就是牛,刮鬍子也在想哲學問題),這個論點稱爲奧坎姆剃刀:

 

優先選擇擬合數據的最簡單的假設

 

上面的一個表述是該理論用在機器學習的場合中的解釋。實際上原意是當你有兩個處於競爭地位的理論能得出同樣的結論,那麼簡單的那個更好。爲什麼這個奧坎姆剃刀是正確的呢,《機器學習》By Mitchell這本書在第三章給出一個不是讓人很信服的解釋,而且通過舉了一個模擬進化的羣體的例子給出一個相當玄奧的論點:

進化產生的內部表示使得學習算法的歸納偏置稱爲自我實現的預言,只因爲它改變內部表示比改變學習算法更容易。

反正我是沒搞清楚這句話到底是啥意思,文章《貝葉斯、概率分佈與機器學習》和文章《數學之美番外篇:平凡而又神奇的貝葉斯方法》中對奧坎姆剃刀解釋的比較通俗易懂,而且很清楚。大致的意思是奧坎姆剃刀其實是一種模型(假設)選擇,它砍掉了複雜的模型,選擇了簡單的模型,理由是那些簡單的模型是先驗概率比較高或者似然概率比較高的模型,關於這一點會在以後的貝葉斯學習中詳細地介紹。

 

在ID3算法中,我覺得奧坎姆剃刀是這樣發揮作用的:一棵節點比較多(較長的)的複雜的樹通常會對訓練數據過擬合(Overfit,這個後面還會解釋),因此在這棵複雜的樹成立的前提下,出現給出的訓練數據的可能性會很小;而如果一棵較短的簡單的樹擬合現有的數據,在這棵簡單的樹成立的前提下,出現給出的訓練數據的可能性比較大。因此簡單的樹成立的條件下出現給出的訓練數據的似然概率大,因此優先選擇簡單的樹。


決策樹的過度擬合和後修剪

 

ID3算法增長樹的每一個分支的深度,直到恰好能對訓練樣例完美地分類。這種做法在訓練數據含有噪聲時就出現了一個問題,學習器把噪聲也當作正確數據學習了,這樣得到的假設最後很可能對未來的數據進行錯誤的分類,而導致實際分類的錯誤率上升。

 

對於一個假設,當存在其他的假設對訓練樣例的擬合比它差,但事實上在實例的整個分佈上表現卻更好時,我們說這個假設過度擬合(Overfit)訓練樣例。

 

下面的圖給出了決策樹的規模和決策樹的預測精度的關係曲線來解釋過度擬合。

image

從圖中可以看出,隨着樹的增長,在訓練樣例上的精度是單調上升的。然而,在獨立的測試樣例上測出的樣例先上升後下降。也就是,當樹的節點逐漸增多是,雖然更加完美的解釋了訓練數據,但同時也解釋了訓練數據中的噪聲,而這個導致了在測試數據上精度的下降。

 

因此,爲了避免決策樹學習中的過度擬合問題,應該減少樹的節點個數,降低樹的深度。通常通過兩種方法:

(1)及早停止樹增長。

(2)通過後剪枝減少決策樹的節點的個數。

儘管上面第一種方法可能看起來更直接,但是對過度擬合的樹進行後修剪被證明在實踐中更成功。這是因爲在第一種方法中精確的估計何時停止樹增長很困難。

 

後剪枝的方法很多,這裏討論一種發現高精度假設的非常成功的方法,稱爲“規則後修剪”(rule post-pruning)

它的步驟包括:

(1)從訓練集合推導出決策樹,增長決策樹直到儘可能好地擬合訓練數據,允許過度擬合發生。

(2)將決策樹轉化爲等價的規則集合,方法是爲從跟節點到葉子節點的每一條路徑創建一條規則。

(3)通過刪除任何能導致估計精度提高的前件(preconditions)來修剪(泛化)麼一條規則。

(4)按照修剪過的規則的估計精度對它們進行排序,並按這樣的順序應用這些規則來分類後來的實例。

例如,一開始圖中給出的決策樹中最左的一條路徑被轉化爲規則:

IF (Outlook = Sunny) ∧ (Humidity = Normal)

THEN PlayTennis = No

接下來,通過刪除不會降低估計精度的先行詞來修剪每一個規則。對上面的規則,規則後修剪算法會考慮先行詞(Outlook = Sunny) 和 (Humidity = Normal) 。它會這些修剪步驟中使估計精度有最大提升的步驟,然後考慮修剪第二個前件作爲進一步的修剪步驟。如果某個修剪步驟降低了估計的精度,那麼這個步驟將不會被執行。

 

注意,估計規則精度使用的驗證數據集合是與訓練數據集合不相交的。


參考資料

《機器學習》By Mitchell

貝葉斯、概率分佈與機器學習

數學之美番外篇:平凡而又神奇的貝葉斯方法

 

 

 

 

 

 

 

 

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