寫程式學ML:決策樹演算法原理及實現(四)
阿新 • • 發佈:2019-01-29
[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、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可以訪問如下目錄獲取:
(完)