1. 程式人生 > 實用技巧 >周志華《機器學習》書中決策樹學習基本演算法的個人理解

周志華《機器學習》書中決策樹學習基本演算法的個人理解

# p74圖4.2 決策樹學習基本演算法
輸入:訓練集D = {(x1, y1), (x2, y2), (x3, y3),..., (xm, ym)};
      屬性集A = {a1, a2,..., ad}.
過程:函式TreeGenerate(D, A)
1: 生成結點node;
2: if D中樣本全屬於同一類別C then
3:       將node標記為C類葉節點; return;
4: end if
5: if A = NULL OR D中樣本在A上取值相同 then
6:       將node標記為葉結點,令其類別標記為D中樣本數最多的類; return;
7: end if
8: 從A中選擇最優劃分屬性a*;
9: for a*中的每一個值a*v do
10:       為node生成一個分支,令Dv表示D中在a*上取值為a*v的樣本子集;
11:       if Dv為空 then
12:             將分支結點標記為葉結點,其類別標記為D中樣本最多的類; return;
13:       else
14:             以TreeGenerate(Dv, A\{a*})為分支結點
15:       end if
16: end for

根結點包含所有樣本
遞迴結束的條件有:
第2行:當前結點所有樣本屬於同一類別(標記),無需劃分,將當前結點標記為葉結點,類別為當前樣本類別。
第5行:當前屬性集為空,或是所有樣本在所有屬性上的取值相同,無法劃分
一開始我很納悶為啥會出現這種情況,仔細想了一下應該是訓練樣本中存在衝突資料(即特徵向量完全相同但標記不同),衝突資料的判定測試序列(從根節點到每個葉結點的路徑)完全相同,但是直至屬性集劃分為空或者當前結點下所有樣本在所有屬性上的取值相同時仍然無法進行類別劃分。舉個例子:假設西瓜有三個屬性A,B,C,有兩個訓練樣本在A,B,C上的取值完全相同,但是這兩個樣本最後的標記不同,一個為好瓜,另一個為壞瓜。這樣在生成決策樹時,這兩個訓練樣本的判定測試序列完全相同,但是此時屬性集已經為空,這兩個樣本還沒有劃分成為確定類別。於是就有了第6行的劃分選擇,將當前結點標記為葉結點並將其類別標記成D中樣本數最多的類。
第11行:當前結點包含的樣本集合為空,不能劃分
當前訓練集在當前最優屬性的某一個屬性取值上無樣本,將該分支結點標記為葉結點,類別標記成D中樣本最多的類(當然這只是一種處理方法,可以有其他合理的方法)。我當時的問題是,既然當前結點包含的樣本集合為空,為什麼不能刪除該結點,而是要把它歸為D中樣本最多的類呢?答案是出現這種為空的情況只是當前訓練樣本集的情況,不能代表所有資料,如果某個待測試資料劃分到當前結點時發現決策樹沒有這種情況豈不是很崩潰。