决策树后剪枝算法(一)代价复杂度剪枝CPP
决策树后剪枝算法(二)错误率降低剪枝REP
决策树后剪枝算法(三)悲观错误剪枝PEP
决策树后剪枝算法(四)最小错误剪枝MEP
剪枝,是一个“用准确性换取简单性”的思想。它允许决策树对训练集过拟合,再通过删除对泛化精度无贡献的子分支,从而修剪出一颗较小的树。以下列出几种较常见的后剪枝算法,及其机制对比:
CCP | REP | PEP | MEP | |
---|---|---|---|---|
剪枝方式 | 自底向上 | 自底向上 | 自顶向下 | 自底向上 |
计算复杂度 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n ) O(n) O(n) | O ( n ) O(n) O(n) |
误差估计 | 标准误差 | 剪枝集上误差 | 连续性矫正 | 概率估计 |
是否需要额外剪枝集 | 否 | 是 | 否 | 否 |
(3)悲观错误剪枝
悲观错误剪枝(PEP)是Quinlan为了克服REP方法需要独立剪枝数据集的缺点而提出的,它不需要分离的剪枝数据集。该方法引入了统计学上“连续修正”的概念来弥补REP中的缺陷, 在评价子树的训练错误公式中添加了一个常数,以提高未来样本数据的预测可靠性。特别说明,PEP为自顶向下的剪枝方法。
(3.1)数学推导
REP错误率回顾:
单节点分类错误率
:
r
(
t
)
=
e
(
t
)
n
(
t
)
子树节点分类错误率
:
r
(
T
t
)
=
∑
s
∈
T
2
e
(
s
)
∑
s
∈
T
2
n
(
s
)
单节点分类错误率:r(t)=\frac{e(t)}{n(t)}\\ 子树节点分类错误率:r(T_t)=\frac{\sum_{s\in T_2}e(s)}{\sum_{s\in T_2}n(s)}
单节点分类错误率:r(t)=n(t)e(t)子树节点分类错误率:r(Tt)=∑s∈T2n(s)∑s∈T2e(s)
PEP改进:
单节点错误率
:
r
(
t
)
=
e
(
t
)
+
0.5
n
(
t
)
子树节点错误率
:
r
(
T
t
)
=
∑
i
=
1
L
e
(
i
)
+
0.5
L
∑
i
=
1
L
n
(
i
)
单节点错误率:r(t)=\frac{e(t)+0.5}{n(t)}\\ 子树节点错误率:r(T_t)=\frac{\sum_{i=1}^{L}e(i)+0.5L}{\sum_{i=1}^{L}n(i)}
单节点错误率:r(t)=n(t)e(t)+0.5子树节点错误率:r(Tt)=∑i=1Ln(i)∑i=1Le(i)+0.5L
解读:
- 0.5 为惩罚因子,为二项概率分布近似的 连续修正因子。
- L L L 为叶子节点个数, 即 ∣ f ( T t ) ∣ |f(T_t)| ∣f(Tt)∣,单节点 ∣ f ( t ) ∣ = 1 |f(t)|=1 ∣f(t)∣=1
进一步推导,由于误差可视为二项分布,即有均值
μ
=
n
p
\mu=np
μ=np,方差
σ
2
=
n
p
q
\sigma^2=npq
σ2=npq(正确为
p
p
p,错误为
q
q
q),有:
标准差
:
S
E
(
e
(
T
t
)
)
=
(
∑
i
=
1
L
e
(
i
)
+
0.5
L
)
(
n
(
t
)
−
∑
i
=
1
L
e
(
i
)
−
0.5
L
)
n
(
t
)
标准差:SE(e(T_t))=\sqrt{\frac{(\sum_{i=1}^{L}{e(i)+0.5L})(n(t)-\sum_{i=1}^{L}e(i)-0.5L)}{n(t)}}
标准差:SE(e(Tt))=n(t)(∑i=1Le(i)+0.5L)(n(t)−∑i=1Le(i)−0.5L)
即我们引出剪枝判断标准:
∑
i
=
1
L
e
(
i
)
+
0.5
L
+
S
E
(
e
(
T
t
)
)
≥
e
(
t
)
+
0.5
\sum_{i=1}^{L}e(i)+0.5L+SE(e(T_t))\geq{e(t)+0.5}
i=1∑Le(i)+0.5L+SE(e(Tt))≥e(t)+0.5
即-剪枝后的错误数
≤
\leq
≤ 剪枝前的错误数(标准差在这里充当置信区间,当然也可以选定其他标准)
确认了剪枝判断条件,接下来自顶向下递归遍历每个非叶子节点即可,当然节点类别标签还是多数表决决定。
(3.2)算法流程
考虑决策树上每个分支节点作为剪枝候选对象,自顶向下遍历,判断是否剪枝步骤如下:
- (1)删除以此节点为根的子树,使其成为叶子结点。
- (2)根据多数表决法,赋予该节点关联的训练数据类别。
- (3)比较删除前后剪枝判断条件,判断是否剪枝该节点。
(3.3)例题计算
下面举一个例子进行说明,下图待剪枝决策树有三个类别,每个节点类别及各分类样本数均如图矩形框中列出。
节点"node 27"
e
(
T
27
)
=
∑
i
=
1
L
e
(
i
)
+
0.5
L
=
2
+
0
+
0.5
×
2
=
3
S
E
(
e
(
T
27
)
)
=
(
∑
i
=
1
L
e
(
i
)
+
0.5
L
)
(
n
(
t
)
−
∑
i
=
1
L
e
(
i
)
−
0.5
L
)
n
(
t
)
=
(
2
+
0.5
×
2
)
(
20
−
2
−
0.5
×
2
)
20
=
1.59687
故有
∑
i
=
1
L
e
(
i
)
+
0.5
L
+
S
E
(
e
(
T
t
)
)
<
e
(
t
27
)
+
0.5
=
5
+
0.5
e(T_{27})=\sum_{i=1}^{L}e(i)+0.5L=2 +0+0.5\times2=3\\ SE(e(T_{27}))=\sqrt{\frac{(\sum_{i=1}^{L}{e(i)+0.5L})(n(t)-\sum_{i=1}^{L}e(i)-0.5L)}{n(t)}}=\sqrt{\frac{(2+0.5\times2)(20-2-0.5\times2)}{20}}=1.59687\\ 故有\sum_{i=1}^{L}e(i)+0.5L+SE(e(T_t))<{e(t_{27})+0.5}=5+0.5
e(T27)=i=1∑Le(i)+0.5L=2+0+0.5×2=3SE(e(T27))=n(t)(∑i=1Le(i)+0.5L)(n(t)−∑i=1Le(i)−0.5L)=20(2+0.5×2)(20−2−0.5×2)=1.59687故有i=1∑Le(i)+0.5L+SE(e(Tt))<e(t27)+0.5=5+0.5
因此,"node 27"判断为不可以剪枝。
节点"node 26"
对于"node 26"也是不能剪枝的,在此请自行计算验证。
(3.4)代码实现
C4.5算法及PEP剪枝手写实现
链接:https://pan.baidu.com/s/1HsZeZy34WhC0rImRNPlFqQ?pwd=y56n
提取码:y56n
代码参考:http://www.hzcourse.com/web/refbook/detail/9970/226
————————————————————————————————————————————————————————————
参考资料:
[1] 现代决策树模型及其编程实践 黄智濒 编著