1. 程式人生 > 實用技巧 >決策樹分類

決策樹分類

problem

  1. 用你自己熟悉的語言,編寫程式(ID3演算法,C4.5演算法中的一種)對所給定的資料集進行分類挖掘,給出具體程式和挖掘結果,結果要求包含決策樹的樹形圖以及分類規則。
  2. 利用自己的分類規則對未分類資料集進行分類,給出分類結果。
  3. 報告格式以信計專業的實驗報告格式為準。
  • 訓練資料
x1 x2 x3 x4 x5 x6 x7 class
0 0 1 27 0 1 0 2
0 1 0 27 0 1 0 1
0 1 0 27 1 0 0 2
0 0 1 24 1 0 0 1
1 0 0 30 1 0 0 1
0 0 1 31 0 1 0 1
1 0 1 37 1 0 0 2
0 0 1 22 0 0 1 2
0 0 1 25 0 1 1 1
1 0 1 34 1 1 0 2
0 1 0 33 1 1 0 2
0 0 1 37 1 1 0 1
0 1 0 30 0 1 1 2
1 1 0 42 1 0 0 1
0 0 0 43 1 0 0 1
0 1 1 28 1 0 0 2
0 1 1 29 0 1 1 1
1 1 0 51 1 0 1 2
0 1 1 22 0 1 0 2
1 1 0 40 0 0 1 1
0 0 1 28 1 0 1 1
1 0 0 52 0 1 1 2
0 1 0 38 1 0 1 1
1 0 0 26 1 0 0 2
0 0 1 33 1 0 1 1
0 0 1 26 1 0 0 2
0 1 0 23 1 0 1 1
0 0 0 37 1 0 1 2
0 0 1 50 0 1 0 1
0 0 1 24 0 1 0 2
  • 帶分類資料
x1 x2 x3 x4 x5 x6 x7 class
0 0 1 0 12 0 1
0 0 0 1 10 0 1
1 0 0 0 24 0 0
1 0 0 0 27 1 0
0 0 1 0 36 0 1
0 1 0 1 12 0 1
1 0 1 0 36 0 1
1 0 0 1 24 0 0
0 1 0 0 48 0 0
1 0 0 1 6 1 0
0 1 0 0 30 1 0
0 0 1 0 18 0 1
0 1 0 1 18 1 0
0 0 1 0 24 1 0
0 0 1 1 9 0 1
0 1 0 1 18 0 1
1 0 0 1 15 1 0
0 1 0 1 24 1 0
0 1 0 0 24 0 0
0 1 0 1 36 0 0

分析

本文擬採用C4.5演算法對上述的資料進行分類,開發環境:visual studio 2019,使用C/C++語言編寫相關程式碼。

知識點

1. 資訊增益比例

一個屬性的增益比例1公式:

\[GainRatio(A)=\frac{Gain(A)}{SplitI(A)}\tag{1} \]

\[SplitI(A)=-\sum_{j=1}^{v} p_j \log _2{p_j}\tag{2} \]

上述式子的內容部分繼承自ID3演算法,接下來簡單地介紹一下相關的知識。

  • 資訊增益
    假設給定的資料樣本集為: \(X=\{ (x_i,y_i)|i=1,2, \cdots ,total \}\),其中樣本\(x_i(i=1,2,\cdots,total)\)用d維特徵向量\(x_i=(x_{i1},x_{i2},\cdots,x_{id})\) 來表示, \(x_{i1},x_{i2},\cdots,x_{id}\)分別對應d個描述屬性\(A_1,A_2,\cdots,A_d\)的具體取值; \(y_i(i=1,2,\cdots,total)\)表示資料樣本\(x_i\)的類標號,假設給定資料集包含m個類別,則\(y_i \in \{c_1,c_2,\cdots,c_m \}\),其中\(c_21,c_2,\cdots,c_m\)是類別屬性C的。
  1. 假設\(n_j\)是資料集X中屬於類別\(c_j\)的樣本數量,則各類別的先驗概率為\(P(c_j)=\frac{n_j}{total},j=1,2,\cdots,m\)。對於給定資料集X,計算期望資訊:

\[I(n_1,n_2,\cdots ,n_m)=-\sum_{j=1}^{m}P(c_j)\log _2{P(c_j)} \tag{3} \]

  1. 計算描述屬性Af劃分資料集X所得的熵
    • 假設描述屬性\(A_f\)有q個不同取值,將X劃分為q個子集\({X_1,X_2,\cdots,X_s,\cdots,X_q}\) ,其中\(X_s(s=1,2,\cdots,s)\)中的樣本在\(A_f\)上具有相同的取值。
    • 假設\(n_s\)表示\(X_s\)中的樣本數量,\(n_{js}\) 表示\(X_s\)中屬於類別\(c_j\)的樣本數量。則由描述屬性\(A_f\)劃分資料集X所得的熵為:

\[E(A_f)=\sum_{s=1}^{q}\frac{n_{1s}+\cdots+n_{ms}}{total} I(n_{1s},\cdots,n_{ms}) \tag{4} \]

其中:

\[I(n_{1s},\cdots,n_{ms})=-\sum_{j=1}^{m}p_{js}log_2{(p_{js})} \tag{5} \]

式中的 \(p_js=\frac{n_{js}}{n_s}\)\(p_{js}\) 表示在子集\(X_s\)中類別為\(c_j\)的資料樣本所佔的比例。熵值越小,表示屬性對資料集劃分的純度越高。計算Af劃分資料集時的資訊增益:

\[Gain(A_f)=I(n_1,n_2,\cdots,n_m)-E(A_f) \tag{5} \]

2. 合併具有連續值的屬性

對於連續屬性值,C4.5其處理過程如下:

  • 根據屬性的值,對資料集排序;
  • 用不同的閾值對資料集動態地進行劃分;
  • 當輸出改變時確定一個閾值;
  • 取兩個實際值中的中點作為一個閾值;
  • 取兩個劃分,所有樣本都在這兩個劃分中;
  • 得到所有可能的閾值、增益及增益比;
  • 在每一個屬性會變為兩個取值,即小於閾值或大於等於閾值。
    簡單地說,針對屬性有連續數值的情況,則在訓練集中可以按升序方式排列。如果屬性A共有n種取值,則對每個取值\(v_j(j=1,2,\cdots,n)\),將所有的記錄進行劃分:一部分小於\(v_j\);另一部分則大於或等於\(v_j\) 。針對每個\(v_j\)計算劃分對應的增益比率,選擇增益最大的劃分來對屬性A進行離散化 。

3. 處理含有未知屬性值的訓練樣本

C4.5處理的樣本中可以含有未知屬性值,其處理方法是常用的值替代或者是將最常用的值分在同一個類中。具體採用概率的方法,依據屬性已知的值,對屬性和每一個值賦予一個概率,取得這些概率依賴於該屬性已知的值。

4. 規則的產生

一旦樹被建立,就可以把樹轉換成if-then規則。規則儲存在一個二維陣列中,每一行代表樹的一個規則,即從根到葉之間的一個路徑。表中的每列存放樹中的結點。

  • 演算法示例
  1. 首先對Humidity進行屬性離散化,針對上面的訓練集合,通過檢測每個劃分而確定最好的劃分在75處,則這個屬性的範圍就變為\({(<=75 ,>75)}\)
  2. 計算目標屬性PlayTennis分類的期望資訊:\(I(s_1,s_2)=I(9,5)=-\frac{9}{14}\log_2{\frac{9}{14}}-\frac{5}{12}\log_2{\frac{5}{14}}=0.940\)
  3. 計算每個屬性的 GainRatio: $$ GainRatio(Outlook)=\frac{0.2467}{1.577}=0.156 $$ $$ GainRatio(windy)=0.049 $$ $$ GainRatio(Temperature)=0.0248 $$ $$ GainRatio(Humidity)=0.0483 $$
  4. 選取最大的GainRatio,根據Outlook的取值,將三分枝。
  5. 再擴充套件各分枝節點,得到決策樹。

參考

[1] 毛國君,段立娟.資料探勘原理與演算法--3版[M].北京:清華大學出版社,2016(2020.1重印). [2] [Wikipedia](https://en.wikipedia.org/wiki/Main_Page)