1. 程式人生 > >寫程式學ML:決策樹演算法原理及實現(四)

寫程式學ML:決策樹演算法原理及實現(四)

[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。

2.3   決策樹的測試

書中使用隱形眼鏡資料集對決策樹進行了測試。

建立測試檔案contactLenses4DecisionTree.py;

開啟儲存隱形眼鏡資料集的檔案lenses.txt,從中讀取每一行資料;

定義儲存特徵的變數;

呼叫模組DecisionTree的函式createTree(),構建整個決策樹;

呼叫模組DecisionTreePlotter的函式createPlot()繪製整棵決策樹;

呼叫模組DecisionTree的函式classify()對測試樣本進行判斷;

具體程式碼如下:
fr = open('lenses.txt') #開啟樣本集檔案
#strip() 方法用於移除字串頭尾指定的字元(預設為空格)
#split()通過指定分隔符對字串進行切片,如果引數num 有指定值,則僅分隔 num 個子字串
#str.split(str="", num=string.count(str))
#readlines()從檔案中一行一行地讀資料,返回一個列表;讀取的行資料包含換行符
#從樣本集檔案中讀取所有的行,用換行符分開,去除每行行首和行末的空格,儲存到列表變數lenses中
lenses = [inst.strip().split('\t') for inst in fr.readlines()]
lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate'] #定義樣本集的特徵集
lensesTree = DecisionTree.createTree(lenses, lensesLabels) #呼叫模組DecisionTree的函式createTree對樣本集產生決策樹
print lensesTree
storeTree(lensesTree, 'DecisionTreeStorage.txt') #將決策樹儲存到檔案中

inTree = grabTree('DecisionTreeStorage.txt') #從檔案中載入決策樹
DecisionTreePlotter.createPlot(inTree) #呼叫模組DecisionTreePlotter的函式createPlot繪製產生的決策樹

lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate'] #定義樣本集的特徵集
print DecisionTree.classify0(inTree, lensesLabels, ['young','hyper','no','normal'])
print DecisionTree.classify(inTree, lensesLabels, ['young','hyper','no','reduced'])

它們的測試結果如下:

soft

no lenses

模組DecisionTreePlotter的函式createPlot()繪製的整棵決策樹如下:


3、小結

決策樹分類器就像帶有終止塊的流程圖,終止塊表示分類結果。開始處理資料集時,首先需要測量集合中資料的不一致性,也就是熵,然後尋找最優方案劃分資料集,直到資料集中的所有資料屬於同一分類。

決策樹非常好地匹配了實驗資料,然而這些匹配選項可能太多了。將這種問題稱為過度匹配(overfitting)。

ID3演算法可以用於劃分標稱型資料集。該演算法會產生過度匹配資料集的問題。可以通過裁剪決策樹,合併相鄰的無法產生大量資訊增益的葉節點,消除過度匹配問題。

其他決策樹構造演算法,最流行的是C4.5和CART。

本文中涉及的所有code可以訪問如下目錄獲取:

(完)