周志華《機器學習》課後習題解答系列(五):Ch4.3 - 程式設計實現ID3演算法
這裡採用Python-sklearn的方式,環境搭建可參考 資料探勘入門:Python開發環境搭建(eclipse-pydev模式).
相關答案和原始碼託管在我的Github上:PY131/Machine-Learning_ZhouZhihua.
4.3 程式設計實現ID3演算法
這裡基於python程式設計實現的方式,詳細解答和編碼過程如下:(檢視完整程式碼):
1.獲取資料、檢視資料、預分析
這裡由資料表生成.csv檔案(注意中文字元的編碼格式)。採用pandas.read_csv()讀取資料,然後採用seaborn視覺化部分資料來進行初步判斷。
觀察資料可知,變數包含’色澤’等8個屬性,其中6個標稱屬性,2個連續屬性。類標籤為西瓜是否好瓜(兩類):
下面是一些資料視覺化影象:
下圖是含糖率和密度兩個連續變數的視覺化圖,這個圖在之前的練習中也有出現:
下圖則是更多的變數兩兩組合視覺化圖:
基於視覺化手段進行一些分析,可以大概瞭解資料的分佈及其與類別的關係。
2.自己程式設計實現ID3演算法
在進行程式設計之前,先做一些分析如下:
- 對於樹形結構,可以建立節點類來進行操作,根據書p74決策樹基本演算法,廣泛採用遞迴操作;
- 對於連續屬性(密度、含糖率),參考書p83,對其進行離散化(可採用二分法);
- 對於標稱屬性(色澤、紋理等),考慮Python字典,方便操作其特徵類別(如:’色澤’ -> ‘青綠’,’烏黑’,’淺白’);
- 由於資料集完整,這裡暫不考慮缺值問題(若需考慮,可參考書p86-87的加權思路 -> C4.5演算法);
下面是實現過程:
2.1 建立決策樹節點類
該節點類包含當前節點的屬性,向下劃分的屬性取值,節點的類標籤(葉節點有效,為通用性而保留所有節點類標籤);
樣例程式碼如下:
'''
definition of decision node class
@variable attr: attribution as parent for a new branching
@variable attr_down: dict: {key, value}
key: categoric: categoric attr_value
continuous: '<=div_value' for small part
'>div_value' for big part
value: children (Node class)
@variable label: class label (the majority of current sample labels)
'''
class Node(object):
def __init__(self, attr_init=None, attr_down_init={}, label_init=None):
self.attr = attr_init
self.attr_down = attr_down_init
self.label = label_init
2.2 遞迴實現決策樹生成演算法主體
基本的決策樹生成演算法參照書p74-圖4.2,如下所示:
下面是演算法主體程式碼,注意對連續變數和離散變數的不同操作:
'''
Branching for decision tree using recursion
@param df: the pandas dataframe of the data_set
@return root: Node, the root node of decision tree
'''
def TreeGenerate(df):
# generating a new root node
new_node = Node(None, None, {})
label_arr = df[df.columns[-1]]
label_count = NodeLabel(label_arr)
if label_count: # assert the label_count isn's empty
new_node.label= max(label_count, key=label_count.get)
# end if there is only 1 class in current node data
# end if attribution array is empty
if len(label_count) == 1 or len(label_arr) == 0:
return new_node
# get the optimal attribution for a new branching
new_node.attr, div_value = OptAttr(df)
# recursion
if div_value == 0: # categoric variable
value_count = ValueCount(df[new_node.attr])
for value in value_count:
df_v = df[ df[new_node.attr].isin([value]) ] # get sub set
# delete current attribution
df_v = df_v.drop(new_node.attr, 1)
new_node.attr_down[value] = TreeGenerate(df_v)
else: # continuous variable # left and right child
value_l = "<=%.3f" % div_value
value_r = ">%.3f" % div_value
df_v_l = df[ df[new_node.attr] <= div_value ] # get sub set
df_v_r = df[ df[new_node.attr] > div_value ]
new_node.attr_down[value_l] = TreeGenerate(df_v_l)
new_node.attr_down[value_r] = TreeGenerate(df_v_r)
return new_node
2.3 最優劃分屬性選擇-資訊增益判斷
ID3演算法採用資訊增益最大化來實現最優劃分屬性的選擇,這裡主要的挑戰是離散和連續兩種屬性變數的分別操作。對於離散變數(categoric variable),參考書p75-77內容實現,對於連續變數(continuous variable),採用書p83-85所介紹的二分法實現。
相關內容如資訊熵、資訊增益最大化、二分法等可參考書p75-76及p84頁內容。
具體的實現程式碼:檢視完整程式碼。
如下所示為綜合了離散類別變數和連續變數的資訊增益計算程式碼實現:
'''
calculating the information gain of an attribution
@param df: dataframe, the pandas dataframe of the data_set
@param attr_id: the target attribution in df
@return info_gain: the information gain of current attribution
@return div_value: for discrete variable, value = 0
for continuous variable, value = t (the division value)
'''
def InfoGain(df, attr_id):
info_gain = InfoEnt(df.values[:,-1]) # info_gain for the whole label
div_value = 0 # div_value for continuous attribute
n = len(df[attr_id]) # the number of sample
# 1.for continuous variable using method of bisection
if df[attr_id].dtype == (float, int):
sub_info_ent = {} # store the div_value (div) and it's subset entropy
df = df.sort([attr_id], ascending=1) # sorting via column
df = df.reset_index(drop=True)
data_arr = df[attr_id]
label_arr = df[df.columns[-1]]
for i in range(n-1):
div = (data_arr[i] + data_arr[i+1]) / 2
sub_info_ent[div] = ( (i+1) * InfoEnt(label_arr[0:i+1]) / n ) \
+ ( (n-i-1) * InfoEnt(label_arr[i+1:-1]) / n )
# our goal is to get the min subset entropy sum and it's divide value
div_value, sub_info_ent_max = min(sub_info_ent.items(), key=lambda x: x[1])
info_gain -= sub_info_ent_max
# 2.for discrete variable (categoric variable)
else:
data_arr = df[attr_id]
label_arr = df[df.columns[-1]]
value_count = ValueCount(data_arr)
for key in value_count:
key_label_arr = label_arr[data_arr == key]
info_gain -= value_count[key] * InfoEnt(key_label_arr) / n
return info_gain, div_value
2.4 劃分訓練集和測試集進行測試
首先給出預測函式,採用簡單的向下搜尋即可實現。檢視完整程式碼。
通過多次劃分訓練集和測試集,評估出所生成的完全決策樹的預測精度,下面是幾種不同情況下的結果和分析:
訓練集為整個資料樣本的情況:
accuracy: 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 average accuracy: 1.000
此時預測準度為100%,結果證明了題4-1。
採用pydotplus.graphviz繪相簿,可以畫出這樣一棵完全決策樹如下圖(點選檢視繪圖程式):
訓練集與測試集各取一半:
accuracy: 0.556 0.778 0.333 0.778 0.444 0.333 0.667 0.444 0.778 0.333 average accuracy: 0.544
多次實驗預測準度均在55%左右(幾乎等同於隨機預測),說明此時模型無實用性。
按照K折交叉驗證模型(k=5):
accuracy: 1.000 0.000 0.667 1.000 0.000 average accuracy: 0.533
結果精度依然很不理想,可以看到,不同的訓練集與測試集的劃分導致結果差別很大,這主要是由於資料量太少的緣故。
只分析離散屬性:
accuracy: 1.000 0.000 0.333 0.667 0.000 average accuracy: 0.400
此時由於特徵資訊減少,模型更差了。
綜上,為提高決策樹泛化預測精度,需要進一步對其進行剪枝。關於剪枝實現可參考下一題。
相關參考:
1.seaborn/matplotlib視覺化、中文字元處理:
- seaborn官網 - Plotting with categorical data
- seaborn顯示中文 - The solution of display chinese in seaborn plot
- Linux下解決matplotlib中文亂碼的方法
- Unicode和Python的中文處理
2.python基礎知識:
3.決策樹繪製相關:
相關文章
- 周志華《機器學習》課後習題解答系列(五):Ch4.4 - 程式設計實現CART演算法與剪枝操作機器學習程式設計演算法
- 周志華《機器學習》課後習題解答系列(一):目錄機器學習
- 周志華《機器學習》課後習題解答系列(六):Ch5.5 - BP演算法實現機器學習H5演算法
- 周志華《機器學習》課後習題解答系列(五):Ch4 - 決策樹機器學習
- 周志華《機器學習》課後習題解答系列(四):Ch3.3 - 程式設計實現對率迴歸機器學習程式設計
- 周志華《機器學習》課後習題解答系列(四):Ch3.5 - 程式設計實現線性判別分析機器學習程式設計
- 周志華《機器學習》課後習題解答系列(四):Ch3 - 線性模型機器學習模型
- 周志華《機器學習》課後習題解答系列(六):Ch5.6 - BP演算法改進機器學習H5演算法
- 周志華《機器學習》課後習題解答系列(六):Ch5.8 - SOM網路實驗機器學習H5
- 周志華《機器學習》課後習題解答系列(六):Ch5.7 - RBF網路實驗機器學習H5
- 周志華《機器學習》課後習題解答系列(六):Ch5 - 神經網路機器學習H5神經網路
- 機器學習-周志華-課後習題答案5.5機器學習
- 周志華《機器學習》課後習題解答系列(四):Ch3.4 - 交叉驗證法練習機器學習
- 周志華《機器學習》課後習題解答系列(三):Ch2 - 模型評估與選擇機器學習模型
- 周志華《機器學習》課後習題解答系列(六):Ch5.10 - 卷積神經網路實驗機器學習H5卷積神經網路
- 機器學習-周志華機器學習
- 周志華 機器學習ppt機器學習
- 周志華西瓜書《機器學習》機器學習
- 重磅!周志華《機器學習》手推筆記來了!機器學習筆記
- 北大張志華:機器學習就是現代統計學機器學習
- 機器學習定義及基本術語(根據周志華的《機器學習》概括)機器學習
- 《機器學習導論》和《統計機器學習》學習資料:張志華教授機器學習
- AI會議排名_周志華AI
- 周志華西瓜書《機器學習》第三章線性模型機器學習模型
- 決策樹ID3演算法python實現 -- 《機器學習實戰》演算法Python機器學習
- 《機器學習實戰》決策樹(ID3演算法)的分析與實現機器學習演算法
- 2018 AI World 觀後感——周志華教授partAI
- 《80X86組合語言程式設計》課後習題答案(華中科技大學王元珍版本)組合語言程式設計
- AI會議的總結(by南大周志華)AI
- 《Python程式設計》第七章部分課後練習題Python程式設計
- 《Python程式設計》第十一章部分課後練習題Python程式設計
- 周志華《機器學習》西瓜書精煉版筆記來了!16 章完整版機器學習筆記
- 機器學習之決策樹ID3(python實現)機器學習Python
- 《C和指標》第三章課後習題解答指標
- 周志華西瓜書《機器學習筆記》學習筆記第二章《模型的評估與選擇》機器學習筆記模型
- 機器學習演算法原理與程式設計學習(2)機器學習演算法程式設計
- 好程式設計師web前端學習路線解答前後端對接問題程式設計師Web前端後端
- 《Python程式設計》第八章部分課後練習題Python程式設計