決策樹算法-理論篇

微信公衆號:碼農充電站pro
我的主頁:https://codeshellme.github.iopython

1,什麼是決策樹?

決策樹是一種機器學習算法,咱們可使用決策樹來處理分類問題。決策樹的決策(分類)過程能夠用一個倒着的樹形結構來形象的表達出來,所以得名決策樹。git

好比咱們根據天氣是否晴朗是否颳風來決定是否去踢球?當天氣晴朗而且不颳風的時候,咱們纔去踢球。github

此時,就能夠將這個決策過程用一個樹形結構來表示,以下:算法


在這裏插入圖片描述


這就是一顆最簡單的決策樹,咱們能夠用它來判斷是否要去踢球。最上方是樹的根節點,最下方是樹的葉子節點。方框裏是判斷的過程,橢圓形中是決策的結果。shell

固然,實際的使用過程當中,判斷條件並不會這麼簡單,也不會讓咱們本身手動畫圖。實際應用中,咱們會讓程序自動的,從一堆樣本數據集中構造出這顆決策樹,這個程序自動構建決策樹的過程就是機器學習的過程。微信

最終構造出來的這棵決策樹就是機器學習的結果,叫作模型。最後,咱們能夠向模型中輸入一些屬性條件,讓模型給出咱們判斷結果機器學習


在這裏插入圖片描述


2,如何構建決策樹?

好比咱們有以下數據集:函數

序號 條件:天氣晴朗? 條件:是否颳風? 結果:去踢球嗎?
1
2 不去
3 不去
4 不去

能夠看到這個表格中有4 行(第一行表頭不算),4 列數據。學習

通常在機器學習中,最後一列稱爲目標(target),前邊的列都稱爲特徵(features)動畫

咱們要根據這個數據集,來構建一顆決策樹,那如何構建呢?

首先,須要肯定使用哪一個屬性做爲第一個判斷條件,是先判斷天氣晴朗,仍是先判斷是否颳風?也就是,讓天氣晴朗做爲樹的根節點,仍是讓是否颳風做爲樹的根節點?

解決這個問題須要用到信息熵信息純度的概念,咱們先來看什麼是信息熵。

3,什麼是信息熵?

1948 年,克勞德·香濃在他的論文「通訊的數學原理」中提到了信息熵(通常用H 表示),度量信息熵的單位是比特

就是說,信息量的多少是能夠量化的。一條信息量的多少與信息的不肯定性有關,能夠認爲,信息量就等於不肯定性的多少(信息的不肯定度)。

信息熵的計算公式以下:


在這裏插入圖片描述


該公式的含義是:

  • 待分類的事物能夠分在多個分類中,這裏的n 就是分類的數目。
  • H(X) 表示熵,數學含義是,全部類別包含的信息指望值。
  • -㏒p(Xì)表示符號的信息值,p(Xì) 是選擇該分類的機率。
  • 公式中的log 通常以2 爲底。

總之,就是要知道,信息量的多少是能夠用數學公式計算出來的,用信息論中的專業術語就叫作信息熵。信息熵越大,信息量也就越大。

3.1,計算信息熵

那麼咱們就來計算一下上面表格數據的信息熵。咱們只關注「結果」那一列:

結果:去踢球嗎?
不去
不去
不去

根據表格,咱們能夠知道,全部的分類共有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
3.2,用代碼實現信息熵的計算

將計算信息熵的過程用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 是同樣的(保留的小數位數不一樣)。

4,什麼是信息純度?

信息的純度與信息熵成反比:

  • 信息熵越大,信息量越大,信息越雜亂,純度越低。
  • 信息熵越小,信息量越小,信息越規整,純度越高。

經典的「不純度」算法有三種,分別是:

  • 信息增益,即 ID3 算法Information Divergence,該算法由 Ross Quinlan 於1975 年提出,可用於生成二叉樹或多叉樹。
    • ID3 算法會選擇信息增益最大的屬性來做爲屬性的劃分。
  • 信息增益率,即 C4.5 算法,是 Ross Quinlan 在ID3 算法的基礎上改進而來,可用於生成二叉樹或多叉樹。
  • 基尼不純度,即 CART 算法Classification and Regression Trees,中文爲分類迴歸樹
    • 便可用於分類數,又可用於迴歸樹。分類樹用基尼係數作判斷,迴歸樹用誤差作判斷。
    • 基尼係數自己反應了樣本的不肯定度。
      • 當基尼係數越小的時候,樣本之間的差別性越小,不肯定程度越低。
      • CART 算法會選擇基尼係數最小的屬性做爲屬性的劃分。

信息增益是其中最簡單的一種算法,後二者都是由它衍生而來。本篇文章中,咱們只詳細介紹信息增益。

基尼係數是經濟學中用來衡量一個國家收入差距的經常使用指標。當基尼係數大於 0.4 的時候,說明財富差別較大。基尼係數在 0.2-0.4 之間說明分配合理,財富差距不大。

5,什麼是信息增益?

信息增益就是,在根據某個屬性劃分數據集的先後,信息量發生的變化。

信息增益的計算公式以下:

在這裏插入圖片描述

該公式的含義:

  • 簡寫就是:G = H(父節點) - H(全部子節點)
  • 也就是:父節點的信息熵減去全部子節點的信息熵。
  • 全部子節點的信息熵會按照子節點在父節點中的出現的機率來計算,這叫作歸一化信息熵

信息增益的目的在於,將數據集劃分以後帶來的純度提高,也就是信息熵的降低。若是數據集在根據某個屬性劃分以後,可以得到最大的信息增益,那麼這個屬性就是最好的選擇。

因此,咱們想要找到根節點,就須要計算每一個屬性做爲根節點時的信息增益,那麼得到信息增益最大的那個屬性,就是根節點。

5.1,計算信息增益

爲了方便看,我將上面那個表格放在這裏:

序號 條件:天氣晴朗? 條件:是否颳風? 結果:去踢球嗎?
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 份:

  • 表格1 中有2 份,機率爲 2/4 = 0.5
  • 表格2 中有2 份,機率爲 2/4 = 0.5

因此,最終按照「天氣晴朗」劃分的信息增益爲:

  • G(天氣晴朗) = H(表格) - (0.5*H(表格1) + 0.5*H(表格2)) = H(表格) - 0.5 = 0.31127812445913283。
5.2,ID3 算法的缺點

當咱們計算的信息增益多了,你會發現,ID3 算法傾向於選擇取值比較多的屬性做爲(根)節點。

可是有的時候,某些屬性並不會影響結果(或者對結果的影響不大),那此時使用ID3 選擇的屬性就不恰當了。

爲了改進ID3 算法的這種缺點,C4.5 算法應運而生。

C4.5 算法對ID3 算法的改進點包括:

  • 採用信息增益率,而不是信息增益,避免ID3 算法有傾向於選擇取值多的屬性的缺點。
  • 加入了剪枝技術,防止ID3 算法中過擬合狀況的出現。
  • 對連續的屬性進行離散化的處理,使得C4.5 算法能夠處理連續屬性的狀況,而ID3 只能處理離散型數據。
  • 處理缺失值,C4.5 也能夠針對數據集不完整的狀況進行處理。

固然C4.5 算法也並非沒有缺點,因爲 C4.5算法須要對數據集進行屢次掃描,因此算法效率相對較低。這裏再也不展開討論C4.5 算法。

下篇會介紹如何用決策樹來解決實際問題。


歡迎關注做者公衆號,獲取更多技術乾貨。

在這裏插入圖片描述

相關文章
相關標籤/搜索