本节我们将通过一个例子讲解决策树如何预测患者需要佩戴的隐形眼镜类型。使用小数据集,我们就可以利用决策树学到很多知识:眼科医生是如何判断患者需要佩戴的镜片类型;一旦理解了决策树的工作原理,我们甚至也可以帮助人们判断需要佩戴的镜片类型。
示例:使用决策树预测隐形眼镜类型
- 收集数据:提供的文本文件。
- 准备数据:解析tab键分隔的数据行。
- 分析数据:快速检查数据,确保正确地解析数据内容,使用
createPlot
函数绘制最终的树形图。- 训练算法:使用3.1节的
createTree
函数。- 测试算法:编写测试函数验证决策树可以正确分类给定的数据实例。
- 使用算法:存储树的数据结构,以便下次使用时无需重新构造树。
隐形眼镜数据集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算法仍然会面临其他问题。