Error Based Pruning剪枝算法、代码实现与举例
EBP(Error Based Pruning):
下列算法轉載自鏈接:
weka3初體驗以J48(C4.5)構造決策樹以及setoptions各參賽含義
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條數據中,一條數據預測錯誤,那么錯誤率是116\frac{1}{16}161?
根據這個實際錯誤率,使用置信區間25%估算得到“悲觀錯誤率”(pessimistic error rate):
U0.25(1,16)=0.157U_{0.25}(1,16)=0.157U0.25?(1,16)=0.157
然后用這個"悲觀錯誤率"來預測上面的悲觀錯誤數量,
再把悲觀錯誤疊加到實際錯誤數量上,然后再進行“維持原樣”、“剪枝”、“嫁接”的“悲觀錯誤數量”進行比較,哪個的“悲觀錯誤數量”最小就用哪種。
關于U0.25(1,16)=0.157U_{0.25}(1,16)=0.157U0.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。
總結
以上是生活随笔為你收集整理的Error Based Pruning剪枝算法、代码实现与举例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: U25%(1,16) and U25%(
- 下一篇: C4.5-Release8的代码架构图