在决策树(一)中,我们介绍了三种不同的特征选择方式。
ID3使用的是信息增益准则,C4.5使用的是信息增益率准则,CART在分类时使用的是基尼指数。
ID3算法的不足
- 没有考虑连续特征
- 信息增益偏好取值数目较多的特征
- 没有考虑缺失值
- 没有考虑过拟合的问题
C4.5对ID3中的四个问题进行了改进
-
连续特征离散化:使用二分法对连续特征进行处理
属性a在样本集D中有n个不同的值,将其从小到大排列,有n-1个区间,将每个区间 [ a i , a i + 1 ] [a_i,a_{i+1}] [ai,ai+1]的中位点 ( a i + a i + 1 ) / 2 (a_i+a_{i+1})/2 (ai+ai+1)/2作为候选划分点。然后选择最优的划分点。
!!!和离散属性不同,如果当前节点为连续属性,该属性后面还可以参与子节点的特征选择。 -
使用了信息增益率。
具体来说,并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式方法:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。 -
缺失值处理:
在决策树学习开始阶段,根节点中各样本的权值初始化为1。仅根据在属性a上没有缺失值的样本子集中判断属性a的优劣。
确定好划分属性a后,在属性a上有取值的样本被划分到其对应的子节点,同时它的权值保持不变;在属性a上有缺失值的样本被划分到各个子节点,同时它的权值为
w
x
⋅
r
v
w_x \cdot r_v
wx⋅rv
其中,
r
v
r_v
rv为:
- 引入了正则化系数进行初步的剪枝。在CART部分会详细讲解剪枝的思路。
C4.5算法的不足
- 因为决策树算法非常容易过拟合,因此剪枝必不可少。C4.5的剪枝方法有优化的空间
- C4.5生成的是多叉树,如果采用二叉树,可以提高效率
- C4.5只能用于分类
- C4.5里的对数运算以及对连续特征的的排序太耗时
CART对C4.5中的问题进行了改进,scikit-learn的决策树使用的就是CART算法。
CART
CART可以进行回归,也可以进行分类。
1. CART分类树算法
a) ID3和C4.5都是基于熵模型的,会涉及大量的对数运算。
在决策树(一)中,对基尼指数进行了介绍,CART分类树采用的基尼指数进行属性选择,基尼指数代表了不纯度,因此基尼指数越小,特征越好。
b) 为了进一步简化,CART分类树算法每次仅仅对特征的值进行二分,因此建立起来的是二叉树。
c) CART分类树对连续特征的处理和C4.5是相同的,只是用基尼指数来度量。需要注意的是,CART分类树处理离散属性时,该属性还可以参与后面子节点的特征选择过程(因为CART分类树是二叉树!!!)。而在ID3和C4.5中,离散特征不可重复使用。
2. CART回归树算法
回归树和分类树的不同在于样本输出的是连续值。
a) 回归树算法中选择特征的度量方式不再用基尼指数,而是使用平方误差最小化准则。
其中,
c
1
c_1
c1为
D
1
D_1
D1样本集的样本输出均值,
c
2
c_2
c2为
D
2
D_2
D2样本集的样本输出均值。
预测阶段,将叶子里训练样本集的均值作为预测输出结果。
3.剪枝
决策树剪枝的基本策略有“预剪枝”和“后剪枝”。
预剪枝技术运用较少,下面介绍四种后剪枝方法
a) reduced error pruning(REP,错误率降低剪枝)
一种简单的后剪枝方法。需要使用验证集来评估是否进行剪枝。自底向上,当修剪后的树对于验证集的性能不会变差时,才会进行修剪。
REP简单,但是容易过度修剪。
b) pessimistic error pruning(PEP,悲观错误剪枝)
C4.5采用悲观错误剪枝。
不需要验证集,由于决策树的生成和剪枝都使用训练集,所以产生的错分样本率是有误差的,即偏向于训练集。对此,基于二项分布的连续校正公式对训练集产生的错分样本率进行了校正。
唯一自上而下的修剪方法。引入了统计学上连续修正的概念。
对于一内部节点 t t t,将其作为叶子节点后的连续校正后的错分样本率为 ( e ( t ) + 0.5 ) / n ( t ) (e(t)+0.5)/n(t) (e(t)+0.5)/n(t),其中, n ( t ) n(t) n(t)是落入该叶子的所有样本数, e ( t ) e(t) e(t)是该叶子中误分类样本数。经过连续校正后的错分样本数为 e ( t ) + 0.5 e(t)+0.5 e(t)+0.5。
内部节点 t t t对应的子树的叶节点的错分率为 ( ∑ e i + 0.5 ∗ L ) / ∑ n i (\sum e_i + 0.5*L)/\sum n_i (∑ei+0.5∗L)/∑ni,其中, L L L是叶节点的个数。未剪枝的错分样本数为 ∑ e i + 0.5 ∗ L \sum e_i + 0.5*L ∑ei+0.5∗L。
引入子树服从二项分布,对应的均值和标准差分别是
n
p
np
np和
n
p
(
1
−
p
)
\sqrt{np(1-p)}
np(1−p)。
剪枝的准则(使用的是悲观错误数):
e
(
t
)
+
0.5
≤
∑
e
i
+
0.5
∗
L
+
(
∑
e
i
+
0.5
∗
L
)
∗
(
1
−
(
∑
e
i
+
0.5
∗
L
)
/
n
(
t
)
)
e(t)+0.5 \leq \sum e_i+0.5*L + \sqrt{(\sum e_i+0.5*L)*(1-(\sum e_i+0.5*L)/n(t))}
e(t)+0.5≤∑ei+0.5∗L+(∑ei+0.5∗L)∗(1−(∑ei+0.5∗L)/n(t))
c) cost complexity pruning (代价复杂度剪枝,CCP)
计算复杂度
O
(
n
2
)
O(n^2)
O(n2)。CART的剪枝算法。
为子树定义了代价和复杂度,用
α
\alpha
α来进行两者的权衡。
α
=
R
(
t
)
−
R
(
T
t
)
N
t
−
1
\alpha = \frac{R(t)-R(T_t)}{N_t-1}
α=Nt−1R(t)−R(Tt)。
原始树
T
0
T_0
T0,在
T
0
T_0
T0中减去
α
\alpha
α最小的子树,得到
T
1
T_1
T1,再从
T
1
T_1
T1中找到
α
\alpha
α最小的子树,依次剪枝下去,直到得到根节点。
然后在得到的子树序列
T
0
,
T
1
,
.
.
.
,
T
n
T_0,T_1,...,T_n
T0,T1,...,Tn中通过独立的验证集来选取最优子树。
d) minimum error pruning (最小误差剪枝,MEP)
采用自底向上的方式,不需要独立的验证集。
[1] https://www.cnblogs.com/pinard/p/6050306.html
[2] http://www.cnblogs.com/pinard/p/6053344.html
[3] https://blog.youkuaiyun.com/bbbeoy/article/details/66974798
[4] https://zhuanlan.zhihu.com/p/30296061
[5] http://www.doc88.com/p-117630831577.html
[6] https://blog.youkuaiyun.com/lizhengl/article/details/54968291
[7] https://blog.youkuaiyun.com/ljp812184246/article/details/47424781
[8] https://blog.youkuaiyun.com/yujianmin1990/article/details/49864813