微信公衆號:碼農充電站pro
我的主頁:https://codeshellme.github.iopython
決策樹是一種機器學習算法,咱們可使用決策樹來處理分類問題。決策樹的決策(分類)過程能夠用一個倒着的樹形結構來形象的表達出來,所以得名決策樹。git
好比咱們根據天氣是否晴朗和是否颳風來決定是否去踢球?當天氣晴朗而且不颳風的時候,咱們纔去踢球。github
此時,就能夠將這個決策過程用一個樹形結構來表示,以下:算法
這就是一顆最簡單的決策樹,咱們能夠用它來判斷是否要去踢球。最上方是樹的根節點,最下方是樹的葉子節點。方框裏是判斷的過程,橢圓形中是決策的結果。shell
固然,實際的使用過程當中,判斷條件並不會這麼簡單,也不會讓咱們本身手動畫圖。實際應用中,咱們會讓程序自動的,從一堆樣本數據集中構造出這顆決策樹,這個程序自動構建決策樹的過程就是機器學習的過程。微信
最終構造出來的這棵決策樹就是機器學習的結果,叫作模型。最後,咱們能夠向模型中輸入一些屬性條件,讓模型給出咱們判斷結果。機器學習
好比咱們有以下數據集:函數
序號 | 條件:天氣晴朗? | 條件:是否颳風? | 結果:去踢球嗎? |
---|---|---|---|
1 | 是 | 否 | 去 |
2 | 是 | 是 | 不去 |
3 | 否 | 是 | 不去 |
4 | 否 | 否 | 不去 |
能夠看到這個表格中有4 行(第一行表頭不算),4 列數據。學習
通常在機器學習中,最後一列稱爲目標(target),前邊的列都稱爲特徵(features)。動畫
咱們要根據這個數據集,來構建一顆決策樹,那如何構建呢?
首先,須要肯定使用哪一個屬性做爲第一個判斷條件,是先判斷天氣晴朗,仍是先判斷是否颳風?也就是,讓天氣晴朗做爲樹的根節點,仍是讓是否颳風做爲樹的根節點?
解決這個問題須要用到信息熵和信息純度的概念,咱們先來看什麼是信息熵。
1948 年,克勞德·香濃在他的論文「通訊的數學原理」中提到了信息熵(通常用H 表示),度量信息熵的單位是比特。
就是說,信息量的多少是能夠量化的。一條信息量的多少與信息的不肯定性有關,能夠認爲,信息量就等於不肯定性的多少(信息的不肯定度)。
信息熵的計算公式以下:
該公式的含義是:
n
就是分類的數目。H(X)
表示熵,數學含義是,全部類別包含的信息指望值。-㏒p(Xì)
表示符號的信息值,p(Xì)
是選擇該分類的機率。log
通常以2 爲底。總之,就是要知道,信息量的多少是能夠用數學公式計算出來的,用信息論中的專業術語就叫作信息熵。信息熵越大,信息量也就越大。
那麼咱們就來計算一下上面表格數據的信息熵。咱們只關注「結果」那一列:
結果:去踢球嗎? |
---|
去 |
不去 |
不去 |
不去 |
根據表格,咱們能夠知道,全部的分類共有2 種,也就是「去」 和「不去」,「去」出現了1 次,「不去」出現了3 次。
分別計算「去」 和「不去」 出現的機率:
P(去) = 1 / 4 = 0.25
P(不去) = 3 / 4 = 0.75
而後,根據熵的計算公式來計算「去」和「不去」 的信息熵,其中log 以2 爲底:
H(去) = 0.25 * log 0.25 = -0.5
H(不去) = 0.74 * log 0.75 = -0.31127812445913283
因此,整個表格含有的信息量就是:
H(表格) = -(H(去) + H(不去)) = 0.81127812445913283
將計算信息熵的過程用Python
代碼實現,以下:
import math # 本函數用於計算一組數據的信息熵 # data_set 是一個列表,表明一組數據 # data_set 的元素data 也是一個列表 def calc_ent(data_set): labels = {} # 用於統計每一個label 的數量 for data in data_set: label = data[-1] # 只用最後一個元素作計算 if label not in labels: labels[label] = 0 labels[label] += 1 ent = 0 # 熵 n = len(data_set) # 數據條數 # 計算信息熵 for label in labels: prob = float(labels[label]) / n # label 的機率 ent -= prob * math.log(prob, 2) # 根據信息熵公式計算 return ent
下面用該函數來計算表格的信息熵:
# 將表格轉化爲 python 列表 # "yes" 表示"去" # "no" 表示"不去" data_set = [['yes'], ['no'], ['no'], ['no']] ent = calc_ent(data_set) print(ent) # 0.811278124459
可見,用代碼計算出來的結果是 0.811278124459,跟咱們手算的結果 0.81127812445913283 是同樣的(保留的小數位數不一樣)。
信息的純度與信息熵成反比:
經典的「不純度」算法有三種,分別是:
ID3 算法
,Information Divergence
,該算法由 Ross Quinlan
於1975 年提出,可用於生成二叉樹或多叉樹。
C4.5 算法
,是 Ross Quinlan
在ID3 算法的基礎上改進而來,可用於生成二叉樹或多叉樹。CART 算法
,Classification and Regression Trees
,中文爲分類迴歸樹。
CART 算法
會選擇基尼係數最小的屬性做爲屬性的劃分。信息增益是其中最簡單的一種算法,後二者都是由它衍生而來。本篇文章中,咱們只詳細介紹信息增益。
基尼係數是經濟學中用來衡量一個國家收入差距的經常使用指標。當基尼係數大於
0.4
的時候,說明財富差別較大。基尼係數在0.2-0.4
之間說明分配合理,財富差距不大。
信息增益就是,在根據某個屬性劃分數據集的先後,信息量發生的變化。
信息增益的計算公式以下:
該公式的含義:
G = H(父節點) - H(全部子節點)
信息增益的目的在於,將數據集劃分以後帶來的純度提高,也就是信息熵的降低。若是數據集在根據某個屬性劃分以後,可以得到最大的信息增益,那麼這個屬性就是最好的選擇。
因此,咱們想要找到根節點,就須要計算每一個屬性做爲根節點時的信息增益,那麼得到信息增益最大的那個屬性,就是根節點。
爲了方便看,我將上面那個表格放在這裏:
序號 | 條件:天氣晴朗? | 條件:是否颳風? | 結果:去踢球嗎? |
---|---|---|---|
1 | 是 | 否 | 去 |
2 | 是 | 是 | 不去 |
3 | 否 | 是 | 不去 |
4 | 否 | 否 | 不去 |
咱們已經知道了,信息增益等於按照某個屬性劃分先後的信息熵之差。
這個表格劃分以前的信息熵咱們已經知道了,就是咱們在上面計算的結果:
H(表格) = 0.81127812445913283
。接下來,咱們計算按照「天氣晴朗」劃分的信息增益。按照「天氣晴朗」劃分後有兩個表格。
表格1,「天氣晴朗」的值爲「是」:
序號 | 條件:天氣晴朗? | 條件:是否颳風? | 結果:去踢球嗎? |
---|---|---|---|
1 | 是 | 否 | 去 |
2 | 是 | 是 | 不去 |
分類共有2 種,也就是「去」 和「不去」,「去」出現了1 次,「不去」出現了1 次。
因此,「去」 和「不去」 出現的機率均爲0.5:
P(去) = P(不去) = 1 / 2 = 0.5
而後,「去」和「不去」 的信息熵,其中log 以2 爲底:
H(去) = H(不去) = 0.5 * log 0.5 = -0.5
因此,表格1 含有的信息量就是:
H(表格1) = -(H(去) + H(不去)) = 1
表格2,「天氣晴朗」的值爲「否」:
序號 | 條件:天氣晴朗? | 條件:是否颳風? | 結果:去踢球嗎? |
---|---|---|---|
3 | 否 | 是 | 不去 |
4 | 否 | 否 | 不去 |
全部的分類只有1 種,是「不去」。因此:
P(不去) = 1
而後,「不去」 的信息熵,其中log 以2 爲底:
H(不去) = 1 * log 1 = 0
因此,表格2 含有的信息量就是:
H(表格2) = 0
總數據共有4 份:
因此,最終按照「天氣晴朗」劃分的信息增益爲:
G(天氣晴朗) = H(表格) - (0.5*H(表格1) + 0.5*H(表格2)) = H(表格) - 0.5 = 0.31127812445913283。
當咱們計算的信息增益多了,你會發現,ID3 算法傾向於選擇取值比較多的屬性做爲(根)節點。
可是有的時候,某些屬性並不會影響結果(或者對結果的影響不大),那此時使用ID3 選擇的屬性就不恰當了。
爲了改進ID3 算法的這種缺點,C4.5 算法應運而生。
C4.5 算法對ID3 算法的改進點包括:
固然C4.5 算法也並非沒有缺點,因爲 C4.5算法須要對數據集進行屢次掃描,因此算法效率相對較低。這裏再也不展開討論C4.5 算法。
下篇會介紹如何用決策樹來解決實際問題。
歡迎關注做者公衆號,獲取更多技術乾貨。