4.1基本流程
决策树基于树结构来进行决策,决策过程的最终结论对应了我们所希望的判定结果,决策过程的每个判定问题是对某个属性的测试。
决策树是一种非参数的监督学习方法,它能从数据中学习出一系列规则,并用树结构呈现出来。
一般来说,一棵决策树包含一个根节点、若干个内部节点和若干个叶节点。根节点对应样本全集,从根节点到叶节点的路径对应了一个判定测试序列。根节点和内部节点包含的样本集会根据测试结果划分到子节点中,通过一系列规则测试后,最终到达叶子节点。
4.2划分流程
决策树的关键:如何选择最优划分属性。一般而言,我们希望随着划分过程不断进行,决策树的分支节点所包含的样本尽可能属于同一类别,即节点的“纯度”越来越高。
4.2.1信息增益
“信息熵”是度量样本集合纯度最常用的一种指标。信息熵越小,纯度越高。 E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k Ent(D)=-\sum_{k=1}^{|y|}p_k log_2 p_k Ent(D)=−k=1∑∣y∣pklog2pk熵的最小值为0,比如二类中有一类样本数为0,那么计算出来的熵为0。
假定离散属性a有V个可能的取值,若使用a来进行划分,会产生V个分支,每个分支节点包含了D中属性a取值为
a
v
a^v
av的样本,记为
D
v
D^v
Dv。若使用特征a进行划分,信息增益为
G
a
i
n
(
D
,
a
)
=
E
n
t
(
D
)
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
E
n
t
(
D
v
)
Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)
Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
一般而言,信息增益越大,意味着使用特征a来进行划分所带来的纯度提升越大。因此,可以使用信息增益作为准则来进行决策树划分属性的选择,著名的ID3决策树即是如此。
缺点:信息增益准则对取值数目较多的特征有所偏好。
4.2.2增益率
由于信息增益准则对取值数目较多的特征有所偏好,为减少这种偏好可能带来的不利影响,著名的C4.5决策树算法使用“增益率”来选择最优划分属性。
G
a
i
n
r
a
t
i
o
(
D
,
a
)
=
G
a
i
n
(
D
,
a
)
I
V
(
a
)
Gainratio(D,a)=\frac{Gain(D,a)}{IV(a)}
Gainratio(D,a)=IV(a)Gain(D,a)
其中
I
V
(
a
)
=
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
l
o
g
2
∣
D
v
∣
∣
D
∣
IV(a)=-\sum_{v=1}^{V}\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|}
IV(a)=−∑v=1V∣D∣∣Dv∣log2∣D∣∣Dv∣
I
V
(
a
)
IV(a)
IV(a)称为属性a的"固有值",a的取值数目越多,
I
V
(
a
)
IV(a)
IV(a)的值通常会越大。需要注意的是,增益率准则对取值数目较少的属性有所偏好,因此,C4.5算法并不是直接选择增益率最大的属性,而是使用一个启发式:先选出信息增益高于平均值的特征,再选择增益率最大的特征。
4.2.3基尼系数
CART(Classification and Regression Tree)使用“基尼系数”来选择划分属性。数据集的纯度可用基尼值来度量,基尼系数越小,数据集D的纯度越高
G
i
n
i
(
D
)
=
1
−
∑
k
=
1
∣
y
∣
p
k
2
Gini(D)=1-\sum_{k=1}^{|y|}p_k^2
Gini(D)=1−k=1∑∣y∣pk2
属性a的基尼指数为
G
i
n
i
i
n
d
e
x
(
D
,
a
)
=
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
G
i
n
i
(
D
v
)
Giniindex(D,a)=\sum_{v=1}^{V}\frac{|D^v|}{|D|}Gini(D^v)
Giniindex(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
于是,可选择基尼系数最小的属性作为最优划分属性
4.3剪枝处理
剪枝是决策树算法对付“过拟合”的主要手段。在决策树学习中,为了尽可能正确分类训练样本,节点划分过程将不断重复,有时会造成分支过多,把训练数据中的噪声都学习到了,导致过拟合。因此,可通过主动去掉一些分支来降低过拟合的风险,也就是剪枝处理。也就是说,决策树的构建还需要剪枝,目的是降低复杂度,解决过拟合。
决策树非常容易过拟合,实际上所有非参数的学习方法,都非常容易过拟合。
决策树剪枝的基本策略有“预剪枝”和“后剪枝”。
4.3.1预剪枝
预剪枝是指在决策树生成过程中,对每个节点在划分前进行估计,若当前节点的划分不能带来决策树泛化性能提升,则停止划分并将当前节点标记为叶节点。也就是说,生成过程中,每个节点先进行最优属性选择,再判断是否应该进行此次划分(是否需要剪枝)。sklearn中现在能做的是预剪枝。
如何判断决策树泛化性能是否提升呢?这里可以使用性能评估方法中的留出法,即预留一部分数据用作验证集以评估性能。
预剪枝使得很多分支都未进行,降低过拟合的风险,显著降低训练和测试的时间开销;另一方面,因为预剪枝是基于“贪心”的,所以虽然当前节点并未提升泛化性能,但是基于当前节点的后续划分却有可能提升泛化性能,因此预剪枝可能带来欠拟合的风险。
4.3.2后剪枝
后剪枝是生成决策树后,自底向上的对非叶节点进行考察,若将该节点对应的子树替换成叶节点能带来性能提升,则将该子树替换成叶节点。
4.3.3总结
后剪枝决策树通常比预剪枝决策树保留了更多的分支。一般情况下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但是,后剪枝决策树的训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。
4.4连续与缺失值
4.4.1连续值处理
由于连续属性的可取值数目不再有限,因此,不能直接根据可取值来对节点进行划分。此时,连续属性离散化技术可派上用场。最简单的策略是“二分法”,这正是C4.5决策树算法中采用的机制。
将属性a的取值升序排序,取相邻两个取值的中点作为候选划分点,对于每个划分点来说,按大于或小于划分点将样本集划分为两个子集。然后,就可以像离散属性值一样来考察这些划分点,选取最优的划分点进行样本集合的划分。
需要注意的是,与离散属性不同,若当前节点划分属性为连续属性,该属性还可作为其后代节点的划分属性。
4.4.2缺失值处理
假如数据中有大量样本出现缺失值,如果简单地放弃不完整样本,显然是对数据信息极大的浪费。因此,有必要考虑有缺失值的样本来进行学习。
我们需解决两个问题:(1)如何在属性值缺失的情况下进行划分属性选择?(2)给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?
对于问题(1),对于某个有缺失值的属性a,将数据分为两部分,对每个样本设置一个权重(初始可以都为1),一部分是有缺失值的样本,另一部分是无缺失值的样本。我们仅可根据在属性a上没有缺失值的样本子集来判断其优劣,计算出信息增益率,最后乘上一个系数,系数为无缺失的样本加权和占总样本加权和的比例。
对于问题(2),可以将缺失特征的样本同时划分到所有子节点中,不过该样本的权重按各子节点样本所占比例来分配。例如,特征a三种取值的样本数2,3,4,则划分后权重条件为2/9,3/9,4/9
4.5多变量决策树
若我们把每个属性视为坐标空间中的一个坐标轴,则样本就对应了d维空间的一个数据点,对样本分类就意味着在这个坐标空间中寻找不同类样本之间的分类边界。决策树形成的分类边界有一个明显的特点:轴平行,即它的分类边界由若干个与坐标轴平行的分段组成。
但是如果问题很复杂,那么需要很多个分段才能获得较好的近似,是否能获取不与坐标轴平行的斜线作为划分呢?“多变量决策树”就是能实现这样的“斜划分”甚至更复杂划分的决策树。以实现斜划分的多变量决策树为例,非叶节点是对属性的线性组合进行测试,也就是说,非叶节点是试图建立合适的线性分类器,对应了坐标空间的斜线。