日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

监督学习 | ID3 决策树原理及Python实现

發布時間:2025/3/15 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 监督学习 | ID3 决策树原理及Python实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1. 信息熵 Information Entropy
    • 1.1 信息熵公式推導
  • 2. 信息增益 Information Gain
    • 2.1 信息增益最大化
      • 2.1.1 利用離散特征進行分類
      • 2.1.2 利用連續特征進行分類
        • 2.1.2.1 二分法
        • 2.1.2.2 信息熵、信息增益及二分法的Python實現
  • 參考資料

相關文章:

機器學習 | 目錄

監督學習 | ID3 決策樹原理及Python實現

監督學習 | ID3 & C4.5 決策樹原理

監督學習 | CART 分類回歸樹原理

監督學習 | 決策樹之Sklearn實現

監督學習 | 決策樹之網絡搜索

1. 信息熵 Information Entropy

信息是個很抽象的概念。人們常常說信息很多,或者信息較少,但卻很難說清楚信息到底有多少。比如一本五十萬字的中文書到底有多少信息量。直到1948年,香農提出了“信息熵”的概念,才解決了對信息的量化度量問題。

信息熵這個詞是香農從熱力學中借用過來的。熱力學中的熱熵是表示分子狀態混亂程度的物理量。香農用信息熵的概念來描述不確定性。

  • 隨機變量xxx的信息熵計算公式:H(x)=?∑i=1nP(xi)log2(Pi)H(x)= -\sum_{i=1}^nP(x_i)log_2(P_i)H(x)=?i=1n?P(xi?)log2?(Pi?)
  • 信息熵越大,則表示不確定性越高。
  • 在文本中,當不同的詞匯越多時,其信息熵越大,直觀上來說就是所包含的信息越多

熵:在物理的熱力學中,用熵來表示分子狀態混亂程度。當一個物體溫度越高時,其內部粒子活動越劇烈,也越混亂。因此混亂程度越高,熵越大。

1.1 信息熵公式推導

  • 計算取出結果與原順序相同的概率:
  • P(xi)=P(x1)×P(x2)×...×P(xn)(1)P(x_i)=P(x_1)\times P(x_2) \times...\times P(x_n)\tag{1}P(xi?)=P(x1?)×P(x2?)×...×P(xn?)(1)

  • 將概率公式取以2為底的對數變換,得到信息量I(xi)I(x_i)I(xi?)的公式:
  • I(xi)=log2(1P(xi))=?log2(P(xi))(2)I(x_i)=log_2(\frac{1}{P(x_i)})=-log_2(P(x_i))\tag{2}I(xi?)=log2?(P(xi?)1?)=?log2?(P(xi?))(2)

  • 隨機變量xxx的信息熵計算公式::
  • H(x)=E[I(xi)]=?E[log2(P(xi))]=?∑i=1nP(xi)log2(Pi)(3)H(x)=E[I(x_i)]=-E[log_2(P(x_i))]= -\sum_{i=1}^nP(x_i)log_2(P_i)\tag{3}H(x)=E[I(xi?)]=?E[log2?(P(xi?))]=?i=1n?P(xi?)log2?(Pi?)(3)

    對于樣本集合DDD來說,隨機變量xxx是樣本的類別,即假設樣本有kkk個類別,樣本總數為DDD,則類別iii的概率是ciD\frac{c_i}{D}Dci??

    因此樣本集合DDD的經驗熵為:
    H(D)=?∑i=1k∣ci∣∣D∣log2(∣ci∣∣D∣)(4)H(D)=-\sum_{i=1}^k \frac{|c_i|}{|D|}log_2(\frac{|c_i|}{|D|}) \tag{4}H(D)=?i=1k?Dci??log2?(Dci??)(4)

    例1:假設有四個球,從中隨機放回地抽出四個球,下面計算各個事件的信息熵:

    1.紅紅紅紅,則事件xxx的信息熵:

    H(x)=?∑i=14P(xi)log2(Pi)=[1×log2(1)+1×log2(1)+1×log2(1)+1×log2(1)]=0H(x)=-\sum_{i=1}^4P(x_i)log_2(P_i) =[1 \times log_2(1)+1 \times log_2(1)+1 \times log_2(1)+1 \times log_2(1)]=0H(x)=?i=14?P(xi?)log2?(Pi?)=[1×log2?(1)+1×log2?(1)+1×log2?(1)+1×log2?(1)]=0

    2.紅紅紅藍,則事件yyy的信息熵:

    H(y)=?∑i=14P(yi)log2(Pi)=[0.75×log2(0.75)+0.75×log2(0.75)+0.75×log2(0.75)+0.25×log2(0.25)]=1.4338H(y)=-\sum_{i=1}^4P(y_i)log_2(P_i) =[0.75 \times log_2(0.75)+0.75 \times log_2(0.75)+0.75 \times log_2(0.75)+0.25 \times log_2(0.25)]=1.4338H(y)=?i=14?P(yi?)log2?(Pi?)=[0.75×log2?(0.75)+0.75×log2?(0.75)+0.75×log2?(0.75)+0.25×log2?(0.25)]=1.4338

    3.紅紅藍藍,則事件zzz的信息熵:

    H(z)=?∑i=14P(zi)log2(Pi)=[0.5×log2(0.5)+0.5×log2(0.5)+0.5×log2(0.5)+0.5×log2(0.5)]=2H(z)=-\sum_{i=1}^4P(z_i)log_2(P_i) =[0.5 \times log_2(0.5)+0.5 \times log_2(0.5)+0.5 \times log_2(0.5)+0.5 \times log_2(0.5)]=2H(z)=?i=14?P(zi?)log2?(Pi?)=[0.5×log2?(0.5)+0.5×log2?(0.5)+0.5×log2?(0.5)+0.5×log2?(0.5)]=2

    由上面三個例子可以看出,當混亂程度越高時,信息熵越大。

    關于各類熵的定義及推導,可參考這篇文章。

    2. 信息增益 Information Gain

    信息增益:

    對于待劃分的數據集DDD,其信息熵大小是固定的,但是劃分后子代熵之和是不定的。子代熵越小說明使用此特征劃分得到的子集不確定性越小(純度越高),因此父代與子代的信息熵之差(信息增益)越大,說明使用當前特征劃分數據集DDD時,其純度上升的更快[1]。

    與決策樹關系:

    我們在構建最優的決策樹時總希望能夠快速到達村度更高的集合,這一點可以參考優化算法中的梯度下降(每一步沿著負梯度方法最小化損失函數使函數值快速減小)同理,在決策樹構建的過程中我們總是希望集合往最快到達純度更高的子集合方向發展,因此我們總是選擇使得信息增益最大的特征來劃分當前數據集DDD

    使用特征AAA劃分數據集DDD,計算劃分前后各個數據集的信息熵,并計算信息增益:

    g(D,A)=H(D)?H(D∣A)(5)g(D,A)=H(D)-H(D|A) \tag{5}g(D,A)=H(D)?H(DA)(5)

    其中,假設特征AAA將數據集DDD劃分為nnn個子代,則H(D∣A)H(D|A)H(DA)為劃分后子代的平均信息熵:

    H(D∣A)=∑i=1nP(Ai)H(Ai)(6)H(D|A)= \sum_{i=1}^nP(A_i)H(A_i) \tag{6}H(DA)=i=1n?P(Ai?)H(Ai?)(6)

    例2:假設我們在調查性別與活躍度哪一個對用戶流失影響越大。[2]

    樣本如下:

    GenderActivationis_lost
    MH0
    FM0
    ML1
    FH0
    MH0
    MM0
    MM1
    FM0
    FL1
    FM0
    FH0
    ML1
    FL0
    MH0
    MH0

    按性別分類:

    \LostNo-lostSum
    Whole51015
    Male358
    Female257

    整體熵:

    E(S)=?[515log2(515)+1015log2(1015)]=0.9182E(S)=-[\frac{5}{15}log_2(\frac{5}{15})+\frac{10}{15}log_2(\frac{10}{15})]=0.9182E(S)=?[155?log2?(155?)+1510?log2?(1510?)]=0.9182

    性別熵:

    E(g1)=?[38log2(38)+58log2(58)]=0.0.9543E(g_1)=-[\frac{3}{8}log_2(\frac{3}{8})+\frac{5}{8}log_2(\frac{5}{8})]=0.0.9543E(g1?)=?[83?log2?(83?)+85?log2?(85?)]=0.0.9543

    E(g2)=?[27log2(27)+27log2(27)]=0.8631E(g_2)=-[\frac{2}{7}log_2(\frac{2}{7})+\frac{2}{7}log_2(\frac{2}{7})]=0.8631E(g2?)=?[72?log2?(72?)+72?log2?(72?)]=0.8631

    性別信息增益:
    g(S∣g)=E(S)?815E(g1)?715E(g2)=0.0064g(S|g)=E(S)-\frac{8}{15}E(g_1)-\frac{7}{15}E(g_2)=0.0064g(Sg)=E(S)?158?E(g1?)?157?E(g2?)=0.0064

    按活躍度分類

    \LostNo-lostSum
    Whole51015
    Hight066
    Mid145
    Low404

    活躍度熵:

    E(a1)=0E(a_1)=0E(a1?)=0

    E(a2)=0.7219E(a_2)=0.7219E(a2?)=0.7219

    E(a2)=0E(a_2)=0E(a2?)=0

    活躍度信息增益:
    g(S∣a)=E(S)?615E(a1)?515E(a2)?415E(a3)=0.0064g(S|a)=E(S)-\frac{6}{15}E(a_1)-\frac{5}{15}E(a_2)-\frac{4}{15}E(a_3)=0.0064g(Sa)=E(S)?156?E(a1?)?155?E(a2?)?154?E(a3?)=0.0064

    活躍度信息增益比性別信息增益大,也就是說,活躍度對用戶流失的影響比性別大。

    2.1 信息增益最大化

    2.1.1 利用離散特征進行分類

  • 計算父代熵
  • 計算子代熵
  • 計算信息增益,按信息增益較大的進行分類
  • 如果分類后結果不理想,可將其分類作為父代繼續進行分類
  • 例3:仍以上面的例子為例,之前,我們已經計算出了活躍度對于用戶流失的影響較大,當用戶的活躍度為Hight時,用戶流失為0,當用戶活躍度為Low時,用戶全部流失,因此可以得到:

    可以看到,Hight和Low組的信息熵為0,純度已達到最高;但是Mid組純度未達到最高,因此以Mid組的數據作為父代,重復例2的過程,由于例2數據只有兩個特征,因此只能嘗試使用性別分類;若例2數據有2個以上特征,則此時可以重復例2過程,計算其余特征的信息增益,并選取信息增益最大的特征作為分類依據。由此也可以看出,離散特征決策樹的最大深度不超過其特征數(連續特征決策樹的特征可多次使用)。

    下面嘗試使用性別分組,Mid組的樣本:

    GenderActivationis_lost
    FM0
    MM0
    MM1
    FM0
    FM0

    對Mid組使用性別分類后的結果:

    2.1.2 利用連續特征進行分類

    2.1.2.1 二分法

    因為連續特征屬性的可取值數目不再有限,因此不能像前面處理離散屬性一樣枚舉離散屬性來對節點進行劃分,因此需要對連續屬性離散化。

    常用的離散化策略是二分法:

    給定訓練集DDD和連續屬性aaa,假定aaaDDD上出現了nnn個不同的取值,先把這些值從小到達排序,記為{a1,a2,...,an}\{a^1,a^2,...,a^n\}{a1,a2,...,an},基于劃分點ttt可以將DDD分為子集Dt?D_t^-Dt??Dt+D_t^+Dt+?,其中Dt?D_t^-Dt??是包含那些屬性aaa上取值不大于ttt的樣本,Dt+D_t^+Dt+?則包含哪些在屬性aaa上取值大于ttt的樣本。顯然,對相鄰的屬性取值aia^iaiai+1a^{i+1}ai+1來說,ttt在區間[ai,ai+1)[a^i,a^{i+1})[ai,ai+1)中取任意值所產生的劃分結果相同。因此,對連續屬性aaa,我們可考慮包含n?1n-1n?1個元素的候選劃分點集合:

    Ta={ai+ai+12}(1≤i≤n?1)(7)T_a=\{ \frac{a^i+a^{i+1}}{2} \} \quad (1 \leq i \leq n-1) \tag{7}Ta?={2ai+ai+1?}(1in?1)(7)

    即把區間[ai,ai+1)[a^i,a^{i+1})[ai,ai+1)的中位點ai+ai+12\frac{a^i+a^{i+1}}{2}2ai+ai+1?作為候選劃分點,然后就可以像前面處理離散屬性值那樣來考慮這些劃分點,并選擇最后的劃分點進行樣本集合的劃分,使用的公式如下:

    g(D,a)=max?t∈Tag(D,a,t)=max?t∈Ta{E(D)?∑λ∈(?,+)∣Dtλ∣∣D∣log2(∣Dtλ∣∣D∣)}(8)g(D,a)=\max \limits_{t\in T_a}g(D,a,t) =\max \limits_{t\in T_a} \{E(D)-\sum_{\lambda \in(-,+)} \frac{|D_t^\lambda|}{|D|}log_2(\frac{|D_t^\lambda|}{|D|})\} \tag{8}g(D,a)=tTa?max?g(D,a,t)=tTa?max?{E(D)?λ(?,+)?DDtλ??log2?(DDtλ??)}(8)

    其中g(D,a,t)g(D,a,t)g(D,a,t)是樣本集DDD基于劃分點ttt二分后的信息增益。
    劃分的時候,選擇使g(D,a,t)g(D,a,t)g(D,a,t)最大的劃分點。[3]

    2.1.2.2 信息熵、信息增益及二分法的Python實現

    例4:下面以周志華《機器學習》—西瓜數據集3.0 為例,計算特征“密度”的最佳劃分點以及其信息增益,數據如下:

    import pandas as pd import numpy as np df = pd.read_csv("Data/Watermelon_Data.txt") df['好瓜'] = df['好瓜'].map({'是':1, '否':0}) df 編號色澤根蒂敲聲紋理臍部觸感密度含糖率好瓜012345678910111213141516
    1青綠蜷縮濁響清晰凹陷硬滑0.6970.4601
    2烏黑蜷縮沉悶清晰凹陷硬滑0.7740.3761
    3烏黑蜷縮濁響清晰凹陷硬滑0.6340.2641
    4青綠蜷縮沉悶清晰凹陷硬滑0.6080.3181
    5淺白蜷縮濁響清晰凹陷硬滑0.5560.2151
    6青綠稍蜷濁響清晰稍凹軟粘0.4030.2371
    7烏黑稍蜷濁響稍糊稍凹軟粘0.4810.1491
    8烏黑稍蜷濁響清晰稍凹硬滑0.4370.2111
    9烏黑稍蜷沉悶稍糊稍凹硬滑0.6660.0910
    10青綠硬挺清脆清晰平坦軟粘0.2430.2670
    11淺白硬挺清脆模糊平坦硬滑0.2450.0570
    12淺白蜷縮濁響模糊平坦軟粘0.3430.0990
    13青綠稍蜷濁響稍糊凹陷硬滑0.6390.1610
    14淺白稍蜷沉悶稍糊凹陷硬滑0.6570.1980
    15烏黑稍蜷濁響清晰稍凹軟粘0.3600.3700
    16淺白蜷縮濁響模糊平坦硬滑0.5930.0420
    17青綠蜷縮沉悶稍糊稍凹硬滑0.7190.1030
  • 以數據集中的“密度”為例,決策樹開始學習時,根節點包含的17個訓練樣本在屬性上取值均不同。我們把“密度”這些值從小到大排序:
  • Density_arr = df['密度'].sort_values() f = lambda x: round(x,3) # 保留三位小數 Density_arr = Density_arr.apply(f) print(Density_arr.tolist()) [0.243, 0.245, 0.343, 0.36, 0.403, 0.437, 0.481, 0.556, 0.593, 0.608, 0.634, 0.639, 0.657, 0.666, 0.697, 0.719, 0.774]
  • 根據公式(7)計算分割點TaT_aTa?
  • T_midu = (Density_arr+Density_arr.shift(-1))/2 T_midu = T_midu[:-1].apply(f) # 二分法獲得的(n-1)個分割點 T_midu.index=np.arange(len(T_midu)) print(T_midu.tolist()) [0.244, 0.294, 0.352, 0.382, 0.42, 0.459, 0.518, 0.575, 0.601, 0.621, 0.637, 0.648, 0.661, 0.681, 0.708, 0.746]
  • 計算父代信息熵(Ent_D)
  • # 以西瓜質量劃分集合 def divide_arr(arr):arr = df['好瓜'].iloc[arr.index.values.tolist()]arr_len = len(arr)Left_len = sum(arr == 1)Right_len = arr_len - Left_lenreturn arr_len, Left_len, Right_len# 計算集合信息熵 def entropy(arr):arr_len, Left_len, Right_len = divide_arr(arr)L_frac = Left_len/arr_lenR_frac = Right_len/arr_lenif L_frac==0:Ent = -(R_frac*np.log2(R_frac))elif R_frac==0:Ent = -(L_frac*np.log2(L_frac))else:Ent = -(L_frac*np.log2(L_frac) + R_frac*np.log2(R_frac))Ent = round(Ent,3)return Ent Ent_D = entropy(Density_arr) Ent_D 0.998
  • 利用第2步獲得的分割點,計算(n-1)種分法對應的子代信息熵(gen_entropy_arr):
  • # 利用分割點二分父代 def binary(arr, node):arr_L = arr[arr<=node]arr_L.name = 'arr_L'arr_R = arr[arr>node]arr_R.name = 'arr_R'return arr_L, arr_R# 計算子代熵 def gen_entropy(arr, node):arr_L, arr_R = binary(arr, node)len_L = len(arr_L)len_R = len(arr_R)len_D = len_L + len_REnt_gen = len_L/len_D*entropy(arr_L) + len_R/len_D*entropy(arr_R)Ent_gen = round(Ent_gen,3)return Ent_gen gen_entropy_arr = pd.Series(np.empty(len(T_midu))) for i, cut in enumerate(T_midu):gen_entropy_arr.iloc[i] = gen_entropy(Density_arr, cut)
  • 計算各類分法的信息增益:
  • df2 = pd.concat([T_midu, gen_entropy_arr], axis=1) df2.columns=['劃分點','子集熵'] df2['信息增益'] = Ent_D - df2['子集熵'] df2 劃分點子集熵信息增益0123456789101112131415
    0.2440.9410.057
    0.2940.8800.118
    0.3520.8110.187
    0.3820.7350.263
    0.4200.9040.094
    0.4590.9670.031
    0.5180.9940.004
    0.5750.9950.003
    0.6010.9950.003
    0.6210.9940.004
    0.6370.9670.031
    0.6480.9910.007
    0.6610.9970.001
    0.6810.9730.025
    0.7080.9970.001
    0.7460.9310.067
  • 因此信息增益最大值為0.263,對應劃分點為0.382,如下所示:
  • print(df2.iloc[df2['信息增益'].idxmax()]) 劃分點 0.382 子集熵 0.735 信息增益 0.263 Name: 3, dtype: float64

    繼續對其他的特征進行以上步驟,可以得到其他特征的信息增益,因此該連續特征的決策樹的第一個分割點為信息增益最大的特征所對應的分割點。

    下面是本數據集中各特征的信息增益值:[4]

    g(D∣色澤)=0.109g(D∣根蒂)=0.143g(D|色澤)=0.109 \quad g(D|根蒂)=0.143g(D)=0.109g(D)=0.143

    g(D∣敲聲)=0.141g(D∣紋理)=0.381g(D|敲聲)=0.141 \quad g(D|紋理)=0.381g(D)=0.141g(D)=0.381

    g(D∣臍部)=0.289g(D∣觸感)=0.006g(D|臍部)=0.289 \quad g(D|觸感)=0.006g(D)=0.289g(D)=0.006

    g(D∣密度)=0.262g(D∣含糖率)=0.349g(D|密度)=0.262 \quad g(D|含糖率)=0.349g(D)=0.262g(D)=0.349

    由此可見,“紋理”的信息增益量值最大,因此”紋理“被選作根節點劃分屬性。只要重復以上過程,就能構造出一顆決策樹:

    需要注意的是:與離散屬性不同,若當前節點劃分屬性為連續屬性,該屬性還可以作為其后代節點的劃分屬性。如下圖的一顆決策樹,“含糖率”這個屬性在根節點用了一次,后代節點也用了一次,只是兩次劃分點取值不同。


    參考資料

    [1] Tomcater321.決策樹–信息增益,信息增益比,Geni指數的理解
    [EB/OL].https://blog.csdn.net/Tomcater321/article/details/80699044, 2018-06-14.

    [2] It_BeeCoder.機器學習中信息增益的計算方法 [EB/OL].https://blog.csdn.net/it_beecoder/article/details/79554388, 2018-03-14.

    [3] 天澤28.決策樹(decision tree)(三)——連續值處理 [EB/OL].https://blog.csdn.net/u012328159/article/details/79396893, 2018-02-28.

    [4] 天澤28.決策樹(decision tree)(一)——構造決策樹方法 [EB/OL].https://blog.csdn.net/u012328159/article/details/70184415, 2017-04-18.

    總結

    以上是生活随笔為你收集整理的监督学习 | ID3 决策树原理及Python实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。