写程序学ML:决策树算法原理及实现(四)

来源:互联网 发布:淘宝sony耳机真假 编辑:程序博客网 时间:2024/05/23 15:30

[题外话]近期申请了一个微信公众号:平凡程式人生。有兴趣的朋友可以关注,那里将会涉及更多更新机器学习、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 lensesTreestoreTree(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

(完)
阅读全文
0 0