李航(統計學習方法第五章)

第五章 決策樹

  • 本章討論用於分類的決策樹。

  • 可認定爲if-then規則集合

  • 決策樹的學習過程

    • 特徵選擇
    • 決策樹生成
    • 決策樹修剪
  • 優點

    • 模型具有可讀性
    • 分類速度快
  1. 決策樹基本概念
  2. ID3和C4.5介紹特徵選擇、決策樹的生成以及決策樹的修剪
  3. CART算法

5.1 決策樹模型與學習

5.1.1 決策樹模型

  • 定義:分類決策樹是一種描述對實例進行分裂的樹形結構,由節點和有向邊組成。節點有兩種類型:內部節點和葉節點。內部節點表示一個特徵或屬性,葉節點表示一個類。
  • 決策樹示意圖:

5.1.2 決策樹與if-then規則

  • 每一個實例都被有且只有一條規則所覆蓋

5.1.2 決策樹與概率分佈

5.1.3 決策樹學習

  • 算法過程

    • 構建根節點,將所有數據集都放在根節點
    • 選擇一個最優特徵,按這一特徵將訓練數據集分割成子集,使各個子集有一個在當前條件下的最好分類。
    • 若這些子集都已經基本正確分類,那麼構建葉節點,並將子集分到所對應的葉節點。
    • 否則重新選取最優特徵,繼續分割。直至所有訓練數據集基本正確分類。
  • 易產生過擬合,需要剪枝。

5.2 特徵選擇

5.2.1 特徵選擇問題

  • 特徵選擇在於選取對訓練數據集具有分類能力的特徵,通常特徵選擇的標準是信息增益或信息增益比。
  • 特徵選擇是決定用哪個特徵來劃分特徵空間。
  • 確定選擇的準則:直觀上,如果一個特徵具有更好的分類能力,使得各個子集在當前條件下有最好的分類,那麼就選擇這個特徵。信息增益可以很好的表示這一直觀準則。

5.2.2 信息增益

  • 爲了便於說明,先給出熵與條件熵的定義。
  • 在信息論與概率統計中馬,熵是表示隨機變量不確定性的度量。

XP(X=xi)=pi,i=1,2,...,nXH(X)=i=1npilogpipi=0,0log0=0.2eXXH(p)H(p)=i=1npilogpi 設X是一個取有限個值的離散隨機變量,其概率分佈爲:\\ P(X=x_i)=p_i,i=1,2,...,n\\ 則隨機變量X的熵定義爲:H(X)=-\sum _{i=1}^np_i\log p_i\\ 若p_i=0,則定義0\log 0=0.通常式中對數以2爲底或以e爲底\\ 這時熵的單位分別稱作比特或納特。因定義可知,熵只依賴於X的分佈,因此將X的熵記作H(p),即:\\ H(p)=-\sum _{i=1}^np_i\log p_i

  • 熵越大,隨機變量的不確定性就越大。
  • 證:0H(p)logn0\leq H(p)\leq \log n

證明:
0pi1logpi0H(p)0pi=1nH(p)=logn0H(p)logn \because\,0\leq p_i\leq 1, \therefore \,\log p_i \leq 0, \therefore\,H(p)\geq 0\\ 又均勻分佈時熵最大,取p_i=\frac{1}{n}\\ 得H(p)=\log n\\ \therefore 0\leq H(p)\leq \log n

  • 當隨機變量只取兩個值,如1,0時,即:

X分佈爲:
P(X=1)=p,P(x=0)=1p,0p1H(p)=plog2p(1p)log2(1p) P(X=1)=p,P(x=0)=1-p,0\leq p\leq 1\\ 熵爲:H(p)=-p\log_2p-(1-p)\log_2(1-p)
此時熵與概率p的變化曲線如圖所示:

當p=0或p=1時,熵等於0,隨機變量完全沒有不確定性。當p=0.5時,熵最大。
  • 設有隨機變量(X,Y)(X,Y),其聯合概率分佈爲

P(X=xi,Y=yi)=pij;i=1,2,...,n;j=1,2,...,m P(X=x_i,Y=y_i)=p_{ij};i=1,2,...,n;j=1,2,...,m

  • 條件熵H(YX)H(Y|X)表示在已知隨機變量XX的條件下隨機變量YY的不確定性。定義爲XX給定條件下YY的條件概率分佈的熵對XX的數學期望:

H(YX)=i=1npiH(YX=xi)pi=P(X=xi),i=1,2,...,n. H(Y|X)=\sum_{i=1}^n p_iH(Y|X=x_i)\\ 這裏,p_i=P(X=x_i),i=1,2,...,n.

  • 條件熵的解釋可見知乎
  • 若熵與條件熵由數據估計(特別是極大似然估計)得到時,所對應的熵與條件熵分別稱爲經驗熵和經驗條件熵。
  • 信息增益表示:得知特徵X的信息而使類Y的信息的不確定性減少的程度。
  • 定義5.2(信息增益) 特徵AA對訓練數據集DD的信息增益g(D,A)g(D,A),定義爲集合DD的經驗熵H(D)H(D)與特徵AA給定條件下DD的條件經驗熵H(DA)H(D|A)之差,即:

g(D,A)=H(D)H(DA)H(Y)H(YX) g(D,A)=H(D)-H(D|A)\\ 一般的,熵H(Y)與條件熵H(Y|X)之差稱爲互信息。\\ 決策樹學習中的信息增益等價於訓練數據集中類與特徵的互信息。

  • 決策樹學習應用信息增益準則選擇特徵。信息增益大的特徵具有更強的分類能力。
  • 根據信息增益的特徵選擇方法是:對訓練數據集DD,計算其每個特徵的信息增益,並比較大小,選擇信息增最大的特徵。
  • 算法5.1(信息增益的算法)
  • 例5.2
import numpy as np
from math import log2

D = np.array([
    ['青年', '否', '否', '一般', '否'],
    ['青年', '否', '否', '好', '否'],
    ['青年', '是', '否', '好', '是'],
    ['青年', '是', '是', '一般', '是'],
    ['青年', '否', '否', '一般', '否'],
    ['中年', '否', '否', '一般', '否'],
    ['中年', '否', '否', '好', '否'],
    ['中年', '是', '是', '好', '是'],
    ['中年', '否', '是', '非常好', '是'],
    ['中年', '否', '是', '非常好', '是'],
    ['老年', '否', '是', '非常好', '是'],
    ['老年', '否', '是', '好', '是'],
    ['老年', '是', '否', '好', '是'],
    ['老年', '是', '否', '非常好', '是'],
    ['老年', '否', '否', '一般', '否']
], dtype=np.str)

MAX = 10

t_k_ = np.array([3, 2, 2, 3, 2])  # 各個域的大小
t_k = np.array([
    ['青年', '中年', '老年'],
    ['是', '否'],
    ['是', '否'],
    ['一般', '好', '非常好'],
    ['是', '否']
])

c_k = np.zeros((len(t_k_), MAX), dtype=np.int)

D_ = len(D)  # 樣本數
t_ = len(D[0]) - 1  # 特徵數

HDA = np.zeros(t_)


def get_HDA():
    """
    計算經驗條件熵
    :return: None
    """
    global HDA, D, t_, t_k, t_k_, c_k, D_
    for ti in range(t_):  # 待計算特徵A下標
        res = 0
        for yi in range(t_k_[t_]):  # 對於每一個分類
            temp = 0
            for ki in range(t_k_[ti]):  # 對於該特徵的每一個取值
                for di in range(D_):  # 對於每一個數據集
                    if D[di][ti] == t_k[ti][ki] and D[di][t_] == t_k[t_][yi]:
                        temp += 1
                res += (c_k[ti][ki] / D_) * (t(temp, c_k[ti][ki]))
                temp = 0
        HDA[ti] = res


def get_C_k():
    """
    統計各個特徵的各種取值的個數
    :return: None
    """
    global D_, D, t_, c_k, t_k_, t_k
    for ti in range(t_ + 1):  # 待計算特徵A下標
        for ki in range(t_k_[ti]):  # 對於該特徵的每一個取值
            for di in D:
                if di[ti] == t_k[ti][ki]:
                    c_k[ti][ki] += 1


def get_HD(ti, _d_):
    """
    計算經驗熵
    :param ti: 最終分類所在下標
    :param _d_: 分母,即數據集大小
    :return: 計算結果,即數據集D的經驗熵
    """
    global D, D_, t_k_, t_, c_k
    res = 0
    for i in range(t_k_[ti]):
        res += t(c_k[ti][i], _d_)
    return res


def t(_ck, _n):
    """
    計算log
    :param _ck: 出現頻次
    :param _n: 總數
    :return: 計算結果
    """
    if _ck == 0:
        return 0
    temp = _ck / _n
    return -temp * log2(temp)


def main():
    """
    主函數
    :return: None
    """
    global t_, D_
    get_C_k()
    HD = get_HD(t_, D_)
    get_HDA()
    res = 0
    j = 0
    for i in range(t_):
        if HD - HDA[i] >= res:
            res = HD - HDA[i]
            j = i
    print('選擇特徵爲A', j + 1, '信息增益爲', res)


if __name__ == '__main__':
    main()
  • 運行結果
選擇特徵爲A 3 信息增益爲 0.4199730940219748

5.2.3 信息增益比

  • 以信息增益作爲劃分數據集的特徵,存在偏向於選擇取值較多的特徵問題。使用信息增益比可以對這一問題進行矯正,這是特徵選擇的另一準則。
  • 信息增益比定義爲信息增益g(D,A)g(D,A)與訓練數據集DD關於特徵AA的值的熵HA(D)H_A(D)之比。即:

gR(D,A)=g(D,A)HA(D)HA(D)=i=1nDiDlog2DiD g_R(D,A)=\frac{g(D,A)}{H_A(D)}\\ 其中,H_A(D)=-\sum _{i=1}^n\frac{\mid D_i \mid}{\mid D \mid}\log_2 \frac{\mid D_i \mid}{\mid D \mid}

5.3 決策樹的生成

5.3.1 ID3算法

5.3.2 C4.5算法

  • ID3使用信息增益作爲特徵選擇的度量
  • C4.5使用信息增益比作爲特徵選擇的度量

5.4 決策樹剪枝

  • 在決策樹學習中將已生成的樹進行簡化的過程叫做剪枝。
  • 剪枝通過極小化決策樹整體的損失函數或代價函數來實現。
  • 決策樹的學習的損失函數定義爲:

Cα(T)=t=1TNtHt(T)+αTHt(T)=kNtkNtlogNtkNtC(T)=t=1TkNtkNtlogNtkNtCα(T)=C(T)+αT C_\alpha(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha |T|\\ 其中H_t(T)=-\sum_k\frac{N_{tk}}{N_t}\log \frac{N_{tk}}{N_t}\\ 將C(T)=-\sum_{t=1}^{|T|}\sum_k\frac{N_{tk}}{N_t}\log \frac{N_{tk}}{N_t}\\ 即:C_\alpha(T)=C(T)+\alpha|T|

5.5 CART算法

  • 分類與迴歸樹,是應用廣泛的決策樹學習方法。
  • CART算法假設決策樹是二叉樹,左分支爲“是”的分支,右分支爲“否”的分支。
    • 決策樹的生成
    • 決策樹剪枝

5.5.1 CART生成

  • 遞歸構建二叉決策樹的過程
  • 對迴歸樹用平方誤差最小化準則
  • 對分類樹用基尼指數最小化準則

分類樹與迴歸樹區別:

分類樹主要用於將數據集分類到響應變量所對應的不同類別裏,通常響應變量對應兩類0 or 1. 如果目標變量對應了2個以上的類別,則需要使用分類樹的一個擴展版C4.5(很popular)。然而對於一個二分類問題,常常使用標準的CART算法。不難看出分類樹主要用於響應變量天然對應分類的情況。

迴歸樹主要用於響應變量是數值的或者連續的,例如預測商品的價格,其適用於預測一些非分類的問題。

以上摘自:https://www.cnblogs.com/yxy8023ustc/p/3421146.html

  • 迴歸樹的生成

一個迴歸樹對應着輸入控件的一個劃分以及在該劃分的單元上的輸出值。假設將輸入劃分爲MM個單元R1,R2,...,RMR_1,R_2,...,R_M,並且在每個單元RmR_m上有固定的輸出值cmc_m,於是迴歸樹模型可以表示爲:
f(x)=m=1McmI(xRm) f(x)=\sum _{m=1}^M c_mI(x\in R_m)
輸入空間劃分確定時,平方誤差爲xiRm(yif(xi))2\sum _{x_i\in R_m}(y_i-f(x_i))^2

單元RmR_m上的cmc_m的最優值c^m\hat{c}_mRmR_m上的所有輸入xix_i對應的輸出yiy_i的均值,即:
c^m=ave(yixiRm) \hat{c}_m=ave(y_i|x_i\in R_m)
問題是如何對輸入空間進行劃分?這裏採用啓發式的方法。

  • 循環取第j個變量x和他的取值s,作爲切分變量和切分點
  • 定義兩個區域R1和R2,使R1(j,s)={xx(j)s},R2(j,s)={xx(j)s}R_1(j,s)=\{x|x^{(j)}\leq s\},R_2(j,s)=\{x|x^{(j)}\leq s\}
  • 尋找最佳切分點,使得
    minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2]c^1=ave(yixiR1(j,s)),c^2=ave(yixiR2(j,s)) \min_{j,s}[\min_{c_1}\sum_{x_i\in R_1(j,s)}(y_i-c_1)^2+\min_{c_2}\sum_{x_i\in R_2(j,s)}(y_i-c_2)^2]\\ 其中\hat{c}_1=ave(y_i|x_i\in R_1(j,s)),\hat{c}_2=ave(y_i|x_i\in R_2(j,s))
  • 算法:
  • 分類樹的生成

分類樹用基尼指數選擇最優特徵,同時決定該特徵的最優二值切分點。

**定義 5.4 (基尼指數)**分類問題中,假設有KK個類,樣本點屬於第kk類的概率爲pkp_k,則概率分佈的基尼指數定義爲:
Gini(p)=k=1Kpk(1pk)=1k=1Kpk2 Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2
若二分類問題中,樣本點屬於第一個類的概率是pp,則概率分佈的基尼指數爲:
Gini(p)=2p(1p) Gini(p)=2p(1-p)
對於給定的樣本集合DD,其基尼指數爲:
Gini(D)=1k=1K(CkD)2 Gini(D)=1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2
若樣本DD根據特徵AA是否取某一值aa被分爲D1D_1D2D_2兩部分,即
D1={(x,y)DA(x)=a},D2=DD1 D_1=\{(x,y)\in D|A(x)=a\},D_2=D-D_1
則在特徵A條件下,集合D的基尼指數爲:
Gini(D,A)=D1DGini(D1)+D2DGini(D2) Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)
Gini(D)Gini(D)表示集合DD的不確定性,基尼指數Gini(D,A)Gini(D,A)表示經過A=aA=a分割後集合DD的不確定性,基尼指數越大,樣本集合的不確定性就越大。

算法:

5.5.2 CART剪枝

  1. 從生成的決策樹T0T_0的底端開始不斷剪枝,直到T0T_0的根節點,形成一個子樹序列{T0,T1,...,Tn}\{T_0,T_1,...,T_n\}
  2. 通過交叉驗證法在獨立的驗證數據集上進行測試,從中選擇最優子樹。
  • 剪枝,形成子樹序列

理解:

  • 選擇最優子樹

  • CART剪枝算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章