決策樹分類
阿新 • • 發佈:2020-12-10
problem
- 用你自己熟悉的語言,編寫程式(ID3演算法,C4.5演算法中的一種)對所給定的資料集進行分類挖掘,給出具體程式和挖掘結果,結果要求包含決策樹的樹形圖以及分類規則。
- 利用自己的分類規則對未分類資料集進行分類,給出分類結果。
- 報告格式以信計專業的實驗報告格式為準。
- 訓練資料
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的。
- 假設\(n_j\)是資料集X中屬於類別\(c_j\)的樣本數量,則各類別的先驗概率為\(P(c_j)=\frac{n_j}{total},j=1,2,\cdots,m\)。對於給定資料集X,計算期望資訊:
- 計算描述屬性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所得的熵為:
其中:
\[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
規則。規則儲存在一個二維陣列中,每一行代表樹的一個規則,即從根到葉之間的一個路徑。表中的每列存放樹中的結點。
- 演算法示例
- 首先對Humidity進行屬性離散化,針對上面的訓練集合,通過檢測每個劃分而確定最好的劃分在75處,則這個屬性的範圍就變為\({(<=75 ,>75)}\)。
- 計算目標屬性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\);
- 計算每個屬性的 GainRatio: $$ GainRatio(Outlook)=\frac{0.2467}{1.577}=0.156 $$ $$ GainRatio(windy)=0.049 $$ $$ GainRatio(Temperature)=0.0248 $$ $$ GainRatio(Humidity)=0.0483 $$
- 選取最大的
GainRatio
,根據Outlook
的取值,將三分枝。 - 再擴充套件各分枝節點,得到決策樹。