機器學習從入門到放棄之決策樹演算法

發表於2016-07-01

演算法背景

決策樹故名思意是用於基於條件來做決策的,而它執行的邏輯相比一些複雜的演算法更容易理解,只需按條件遍歷樹就可以了,需要花點心思的是理解如何建立決策樹。

舉個例子,就好像女兒回家,做媽媽的給女兒介紹物件,於是就有了以下對話:

媽媽:女啊,明天有沒有時間,媽媽給你介紹個物件
女兒:有啊,對方多大了。
媽媽:年齡和你相仿
女兒:帥不帥啊
媽媽: 帥
女兒:那我明天去看看

媽媽和女兒對話的這個過程中,女兒的決策過程可以用下圖表示:

機器學習從入門到放棄之決策樹演算法

你可能會認為,這個決策的過程本質上就是對資料集的每一個做if--else的判斷,這不很簡單嗎?那為什麼還要專門弄一個演算法出來呢?

不妨可以考慮兩點,假如訓練資料集中存在無關項,比如以下的例子:

10-1 #表示第一項特徵是1,第二項特徵是0,最後推出的結果是1,以下同理
12-1
05-0
09-0
17-1
……

顯然的,最後結果和第二個特徵無關,如果仍要做判斷就會增加了損耗。所以在建立決策樹的過程中,我們就希望把這些無關項扔掉。

第二點,回到媽媽給女兒介紹物件的這個例子,上圖是為了方面讀者理解,所以按照順序畫出,但事實上,有一個嚴重的問題,比如說女兒可能不能容忍某個缺點,而一旦對方的性格中具有這個缺點,那麼其他一切都不用考慮。也就是說,有一個特徵跟最後的結果相關度極高,這時我們就希望這個資料出現在根節點上,如果核心條件不滿足那就結束遍歷這棵樹了,避免無謂的損耗。

總言言之,決策樹第一個是需要從大量的已存在的樣本中推出可供做決策的規則,同時,這個規則應該避免做無謂的損耗。

演算法原理

構造決策樹的關鍵步驟是分裂屬性。分裂屬性值得就是在某個節點處按照某一特徵屬性的不同劃分構造不同的分支,其目標是讓各個分裂子集儘可能地“純”。儘可能“純”就是儘量讓一個分裂子集中待分類項屬於同一類別。這時分裂屬性可能會遇到三種不同的情況:

  • 對離散值生成二叉決策樹。此時用屬性的每一個劃分作為一個分支。
  • 對離散值生成二叉決策樹。此時使用屬性劃分的一個子集進行測試,按照“屬於此子集”和“不屬於此子集”分成兩個分支。
  • 屬性是連續值。確定一個split_point,按照>split_point和

構造決策樹的關鍵性內容是進行屬性選擇度量,屬性選擇度量是一種選擇分裂準則,是將給定的類標記的訓練集合的資料劃分D“最好”地分成個體類的啟發式方法,它決定了拓撲結構及分裂點split_point的選擇。

在這裡僅介紹比較常用的ID3演算法。

從資訊理論知識中我們直到,期望資訊越小,資訊增益越大,從而純度越高。所以ID3演算法的核心思想就是以資訊增益度量屬性選擇,選擇分裂後資訊增益最大的屬性進行分裂。

循序本系列的從工程角度理解演算法,而非數學角度理解演算法的原則,因此這裡只給出資訊增益度量的計算方式,如果需要深入瞭解其數學原理,請查閱專業資料。

設D為用類別對訓練元組進行的劃分,則D的熵計算方法為:
機器學習從入門到放棄之決策樹演算法

其中pi表示第i個類別在整個訓練集中出現的概率。

當按照特徵A分割後,其期望資訊為:
機器學習從入門到放棄之決策樹演算法

其中Di/D表示每一個D在整體訓練集佔的比例。

而資訊增益即為兩者的差值:

機器學習從入門到放棄之決策樹演算法

其中當gain(A)達到最大時,該特徵便是最佳的劃分特徵,選中最佳特徵作為當前的節點,隨後對劃分後的子集進行迭代操作。

演算法實現

github

在本專欄的前面的文章描述了基於決策樹的五子棋遊戲,算是一個基於決策樹的應用了。詳情請點這裡

相關文章