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

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

(完)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值