1. 程式人生 > >Error Based Pruning剪枝演算法、程式碼實現與舉例

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。