[题外话]近期申请了一个微信公众号:平凡程式人生。有兴趣的朋友可以关注,那里将会涉及更多更新机器学习、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可以访问如下目录获取:
https://github.com/stevewang0/MLInAction
(完)