写在前面:
本人初次发博,知识水平和文字功底有限,如有疏漏谬误之处请多包涵,欢迎指教和交流!
目录
1. 基本流程
2. 划分选择
3. 剪枝处理
4. 连续与缺失值
5. 多变量决策树
6. 补充(基于ISL)
7. 总结和思考
1.基本流程
决策树(decision tree)就是基于树结构进行决策的一种机器学习方法,进行决策时从根节点经过一系列判断从而得出最终决策。
从树结构来看,叶结点对应于决策结果,其余结点对应属性测试;根结点包含样本全集,从根结点到叶结点的路径对应了一个测试序列,路径上每个结点包含的样本集合满足某种属性测试结果。
决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循简单而直观的“分而治之“策略”。
决策树学习基本算法如下:
可以看到,有三种情形需要生成叶结点(不能继续划分):
(1)当前结点包含的样本全属于同一类别
(2)当前属性集为空(没有更多属性可以用来测试)或者所有样本在所有属性上取值相同
(3)当前结点包含的样本集合为空。
在第(2)种情形下,把结点标记为叶结点并将其类别设定为该节点所含样本最多的类别;在第(3)种情形下,把结点标记为叶结点并将其类别设定为父节点所含样本最多的类别。
2.划分选择
决策树的关键是如何选择最优划分属性,使得结点的纯度(purity)越来越高,即随着划分过程的不断进行,分支结点所包含的样本尽可能属于同一类别。
书中介绍了三种度量样本集合纯度的指标:信息增益,增益率和基尼指数。
2.1信息增益
首先引入了 信息熵(information entropy)的概念,这是衡量样本集合纯度最常用的一种指标,信息熵越小则纯度越高。
D为当前样本集合,有k类样本,
p
k
p_{k}
pk表示第k类样本所占的比例,则D的信息熵为:
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
假定离散属性a有V个可能的取值,若使用a来对样本集D进行划分,则会产生V个分支结点,第v个分支结点包含了D中所有在a上取值 a v a^{v} av的样本,记为D v ^{v} v。信息增益(information gain)定义为:
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=1V∣D∣∣Dv∣Ent(Dv)
其中 ∣ D v ∣ ∣ D ∣ \frac{|D^{v}|}{|D|} ∣D∣∣Dv∣为赋予给分支结点的权重,分支结点所含的样本数量越多影响越大。
信息增益越大,意味着用属性a来进行划分所获得的纯度提升越大。
2.2增益率
信息增益准则对可取值数目较多的属性有所偏好(分支越多纯度通常越高,获得的信息增益也越大,但泛化能力差),为了减少这种不利影响,引入了 增益率(gain ratio)的概念。增益率定义为:
Gain_ratio(D,a)= G a i n ( D , a ) I V ( a ) \frac{Gain(D,a)}{IV(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∣
称为属性a的固有值,属性a的可能取值数目越多(V越大),则IV(a)的值通常会越大。
一般在选取最优划分属性时,会综合考虑信息增益和增益率:先从后选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
2.3基尼指数
基尼指数(Gini index)也可以用来衡量数据集D的纯度,定义如下:
G
i
n
i
(
D
)
=
∑
k
=
1
∣
y
∣
∑
k
′
≠
k
p
k
p
k
′
Gini(D)=\sum_{k=1}^{|y|}\sum_{ k^{'} \neq k}p_{k}p_{k'}
Gini(D)=∑k=1∣y∣∑k′̸=kpkpk′
=
1
−
∑
k
=
1
∣
y
∣
p
k
2
1-\sum_{k=1}^{|y|}p_{k}^{2}
1−∑k=1∣y∣pk2
直观来说,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不同的概率。因此,Gini(D)越小,D的纯度越高。
属性a的基尼指数定义为:
Gini_index(D,a)= ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) \sum_{v=1}^{V}\frac{|D^{v}|}{|D|}Gini(D^{v}) ∑v=1V∣D∣∣Dv∣Gini(Dv)
于是,在候选属性集合A中,我们选择那个使得划分后基尼指数最小的属性作为最优划分属性。
3.剪枝处理
为了防止过拟合,需要对决策树进行剪枝处理,基本策略有预剪枝和后剪枝两种。
3.1预剪枝
预剪枝(prepruning)是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。
可以根据划分前后的验证集精度(样本被正确分类的比例)决定是否进行划分。预剪枝不仅降低了过拟合的风险,还减少了训练时间和测试时间;但另一方面,由于预剪枝是基于“贪心”本质,只会着眼当前最优的情况,不会考虑对当前表现提升不大而对后续表现有较大提升的划分,且预剪枝会有欠拟合的风险。
3.2后剪枝
后剪枝(post-pruning)是从训练集生成一棵完整的决策树,然后自底向上对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
一般情况下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树,但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上对所有非叶结点逐一考察,因此训练时间开销要比未剪枝决策树和预剪枝决策树要大得多。
4.连续与缺失值
4.1连续值处理
之前讨论的是基于离散属性生成决策树,现在讨论连续值(回归)问题。
最简单的策略就是把连续值进行离散化,采用 二分法(bi-partition)对连续属性进行处理,将样本集D分为两个子集 D t + D_{t}^{+} Dt+和 D t − D_{t}^{-} Dt−(以连续属性a为例,连续值以t为划分点, D t + D_{t}^{+} Dt+包含在属性a上大于t的样本, D t − D_{t}^{-} Dt−包含在属性a上不大于t的样本)。
一种划分方法是把D在a属性上出现n个不同取值的从小到大排列{ a 1 , a 2 , a 3 … … , a n a^{1},a^{2},a^{3}……,a^{n} a1,a2,a3……,an},顺序选取每两个取值的中位点作为划分点,划分点集为 T a = { a i + a i + 1 2 ∣ 1 ≤ i ≤ n − 1 } T_{a}=\left \{ \frac{a^{i}+a^{i+1}}{2}|1\leq i \leq n-1 \right \} Ta={2ai+ai+1∣1≤i≤n−1},对这n-1个划分点对应进行考察,选取最优的划分点。
G
a
i
n
(
D
,
a
)
=
max
t
∈
T
a
G
a
i
n
(
D
,
a
,
t
)
Gain(D,a)=\max_{t\in Ta}Gain(D,a,t)
Gain(D,a)=maxt∈TaGain(D,a,t)
=
max
t
∈
T
a
E
n
t
(
D
)
−
∑
λ
∈
(
−
,
+
)
∣
D
t
λ
∣
∣
D
∣
E
n
t
(
D
t
λ
)
\max_{t\in Ta}Ent(D)-\sum_{\lambda\in{(-,+)}}\frac{|D_{t}^{\lambda}|}{|D|}Ent(D_{t}^{\lambda})
maxt∈TaEnt(D)−∑λ∈(−,+)∣D∣∣Dtλ∣Ent(Dtλ)
其中Gain(D,a,t)是样本集D基于划分点t二分后的信息增益。于是,我们就可选择使Gain(D,a,t)最大化的划分点。
将当前属性集中所有的属性和划分点对应的信息增益求出,就可以选择获得最大信息增益的属性及其划分点来划分当前结点。
需注意的是,与离散属性不同,若当前结点划分属性为连续属性,该属性还可作为其后代结点的划分属性。
4.2缺失值处理
在数据集中某些样本的属性存在缺失时,需要解决两个问题:(1)如何进行划分属性选择(2)如何对缺失属性的样本在该属性上进行划分。
D ∼ D^{\sim } D∼表示D在a属性上没有缺失值的样本子集。对问题(1),我们可以根据 D ∼ D^{\sim } D∼来判断属性a的优劣。假定属性a有V个可取值,令 D ∼ v D^{\sim v} D∼v表示 D ∼ D^{\sim } D∼在属性a上取值为 a v a^{v} av的样本子集, D ∼ k D^{\sim k} D∼k表示 D ∼ D^{\sim } D∼中属于第k类的样本子集。显然 D ∼ = ∪ k = 1 ∣ y ∣ D ∼ k D^{\sim }=\cup_{k=1}^{|y|}D^{\sim k} D∼=∪k=1∣y∣D∼k, D ∼ = ∪ v = 1 V D ∼ v D^{\sim }=\cup_{v=1}^{V}D^{\sim v} D∼=∪v=1VD∼v。
我们为每个样本x赋予一个权重 ω x \omega_{x} ωx,并定义
ρ = ∑ x ∈ D ∼ ω x ∑ x ∈ D ω x \rho=\frac{\sum_{x\in D^{\sim \omega_{x}}}}{\sum_{x\in D \omega_{x}}} ρ=∑x∈Dωx∑x∈D∼ωx
ρ k ∼ = ∑ x ∈ D k ∼ ω x ∑ x ∈ D ∼ ω x ( 1 ≤ k ≤ ∣ y ∣ ) \rho k^{\sim}=\frac{\sum_{x\in Dk^{\sim \omega_{x}}}} {\sum_{x\in D^{\sim} \omega_{x}}}(1\leq k\leq |y|) ρk∼=∑x∈D∼ωx∑x∈Dk∼ωx(1≤k≤∣y∣)
r v ∼ = ∑ x ∈ D v ∼ ω x ∑ x ∈ D ∼ ω x ( 1 ≤ v ≤ V ) r v^{\sim}=\frac{\sum_{x\in Dv^{\sim \omega_{x}}}}{\sum_{x\in D^{\sim} \omega_{x}}}(1\leq v\leq V) rv∼=∑x∈D∼ωx∑x∈Dv∼ωx(1≤v≤V)
ρ \rho ρ表示无缺失值样本所占的比例, ρ k ∼ \rho k^{\sim} ρk∼表示无缺失值样本中第k类所占的比例, r v ∼ rv^{\sim} rv∼表示无缺失值样本中属性a上取值 a v a^{v} av的样本所占的比例。
基于上述定义,我们可将信息增益推广为:
G
a
i
n
(
D
,
a
)
=
ρ
∗
G
a
i
n
(
D
∼
,
a
)
Gain(D,a)=\rho *Gain(D^{\sim},a)
Gain(D,a)=ρ∗Gain(D∼,a)
=
ρ
∗
(
E
n
t
(
D
∼
)
−
∑
v
=
1
V
r
v
∼
E
n
t
(
D
v
∼
)
)
\rho*(Ent(D^{\sim})-\sum_{v=1}^{V}rv^{\sim}Ent(Dv^{\sim}))
ρ∗(Ent(D∼)−∑v=1Vrv∼Ent(Dv∼))
其中
E n t ( D ∼ ) = − ∑ k = 1 ∣ y ∣ p k ∼ l o g 2 p k ∼ Ent(D^{\sim})=-\sum_{k=1}^{|y|}pk^{\sim}log_{2}pk^{\sim} Ent(D∼)=−∑k=1∣y∣pk∼log2pk∼
对问题(2),若样本x在划分属性a上的取值已知,则将x划入对应子结点,且样本权值保持为 ω x \omega_{x} ωx。若样本x在划分属性a上的取值未知,则将x同时划入所有子结点,且对应子结点中的权值调整为 r v ∼ ∗ ω x r v^{\sim}*\omega_{x} rv∼∗ωx,即让同一个样本以不同的概率划入到不同的子结点中去。
5多变量决策树
把每个属性视为坐标空间中的一个坐标轴,则d个属性描述的样本就对应了d维空间中的一个数据点,对样本分类则意味着在坐标空间中寻找分类边界,且分类边界均与坐标轴平行。
虽然轴平行的分类边界有很好的解释性,但在实际运用中,真实分类边界比较复杂时,必须使用很多段才能获得较好的近似,此时决策树会很复杂,预测时间开销会很大,故可以进行斜的边界划分,即在每个非叶结点对属性的线性组合进行测试而不是测试单个属性,多变量决策树(multivariate decision tree)就是这样为每个非叶结点建立一个合适的线性分类器。
6补充(基于ISL)
6.1回归树与分类树
西瓜书中,主要介绍了用决策树解决分类问题,对于连续值(回归)问题也是把它转换为分类问题再按分类问题的方式进行解决。与西瓜书不同,统计学习导论(An Introduction To Statistical Learning,ISL)中分别对两种问题及其对应方法进行了讨论,即把决策树分为了回归树和分类树。
6.1.1回归树
建立 回归树(regression tree)的过程可分为两步:
(1)将预测变量空间分割成J个互不重叠的区域
R
1
,
R
2
,
…
…
,
R
J
R_{1},R_{2},……,R_{J}
R1,R2,……,RJ
(2)对落入区域
R
j
R_{j}
Rj的每个观测值作同样的预测,预测值为
R
j
R_{j}
Rj上训练集的响应值的简单算术平均。
建立回归树的关键就是构建这J个区域,划分区域的目标是找到使模型的残差平方和RSS最小的矩形区域
R
1
,
R
2
,
…
…
,
R
J
R_{1},R_{2},……,R_{J}
R1,R2,……,RJ。
RSS的定义为:
∑ j = 1 J ∑ i ∈ R j ( y i − y R j ∼ ) 2 \sum_{j=1}^{J}\sum_{i\in R_{j}}(y_{i}-y^{\sim}_{R_{j}})^{2} ∑j=1J∑i∈Rj(yi−yRj∼)2
y R j ∼ y^{\sim}_{R_{j}} yRj∼是第j个矩形区域中训练集的平均响应值。
结点划分的步骤与西瓜书中所介绍的类似,采用自上而下的贪婪算法(递归二叉分裂),每一步确定最佳的划分属性及划分点,只是衡量指标由信息增益变为了RSS。
剪枝处理则采取了 代价复杂性剪枝(cost complexity pruning)的方法,暂不展开。
6.1.2分类树
ISL中 分类树 (classification tree)与西瓜书中内容基本重合且不如西瓜书详细,不再赘述。
6.2多棵树综合(装袋法,随机森林,提升法)
装袋法,随机森林,提升法均以树为基本模块,建立更有效的预测模型。
6.2.1 装袋法
装袋法(bagging)就是运用自助法对决策树进行改进。
从原始训练集中有放回的重复抽取样本生成B个自助抽样训练集,并分别对这B个自助抽样训练集建立决策树求得预测值,最后将所有预测值的平均值作为原模型的预测。对于分类问题,采用多数投票的原则选择B个决策树中多数的类别作为总体预测。
袋装法可以有效减小方差,大幅提升预测准确性。
另外,值得一提的是一种无需特别使用交叉验证集就能直接估计装袋模型测试误差的方法——袋外误差估计。这种方法把原始训练集中那些没有装入自助抽样训练集的样本称为该自助抽样训练集的袋外样本,把所有袋外样本作为该自助抽样训练集的交叉验证集来使用。
6.2.2随机森林
随机森林是装袋法的改进,在建立决策树时,每考虑一个分支结点的划分,只从所有p个预测变量中随机选出一部分(如m个预测变量,m<p)来作为候选变量。通常m取√p,m=p时就是装袋法。
这样做可以防止所有的装袋法树看起来都很相似(每棵树都会选择带来最大改进的变量作为划分结点的选择),从而减小方差。
6.2.3提升法
提升法与装袋法相比,在树的生成即自助抽样训练集的生成有所不同,装袋法是根据原始数据集的某一修正版本,提升法的树都是顺序生成的:每棵树的构建都需要用到之前生成的树种的信息。
对回归树运用提升法:
提升法是一种舒缓的训练模型的方法,过程比其他方法更漫长,但往往有较好的预测效果。
提升法有三个调整参数:
(1)树的总数B,若B过大,提升法可能会出现过拟合,不过即使出现过拟合,其发展也很缓慢。我们用交叉验证来选择B。
(2)学习速度
λ
\lambda
λ。通常取0.01或0.001,视问题而定。若
λ
\lambda
λ过小,则需要很大的B才能获得好的预测效果。
(3)每棵树的分支结点数d,它控制着整个模型的复杂性。
7.总结与思考
以我目前浅薄的认知,总的来说,决策树更适合解决分类问题,这从西瓜书中的对分类问题的侧重及把连续问题离散化可以看出,但ISL中也介绍了回归树,评价模型性能提升的指标也变为了RSS,可以作为参考。
划分选择与剪枝处理是决策树生成的核心内容,划分选择时往往不能只考虑信息增益或增益率,应该综合考虑。剪枝处理方面,除了西瓜书介绍的预剪枝和后剪枝,ISL还介绍了代价复杂性剪枝,使剪枝更加细致。
在解决缺失值问题时,先用无缺失的样本集训生成决策树,再按一定的策略划分有缺失值的样本。
多变量决策树把属性作为变量,每次划分不是单纯按单个属性考虑,而是测试多个变量的线性组合,这样得出的决策树虽然不会很复杂,但解释度可能较差。
装袋法,随机森林,提升法等利用多个决策树进行预测的方法可以有效减小方差,使决策树有更好的预测能力。袋装法用到了自助法,且可以用袋外误差估计来取代交叉验证;随机森林是袋装法的改进,每次划分选择时的候选属性只是所有属性的一部分;提升法是一种舒缓的学习方法,由B,λ,d等调整参数决定算法的细节。
接近人的决策模式的决策树具有解释性强的优点,在解释性方面甚至比线性回归更方便,且可用图形表示,更加直观,但在实际应用中还是要根据情况选择模型,不能一概而论。