1. 程式人生 > >無公式無程式碼白話機器學習演算法之決策樹

無公式無程式碼白話機器學習演算法之決策樹

引子 

       今天開始讀劉未鵬的《暗時間》一書。在序言中,有一句話引起了我的興趣,“波普爾曾經說過:人生不過是解決問題。而判斷和決策又是其中最常見的一類問題解決。” 哈哈,我們的機器學習各種演算法不就是解決問題的嘛,決策樹不就是最常見的一種解決分類或者回歸問題的機器學習演算法嘛!剛好湊到一起去了。的確,個人感覺決策樹是所有常見機器學習演算法中最容易直觀理解其原理的,也符合我們大部分人在面對問題時做出決策的思路。今天我們就來侃一侃這個“平易近人”的決策樹。

        在日常生活中,我們解決一個問題,必然要做出一個決策。就拿網路上最常見的一個決策樹的例子來說吧!大概是這樣的:小紅的媽媽給小紅安排相親。小紅問:“長的帥嗎?”媽媽說:“挺帥的。”小紅又問:“收入高嗎?”媽媽答:“不怎麼高,中等吧!”小紅接著問:“那是公務員嗎?”媽媽答:“是的,人家在稅務局上班呢。”小紅做出決策:“好的,那我去見見他。”


        在上面的例子中,小紅要解決問題就是要不要去見這個男生。做出的決策就是:去見見他。我們看到被決策的客體就是測試樣本,這個樣本具有一系列的屬性。在做出決策的過程中,小紅不斷利用樣本的屬性值來一步步地到達最終的決策。

決策樹模型的理解

        最常見的決策樹是用於分類問題的,我們先從分類決策樹談起。我們可以將機器學習為了解決分類問題而提出的演算法分為三類:基於規則的分類基於概率的分類(邏輯死地迴歸,樸素貝葉斯分類器)和基於例項的分類(KNN)。而分類決策樹就是基於規則噠!

        對於決策樹這種模型的理解,一種方法是可以將其看做是一系列if-then規則的集合,而由決策樹的根節點到葉節點的每一條路徑構成一條規則

。因為每一個葉節點都是由根節點出發,在滿足一系列if條件後不斷then下去,最終到達葉節點;另一種方法是可以將決策樹表示為給定特徵條件下類的條件概率分佈。在構建決策樹的時候,訓練樣本的每一個屬性都可以將特徵空間進行劃分,那麼所有的屬性就將特徵空間劃分為一個個相互沒有交集的獨立的區域。決策樹的一條路徑最終會到達其中的一個區域。然後這個區域中一般會有多個樣本啦,因為訓練集中可能有多個相似屬性的樣本。但是這些樣本卻不一定屬於同一個類哦,當然屬於同一個類是最好的了。如果把從根節點到達這個區域的路徑上的所有屬性取值定義為X,把這個區域中樣本的類別定義成Y,那麼這個條件概率分佈就可以寫成P(Y|X)。各個區域上的類條件概率中總有一個最大的吧,如果一個測試樣本到達這個類,我們就把這個測試樣本歸為這個概率最大的類。比如一個這樣的區域中有5個樣本,其中有3個屬於Y1類,有兩個屬於Y2類,那麼如果有測試樣本到達這個區域,那麼我們就認為他屬於Y1類。

        那麼,既然這個模型這麼容易理解,那麼如何去訓練一個決策樹模型呢?

決策樹模型的訓練

        首先我們必須得有一批訓練集吧。我們希望從這批資料集中提取規則建立決策樹,也就是以怎樣的一系列標準作為不斷劃分資料的依據。我們知道,不同的標準必然導致劃分資料的結果不同,也就會生成不同的決策樹。我們需要的是一個與訓練資料矛盾最小的決策樹,然後這是不可能的。因為從所有可能的決策樹中選取最優決策樹是NP完全問題。在現代電腦科學中,解決NP完全問題的方法一般是採用一些啟發式搜尋策略,以期在較短時間內獲得一個很好的近似解。在這裡,決策樹採用的是一種“貪心”的搜尋策略。在從根節點構建決策樹時,遞迴地選擇當前最優的特徵來劃分訓練資料集,直到所有的訓練資料集被基本爭取分類,或者沒有合適的特徵為止。這裡特徵的選擇非常重要。我們知道一個機器學習演算法的效能,有時候就是因為特徵選擇的好,會對結果產生巨大的效能提升。

        可是,就算你訓練資料集再大,也不能包含所有可能的資料,是吧?所以,這樣學習出來的決策樹難免會對訓練資料有良好的分類能力但對測試資料卻不一定,也就是產生了過擬合。解決決策樹過擬合的方法就是對決策樹進行剪枝。

        由上我們可以看出,決策樹的學習演算法包含特徵選擇、決策樹的生成與決策樹的剪枝過程。由於決策樹表示一個條件概率分佈,所以深淺不同的決策樹對應著不同複雜度的概率模型。決策樹越深,說明條件越多,那麼模型就越複雜咯。決策樹的生成對應於模型的區域性選擇(沒辦法,誰讓人家是NP完全問題呢),而決策樹的剪枝則考慮全域性最優(必然嘛,既然已經基本構建出來了,能全域性最優肯定要全域性最優)。所以,決策樹的模型訓練除了特徵選擇以外,主要分區域性探索全域性尋優兩個階段。

常用的決策樹的學習演算法

(唉,本來就是想簡單寫寫,沒想到這一塊內容可說的還挺多。既然開了頭,一定要堅持下去!下面我將著重一些細節的理解。)

       ID3演算法

        這是最一般的決策樹,也是我們最為熟悉的。核心是在決策樹的各個節點上應用資訊增益準則選擇特徵,然後遞迴構建決策樹。ID3相當於用極大似然法進行概率模型的選擇。這是因為,所謂極大似然,就是在模型選擇的時候,我們要得到模型的一些引數。給定一定訓練樣本的情況下,它必然不能代表所有的可能樣本。於是,我們需要得到這樣的模型引數,在這樣的引數下,模型生成我們所得到的訓練樣本的概率是最大的。回到ID3演算法中,我們構建的決策樹沒有辦法滿足所有的可能樣本,於是,我們盡最大可能滿足已有的訓練樣本,以期獲得全域性最優的近似。

        說到ID3演算法的資訊增益,就不得不說到熵。之前的我可謂是談“熵”色變:感覺熵這個東西太抽象了,計算的熵的公式也那麼複雜。到後來讀了吳軍老師的《數學之美》,竟然對熵的態度來了個180度的大轉彎,深深地感受到資訊理論的神奇,也對資訊理論創始人夏農感到無以名狀的敬佩。

        簡單的說,熵是對不確定性的度量,而資訊可以減少這種不確定性。這就是為什麼條件熵總是要小於其相應地“無條件時候”的熵。因為加入了條件,就相當於加入了資訊,自然會降低不確定性。然後降低多少的度量,就是資訊增益:特徵A對訓練資料集D的資訊增益g(D,A),定義為集合D的經驗熵H(D)與特徵A給定條件下D的經驗熵H(D|A)之差。由於不同的特徵具有不同的資訊增益,資訊增益大的特徵具有更強的分類能力,所有ID3每次選擇資訊增益最大的特徵擴充套件節點。

        熵的計算公式我就不多說了,這裡我想說一下條件熵。因為條件一般也是一個變數。我們先計算這個條件變數取特定值時候的熵,那就是將熵的計算公式中所有的概率修改為條件變數取特定值得條件概率。那麼,真正的條件熵,不能僅考慮條件變數的特定情況,而是應該將條件變數取所有可能值得熵都計算出來,然後再根據這些可能值出現的概率進行線性加權,就得到了條件熵的計算公式。另外給出一個公式:條件熵等於複合熵減去條件變數的熵。可以將所有概念聯絡起來。更多的關於資訊理論的知識可以點選這篇部落格,寫的超好。

        好啦,下面開始介紹ID3演算法的剪枝。我們知道剪枝可以使決策樹模型簡單化,防止過擬合。具體地,剪枝從已經生成的樹上裁掉一些子樹或葉節點,並將其根節點或父節點作為新的葉節點,從而簡化分類樹模型。決策樹的剪枝往往通過極小化決策樹整體的損失函式來實現。這個損失函式採用節點個數衡量模型複雜度並作為正則化項。當調和引數alpha確定時,子樹越大,往往與訓練資料的擬合約好,但是決策樹的子節點就會越多,模型複雜度越高。相反,子樹越小,模型的複雜度越低,但是往往與訓練資料的擬合不好。損失函式正好表示了對兩者的平衡。

        其實,損失函式的極小化等價於正則化的極大似然估計。為什麼是極大似然估計呢?因為我們努力使目前的模型儘量能夠擬合當前的資料,具體表現為所有的葉節點的不確定性最低。為什麼是正則化的呢?你的模型最大化地擬合訓練資料可以,但是對不起,你要付出的代價是模型複雜度的提高。於是用正則化項來約束調和。

        可以看出,決策樹生成只考慮了通過提高資訊增益對訓練資料進行更好的擬合。而決策樹剪枝通過優化損失函式還考慮了減小模型的複雜度。決策樹生成學習區域性的模型,而決策樹剪枝學習整體的模型。也就是說,我們要訓練一個完整可用的決策樹,其實是要經過兩次模型選擇的。第一次先粗略地在模型引數空間中進行搜尋,第二次再精細地做出最後的調整。經過兩次模型選擇保證了決策樹的準確性和泛化能力。

       C4.5演算法

        與ID3演算法相似,只是在生成模型的過程中,用資訊增益比來選擇特徵。在剪枝方面可以與ID3相同。關於這個資訊增益比,就是用ID3計算出的資訊增益,除以關於用當前特徵劃分資料集的熵,也叫內在資訊。內在資訊懲罰了那些劃分資料集個數過多的屬性。也就是說,如果當前特徵劃分資料集得到的子集個數越多,那麼這樣劃分的資料集熵越大,那麼同樣的資訊增益,其資訊增益比越小。這是為了防止有些屬性取值較多然後幾乎每一個值都是對應一類,雖然資訊增益很大,但是這會導致得到的決策樹很淺而且子節點繁多複雜,顯然這不是合理的選擇。(李航老師《統計學習方法》的2012年3月第1版對於資訊增益比有勘誤,請注意。)

       CART演算法

        又可以用來分類又可以用來回歸的決策樹,非常棒。這一部分打算在寫完迴歸問題後再一起總結吧!

決策樹的優缺點

優點:

1,直觀容易理解;(這是廢話)

2,可以處理不相關特徵資料;(是哦,不管是離散型還是連續型;不管是標稱型還是數值型)

3,構建專家系統,用於分類或者預測;(很多專家系統還有預測系統都是用決策樹實現的)

缺點:

1,構造決策樹很耗時,所以要將建立好的決策樹儲存用於之後的分類,不支援線上學習。理論上,決策樹構建一個節點的時間複雜度是O(mnlog(n)),其中n是訓練樣本數,m是特徵維度,log(n)是尋找最優切分點的時間複雜度(個人理解,不知對否)。那麼,構建整個決策樹的時間複雜度即為O(mnnlog(n));

2,容易過擬合。這是因為,決策樹經過每一個節點的劃分,就將資料集劃分為至少兩份,每一份作為子樹的訓練資料。那麼,經過多層劃分之後,子樹的子樹的訓練資料就會大大減少,編容易導致過擬合。尤其是當訓練資料的特徵維數很高時更是如此。針對這個問題,我們的決策樹在訓練的時候樹的深度不要太深,而且在構建訓練資料集的時候,最好能考慮到資料在各個特徵上的均勻分佈以及資料在各個類別上的均勻分佈;此外還要注意葉子節點中資料的個數最好也不要太少。