Error Based Pruning剪枝算法、代码实现与举例

EBP(Error Based Pruning):
下列算法转载自链接:
https://login.sina.com.cn/crossdomain2.php?action=login&entry=blog&r=http%3A%2F%2Fblog.sina.com.cn%2Fs%2Fblog_64ecfc2f0101r3o5.html%3Fsudaref%3Dwww.baidu.com%26display%3D0&login_time=1541312241&sign=11e7e46674643370

EBP算法的具体实现在
http://www.rulequest.com/Personal/c4.5r8.tar.gz
的prune.c文件中,由于是C写的,所以我写了个EBP剪枝算法的python接口:
https://github.com/appleyuchi/Decision_Tree_Prune

下面的BranchErrors、LeafErrors + ExtraLeafErrors、BranchErrors来自代码中的prune.c中的变量
•第一步:计算叶节点的错分样本率估计的置信区间上限U
•第二步:计算叶节点的预测错分样本数
–叶节点的预测错分样本数=到达该叶节点的样本数*该叶节点的预测错分样本率U
•第三步:判断是否剪枝及如何剪枝
–分别计算三种预测错分样本数:
•计算子树t的所有叶节点预测错分样本数之和,记为TreeErrors
•计算子树t被剪枝以叶节点代替时的预测错分样本数,记为LeafErrors + ExtraLeafErrors
•计算子树t的最大分枝的预测错分样本数,记为BranchErrors
–比较TreeErrors,LeafErrors + ExtraLeafErrors ,BranchErrors,如下:
•TreeErrors最小时,不剪枝
•LeafErrors + ExtraLeafErrors 最小时,进行剪枝,以一个叶节点代替t
•BranchErrors最小时,采用“嫁接”(grafting)策略,即用这个最大分枝代替t

EBP算法的最早提出在
<Quinlan的C4.5:program for machine learning>
的37页,
提出的时候没有提到嫁接,分析案例時39頁提到了嫁接。

解释下嫁接:
1.嫁接不是整个子树剪掉,而是减掉其中的一些树枝。
2.当测试数据到达叶子节点的上面一个分割点的时候,如果树枝的属性取值与该测试数据的属性取值不一致,那么此时测试数据的类别就以
“最初根节点到当前分割节点”为止的数据集的比例最大的类别作为该测试数据的判定类别。

具体实例:
<Quinlan的C4.5:program for machine learning>
P37-39

在这里插入图片描述

上述结果可以采用上面的http://www.rulequest.com/Personal/c4.5r8.tar.gz
来重現,使用vote数据集,运行方法:
1)c4.5.c中把DF改为vote,
并且在当前路径下放置vote.names,vote.data两个文件
2)make all
3)./c4.5

运行过程分析:
总共进行了3次剪枝,1次嫁接。
其中:
physician fee free=n:这个分支进行了2次剪枝,
1step:对adoption of the budget resolution=n进行剪枝
2step:对pysician fee feeze=n进行剪枝
注意是Bottom-Top

physician fee free=y:这个分支进行了1次剪枝
physician fee free=u:这个分支进行了1次嫁接

注意整个过程是down-top方式遍历
例如physician fee free=n这个分支的剪枝过程就体现down-top

EBP是PEP更加悲观的算法,所谓的“悲观”到底体现在哪里?
例如16条数据中,一条数据预测错误,那么错误率是 1 16 \frac{1}{16}
根据这个实际错误率,使用置信区间25%估算得到“悲观错误率”(pessimistic error rate):
U 0.25 ( 1 , 16 ) = 0.157 U_{0.25}(1,16)=0.157
然后用这个"悲观错误率"来预测上面的悲观错误数量,
再把悲观错误叠加到实际错误数量上,然后再进行“维持原样”、“剪枝”、“嫁接”的“悲观错误数量”进行比较,哪个的“悲观错误数量”最小就用哪种。
关于 U 0.25 ( 1 , 16 ) = 0.157 U_{0.25}(1,16)=0.157 的悲观错误率、悲觀錯誤數量的估算方法如下:
https://blog.csdn.net/appleyuchi/article/details/83834101

另外J48的剪枝算法是EBP和REP,不是PEP,
Quinlan的C4.5-Release8的实现版本中,
http://www.rulequest.com/Personal/c4.5r8.tar.gz
使用的剪枝算法也是EBP,不是PEP。

猜你喜欢

转载自blog.csdn.net/appleyuchi/article/details/83863469