機器學習進階 第一節 第十六課

我是小白呀發表於2020-12-14

概述

決策樹是一種基本的分類方法, 當然也可以用於迴歸. 我們一般只討論用於分類的決策樹. 決策樹模型呈樹形結構. 在分類問題中, 表示基於特徵對例項的分類過程, 它可以認為是 if-then 規則的集合. 在決策樹的結構中, 每一個例項都被一條路或者一條規則所覆蓋. 通常決策樹學習包括三個步驟: 特徵選擇, 決策樹的生成和決策樹的修建.

優點: 計算複雜度不高, 輸出結果易於理解, 對中間值的缺失不敏感. 可以解決處理邏輯迴歸等不能解決的非線性特徵資料.

缺點: 可能產生過度匹配問題.

適用資料型別: 數值型和標稱型.

特徵選擇

特徵選擇在於選擇取對訓練資料具有分類能力的特徵. 這樣可以提高決策樹學習的效率, 如果利用一個特徵進行分類的結果沒有很大差別, 則稱這個特徵沒有分類能力. 經驗上扔掉這樣的特徵對決策樹學習的精度影響不大. 通常特徵選擇的準則是資訊增益, 這是個數學概念. 通過一個例子來了瞭解特徵選擇的過程.

ID年齡有工作有自己的房子信貸情況類別
1青年一般
2青年
3青年
4青年一般
5青年一般
6中年一般
7中年
8中年
9中年非常好
10中年非常好
11老年非常好
12老年
13老年
14老年非常好
15老年一般

我們希望通過所給的訓練資料學習一個貸款樹, 用以對汶萊的貸款申請進行分類. 即當新的客戶提出貸款申請是, 根據申請人的特徵用決策樹決定是否批准貸款申請. 特徵選擇其實是決定是決定用哪個特徵來劃分特徵空間. 下圖中分別是按照年齡, 還有是否有工作來劃分得到不同的子節點.
在這裡插入圖片描述
在這裡插入圖片描述
通過資訊增益生成的決策樹結構, 更加明顯, 快速的劃分類別. 下面介紹 scikit-learn 中 API 的使用.

資訊的度量和作用

我們常說資訊有用, 那麼它的作用如何客觀, 定量地體現出來呢? 資訊用途的背後是否有理論基礎呢? 這個問題一直沒有很好的回答, 直到 1948 年, 夏農在他的論文 “通訊的資料原理” 中提到了 “資訊熵” 的概念, 才解決了資訊的度量問題, 並量化出資訊的作用.

一條資訊的資訊量與其不確定性有著直接的關係, 比如我們要搞請一件非常不確定的事, 就需要大量的資訊. 相反如果對某件事瞭解較多, 則不需要太多的資訊就能把它搞清楚. 所以從這個角度看, 可以認為, 資訊量就等於不確定的多少. 那麼如何量化資訊量的度量呢? 2022 年舉行世界盃, 大家很關心誰是冠軍. 假如我錯過了比賽, 賽後我問朋友, “誰是冠軍”? 他不願意直接告訴我, 讓我每猜一次給他一塊錢, 他告訴我是否猜對了. 那麼我需要掏多少錢才能知道誰是冠軍? 我可以把球編上號, 從 1 到 32, 然後提問, 冠軍在 1-16 號嗎? 依次詢問, 只需要 5 次, 就可以知道結果. 所以誰是世界盃冠軍這條訊息只值 5 塊錢. 當然夏農不是用錢, 而是用 “位元” 這個概念來度量資訊量. 一個位元一位二進位制數, 在計算機中一個位元組是 8 位元.

那麼如果說有一天 64 支球隊進行決賽階段的比賽, 那麼 “誰是世界盃冠軍” 的資訊量就是 6 位元. 因為要多猜一次. 有的同學會發現, 資訊量的位元數和所有可能情況的對數函式 log 有關. (log32=5,log64=6)

另外一方面你也會發現實際上我們不需要猜 5 次就能猜出冠軍. 因為像西班牙, 巴西, 德國, 義大利這樣的球隊奪得冠軍的可能性比南非, 奈及利亞等球隊大得多, 因此第一次猜測時不需要把 32 支球隊等分成兩個組, 而是可以把少數機制最有可能的球隊分成一組, 把其他球隊分成一組. 然後猜冠軍球隊是否在那幾支熱門隊中. 這樣, 也許三次就能猜出結果. 因此, 當每支球隊奪冠的可能性不等時, “誰是世界盃冠軍” 的資訊量比 5 位元少. 夏農指出, 它的準確資訊量應該是:
在這裡插入圖片描述
其中, p1…p32 為這三支球隊奪冠的概率. H 的專業術語稱之為資訊熵, 單位為位元. 當這 32 支球隊奪冠機率相同是, 對應的資訊熵等於 5 位元是公式的最大值. 那麼資訊熵 (經驗熵) 的具體定義可以為如下:
在這裡插入圖片描述

資訊增益

自古以來, 資訊和消除不確定性是相聯絡的. 所以決策樹過程其實是在尋找某一個特質對整個分類結果的不確定減少的過程. 那麼這樣就有一個概念叫做資訊增益 (information gain).

那麼資訊增強表示得知特徵 X 的資訊而使得類 Y 的資訊的不確定性減少的程度. 所以我們對於選擇特徵進行分類的時候, 當然選擇資訊增益較大的特徵, 這樣具有較強的分類能力. 特徵 A 對訓練資料集 D 的資訊增益 g(D,A), 定義為集合 D 的經驗熵 H(D) 與特徵 A 給定條件下 D 的經驗條件 H(D|A) 之差. 即公式為:
在這裡插入圖片描述
根據資訊增益的準則的特徵選擇方法是: 對於訓練集 D, 計算每個特徵的資訊增益, 並比較它們的大小, 選擇資訊增益最大的特徵.

資訊增益的計算

假設訓練資料集 D, |D| 表示樣本個數. 設有 K 個類 Ck, k=1,2,3,4,…,k, |Ck| 為屬於類 Ck 的樣本個數.
在這裡插入圖片描述設特徵 A 有 n 個不同的取值 {a1,a2,…,an}, 根據特徵 A 的取值將 D 劃分為 n 個子集 D1, D2,…, Dn, |Di| 為樣本個數, 其中 Di 中屬於 Ck 類的樣本的集合為 Dik.

所以首先對於經驗熵來說, 計算如下:

那麼條件熵計算如下:
在這裡插入圖片描述
既然我們有了這兩個公式, 我們可以根據前面的是否通過貸款申請的例子來通過計算得出我們的決策特徵順序. 那麼我們首先計算總的經驗熵為:
在這裡插入圖片描述
然後我們讓 A1, A2, A3, A4 分別表示年齡, 有工作, 有自己的房子和信貸情況 4 個特徵. 則計算出年齡的資訊增益為:
在這裡插入圖片描述
同理其他的也可以計算出來:

g(D,A2)=0.324,g(D,A3)=0.420,g(D,A4)=0.363

相比較來說其中特徵 A3 (有自己的房子) 的資訊增益最大, 所以我們選擇特徵 A3 為最優特徵.

sklearn.tree.DecisionTreeClassifier

class sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_split=1e-07, class_weight=None, presort=False)
  """
  :param max_depth:int或None,可選(預設=無)樹的最大深度。如果沒有,那麼節點將被擴充套件,直到所有的葉子都是純類,或者直到所有的葉子都包含少於min_samples_split樣本

  :param random_state:random_state是隨機數生成器使用的種子
  """

首先我們匯入類, 以及資料集, 還有將資料分成訓練資料集和測試資料集兩部分.

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
iris = load_iris()
x = iris.data
y = iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0)
estimator = DecisionTreeClassifier(max_leaf_nodes=3, random_state=0)
estimator.fit(x_train, y_train)

method

apply: 返回每個自言本被預測的葉子索引.

estimator.apply(X)

array([ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
        1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
        1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  5,
        5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
        5,  5, 15,  5,  5,  5,  5,  5,  5, 10,  5,  5,  5,  5,  5, 10,  5,
        5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 16, 16,
       16, 16, 16, 16,  6, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        8, 16, 16, 16, 16, 16, 16, 14, 16, 16, 11, 16, 16, 16,  8,  8, 16,
       16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16])

decision_path: 返回樹中的決策路徑.

dp = estimator.decision_path(x_test)

fit_transform(x,y=None,fit_params)** 輸入資料,然後轉換.

predict(x): 預測輸入資料的型別,完整程式碼.

estimator.predict(X_test)
array([2, 1, 0, 2, 0, 2, 0, 1, 1, 1, 2, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0,
       0, 1, 0, 0, 1, 1, 0, 2, 1, 0, 1, 2, 1, 0, 2])

print y_test

array([2, 1, 0, 2, 0, 2, 0, 1, 1, 1, 2, 1, 1, 1, 1, 0, 1, 1, 0, 0, 2, 1, 0,
       0, 2, 0, 0, 1, 1, 0, 2, 1, 0, 2, 2, 1, 0, 1])

score(x,y,sample_weight=None): 返回給定測試資料的準確精度.

estimator.score(x_test,y_test)

0.89473684210526316

決策樹本地儲存

sklearn.tree.export_graphviz() 該函式能夠匯出 DOT 格式.

from sklearn.datasets import load_iris
from sklearn import tree
clf = tree.DecisionTreeClassifier()
iris = load_iris()
clf = clf.fit(iris.data, iris.target)
tree.export_graphviz(clf,out_file='tree.dot')

那麼有了 tree.dot 檔案之後, 我們可以通過命令轉換為 png 或者 pdf 格式. (首先得安裝 graphviz)

ubuntu:sudo apt-get install graphviz
Mac:brew install graphviz

然後我們執行這個命令:

$ dot -Tps tree.dot -o tree.ps
$ dot -Tpng tree.dot -o tree.png

或者, 如果我們安裝了 Python 模組 pydotplus, 我們可以直接在 Python 中生成 PDF 檔案. 通過 pip install pydotplus, 然後執行.

import pydotplus
dot_data = tree.export_graphviz(clf, out_file=None)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf("iris.pdf")

檢視決策樹結構圖片, 這個結果是經過決策樹學習的三個步驟之後形的.
在這裡插入圖片描述

擴充套件

所有各種決策樹演算法是什麼, 他們之間有什麼不同? 哪一個在 scikit-learn 中實現?

  1. ID3: 資訊增益最大的準則
  2. C4.5: 資訊增益比最大的準則
  3. CART 迴歸樹: 平方誤差最小分類樹
  4. 基尼係數: 最小的準則在 sklearn 中可以選擇劃分的原則

決策樹優缺點分析

決策樹的一些優點是:

  • 簡單的理解和解釋. 樹木視覺化.
  • 需要很少的資料準備. 其他技術通常需要資料歸一. 需要建立虛擬變數, 並刪除空值. 但請注意, 此模組不支援缺少值.
  • 使用樹的成本 (即預測資料) 在用於訓練樹的資料點的數量上是對數的

決策樹的缺點包括:

  • 決策樹學習者可以建立不能很好地推廣資料的過於複雜的樹. 這被稱為過擬合. 修建 (目前不支援) 的機制, 設定葉節點所需的小取樣數或設定樹的最大深度是避免此問題的必要條件.
  • 決策樹可能不穩定, 因為資料的小變化可能會導致完全不同的樹被生成. 通過使用合奏中的決策樹來減輕這個問題.

相關文章