讀古今文學網 > 機器學習實戰 > 3.4 示例:使用決策樹預測隱形眼鏡類型 >

3.4 示例:使用決策樹預測隱形眼鏡類型

本節我們將通過一個例子講解決策樹如何預測患者需要佩戴的隱形眼鏡類型。使用小數據集,我們就可以利用決策樹學到很多知識:眼科醫生是如何判斷患者需要佩戴的鏡片類型;一旦理解了決策樹的工作原理,我們甚至也可以幫助人們判斷需要佩戴的鏡片類型。

示例:使用決策樹預測隱形眼鏡類型

  1. 收集數據:提供的文本文件。
  2. 準備數據:解析tab鍵分隔的數據行。
  3. 分析數據:快速檢查數據,確保正確地解析數據內容,使用createPlot函數繪製最終的樹形圖。
  4. 訓練算法:使用3.1節的createTree函數。
  5. 測試算法:編寫測試函數驗證決策樹可以正確分類給定的數據實例。
  6. 使用算法:存儲樹的數據結構,以便下次使用時無需重新構造樹。

隱形眼鏡數據集1 是非常著名的數據集,它包含很多患者眼部狀況的觀察條件以及醫生推薦的隱形眼鏡類型。隱形眼鏡類型包括硬材質、軟材質以及不適合佩戴隱形眼鏡。數據來源於UCI數據庫,為了更容易顯示數據,本書對數據做了簡單的更改,數據存儲在源代碼下載路徑的文本文件中。

1. The dataset is a modified version of the Lenses dataset retrieved from the UCI Machine Learning Repository November 3, 2010 [http://archive.ics.uci.edu/ml/machine-learning-databases/lenses/]. The source of the data is Jadzia Cendrowska and was originally published in 「PRISM: An algorithm for inducing modular rules,」 in International Journal of Man-Machine Studies (1987), 27, 349–70.)

可以在Python命令提示符中輸入下列命令加載數據:

>>> fr=open('lenses.txt』)
>>> lenses=[inst.strip.split('\t') for inst in fr.readlines]
>>> lensesLabels=['age', 'prescript', 'astigmatic', 'tearRate']
>>> lensesTree = trees.createTree(lenses,lensesLabels)
>>> lensesTree
{'tearRate': {'reduced': 'no lenses', 'normal': {'astigmatic': {'yes':
{'prescript': {'hyper': {'age': {'pre': 'no lenses', 'presbyopic':
'no lenses', 'young':'hard'}}, 'myope': 'hard'}}, 'no': {'age': {'pre':
'soft', 'presbyopic': {'prescript': {'hyper': 'soft', 'myope':
'no lenses'}}, 'young': 'soft'}}}}}}
>>> treePlotter.createPlot(lensesTree) 
  

採用文本方式很難分辨出決策樹的模樣,最後一行命令調用createPlot函數繪製了如圖3-8所示的樹形圖。沿著決策樹的不同分支,我們可以得到不同患者需要佩戴的隱形眼鏡類型。從圖3-8上我們也可以發現,醫生最多需要問四個問題就能確定患者需要佩戴哪種類型的隱形眼鏡。

圖3-8 由ID3算法產生的決策樹

圖3-8所示的決策樹非常好地匹配了實驗數據,然而這些匹配選項可能太多了。我們將這種問題稱之為過度匹配(overfitting)。為了減少過度匹配問題,我們可以裁剪決策樹,去掉一些不必要的葉子節點。如果葉子節點只能增加少許信息,則可以刪除該節點,將它併入到其他葉子節點中。第9章將進一步討論這個問題。

第9章將學習另一個決策樹構造算法CART,本章使用的算法稱為ID3,它是一個好的算法但並不完美。ID3算法無法直接處理數值型數據,儘管我們可以通過量化的方法將數值型數據轉化為標稱型數值,但是如果存在太多的特徵劃分,ID3算法仍然會面臨其他問題。