決策樹故名思意是用於基於條件來作決策的,而它運行的邏輯相比一些複雜的算法更容易理解,只需按條件遍歷樹就能夠了,須要花點心思的是理解如何創建決策樹。git
舉個例子,就好像女兒回家,作媽媽的給女兒介紹對象,因而就有了如下對話:github
媽媽:女啊,明天有沒有時間,媽媽給你介紹個對象
女兒:有啊,對方多大了。
媽媽:年齡和你相仿
女兒:帥不帥啊
媽媽: 帥
女兒:那我明天去看看算法
媽媽和女兒對話的這個過程當中,女兒的決策過程能夠用下圖表示:segmentfault
你可能會認爲,這個決策的過程本質上就是對數據集的每個作if--else
的判斷,這不很簡單嗎?那爲何還要專門弄一個算法出來呢?測試
不妨能夠考慮兩點,假如訓練數據集中存在無關項,好比如下的例子:spa
10-1 #表示第一項特徵是1,第二項特徵是0,最後推出的結果是1,如下同理
12-1
05-0
09-0
17-1
……code
顯然的,最後結果和第二個特徵無關,若是仍要作判斷就會增長了損耗。因此在創建決策樹的過程當中,咱們就但願把這些無關項扔掉。對象
第二點,回到媽媽給女兒介紹對象的這個例子,上圖是爲了方面讀者理解,因此按照順序畫出,但事實上,有一個嚴重的問題,好比說女兒可能不能容忍某個缺點,而一旦對方的性格中具備這個缺點,那麼其餘一切都不用考慮。也就是說,有一個特徵跟最後的結果相關度極高,這時咱們就但願這個數據出如今根節點上,若是核心條件不知足那就結束遍歷這棵樹了,避免無謂的損耗。blog
總言言之,決策樹第一個是須要從大量的已存在的樣本中推出可供作決策的規則,同時,這個規則應該避免作無謂的損耗。遊戲
構造決策樹的關鍵步驟是分裂屬性。分裂屬性值得就是在某個節點處按照某一特徵屬性的不一樣劃分構造不一樣的分支,其目標是讓各個分裂子集儘量地「純」。儘量「純」就是儘可能讓一個分裂子集中待分類項屬於同一類別。這時分裂屬性可能會遇到三種不一樣的狀況:
對離散值生成非二叉決策樹。此時用屬性的每個劃分做爲一個分支。
對離散值生成二叉決策樹。此時使用屬性劃分的一個子集進行測試,按照「屬於此子集」和「不屬於此子集」分紅兩個分支。
屬性是連續值。肯定一個split_point,按照>split_point和<=split_point轉成成離散,分別創建兩個分支。
構造決策樹的關鍵性內容是進行屬性選擇度量,屬性選擇度量是一種選擇分裂準則,是將給定的類標記的訓練集合的數據劃分D「最好」地分紅個體類的啓發式方法,它決定了拓撲結構及分裂點split_point的選擇。
在這裏僅介紹比較經常使用的ID3
算法。
從信息論知識中咱們直到,指望信息越小,信息增益越大,從而純度越高。因此ID3算法的核心思想就是以信息增益度量屬性選擇,選擇分裂後信息增益最大的屬性進行分裂。
循序本系列的從工程角度理解算法,而非數學角度理解算法的原則,所以這裏只給出信息增益度量的計算方式,若是須要深刻了解其數學原理,請查閱專業資料。
設D爲用類別對訓練元組進行的劃分,則D的熵計算方法爲:
其中pi表示第i個類別在整個訓練集中出現的機率。
當按照特徵A分割後,其指望信息爲:
其中Di/D表示每個D在總體訓練集佔的比例。
而信息增益即爲二者的差值:
其中當gain(A)
達到最大時,該特徵即是最佳的劃分特徵,選中最佳特徵做爲當前的節點,隨後對劃分後的子集進行迭代操做。
在本專欄的前面的文章描述了基於決策樹的五子棋遊戲,算是一個基於決策樹的應用了。詳情請點這裏