决策树
-
什么是决策树?
- 决策树是一种机器学习算法,常用于分类问题的研究。
-
决策树如何决策?
- 其决策过程是按照样本特征不断对样本进行分类划分。我们以二分类为例,首先,假定样本类别为1和-1,我们按照其特征一对样本进行划分,如果是特征一,就将其划入集合 S1S_1S1 中,否则将其划入 S2S_2S2 中,经过一次划分,我们得到了两个集合S1,S2{S_1,S_2}S1,S2,如果集合 S1S_1S1 中全是正类,我们将按照这个特征进行划分所得的集合成为正类,反之为负类。如果集合中既有正类样本、又有负类样本,我们将对这个集合继续进行划分,直至集合中元素纯净(只有一种类别样本),接下来,我们选择特征二进行同样操作,最终,我们将得到一个类似于一颗树状的分类模型,按照这个模型,我们可以对其它训练样本之外的数据进行分类,从而判定其所属的类别。
- 决策树的生成过程是一个递归过程,在决策树算法中,有三种情况会导致递归返回。
- 当前结点所包含的样本全属于同一类别,无需划分;
- 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分;
- 当前结点所包含的样本集合为空,不能划分;
-
对于上述第二种情形,我们把当前结点标记为叶子结点,并将其类别设定为该结点所含样本最多的类别,如果集合中正类多于负类,即为正类,反之,为负类。对于第三种情形,我们同样将当前结点标记为叶子结点,但将其类别设定为其父结点所含样本最多的结点。
-
先根据哪个特征进行划分最佳?
- 根据信息增益划分(著名的ID3决策树学习算法就是以信息增益为准侧进行划分的)
- 信息熵:度量样本纯度的一个指标,其值越小,代表集合中元素越纯,所包含的类别越少,越倾向于同一类。公式为 Ent(D)=−∑k=1∣γ∣pklog2pkEnt(D) = - \sum_{k=1}^{|\gamma|}p_klog_2p_kEnt(D)=−∑k=1∣γ∣pklog2pk,其中 pkp_kpk 是指当前样本中第 kkk 类样本所占的比例,范围是 (k=1,2,...γ)(k=1,2,...\gamma)(k=1,2,...γ)
- 信息增益:类似于信息熵的增量。公式为 Gain(D,a)=Ent(D)−∑ν=1V∣Dν∣∣D∣Ent(Dν)Gain(D, a) = Ent(D) - \sum_{\nu=1}^V\frac{|D^{\nu}|}{|D|}Ent(D^{\nu})Gain(D,a)=Ent(D)−∑ν=1V∣D∣∣Dν∣Ent(Dν) 一般而言,信息增益越大,意味着使用属性 aaa 来进行划分所获得的"纯度"提升越大。
- 在进行一次划分时,我们计算所有属性做对应的信息增益值,选出其中信息增益最大的那个属性进行划分。
- 根据增益率进行划分(著名的C4.5决策树算法就是使用增益率进行划分的)
- 信息增益率:是一种增益率。其定义为:Gain_ratio(D,a)=Gain(D,a)IV(a)Gain\_ratio(D, a) = \frac{Gain(D, a)}{IV(a)}Gain_ratio(D,a)=IV(a)Gain(D,a),其中 IV(a)=−∑ν=1V∣Dν∣∣D∣log2∣Dν∣∣D∣IV(a) = - \sum_{\nu=1}^V\frac{|D^{\nu}|}{|D|}log_2\frac{|D^{\nu|}}{|D|}IV(a)=−∑ν=1V∣D∣∣Dν∣log2∣D∣∣Dν∣
- 优点:上述公式中的 IV(a)IV(a)IV(a) 称为属性aaa的固有值,其可能取值越多,IV(a)IV(a)IV(a) 值越大,这就从一定程度上弥补了根据信息增益进行划分的缺陷,即信息增益准则总是对可取值数目较多的属性有所偏好例如 aaa 属性可能有三种可能取值,bbb 属性有四种可能取值,则根据信息增益公式可知,bbb 属性较 aaa 属性更易被选择为该次划分依据。
- 缺点:增益率准则对可取值数目较少的属性有所偏好。
- 实际使用:并不直接选择增益率最大的属性进行划分,而是先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的属性进行划分。
- 根据基尼指数进行划分(著名的CART决策树就是使用“基尼指数”来选择划分属性的)
- 基尼值:一种度量集合中元素纯度的方法。其定义为:Gini(D)=∑k=1∣y∣∑k’≠kpkpk′=1−∑k=1∣y∣pk2Gini(D) = {\mathop{ \sum }\limits_{{k=1}}^{{ \left| y \right| }}{{\mathop{ \sum }\limits_{{k\text{'} \neq k}}{p_kp_{k'}{}}}}} = 1 - {\mathop{ \sum }\limits_{{k=1}}^{{ \left| y \right| }}{{p_k}^2}}Gini(D)=k=1∑∣y∣k’̸=k∑pkpk′=1−k=1∑∣y∣pk2 ,其反映了从数据集中随机抽取两个样本,其类别标记不一致的概率,因此,其值越小,数据集的纯度越高。
- 基尼指数:是数据集基尼值的均值,因此其公式为:Gini_index(D,a)=∑v=1∣V∣∣Dv∣∣D∣Gini(Dv)Gini\_index(D, a) = {\mathop{ \sum }\limits_{{v=1}}^{{ \left| V \right| }}{\frac{{ \left| D^v \right| }}{{ \left| D \right| }}Gini \left( D^v \right) }}Gini_index(D,a)=v=1∑∣V∣∣D∣∣Dv∣Gini(Dv),同样,我们选择基尼指数最大的属性进行划分。
- 根据信息增益划分(著名的ID3决策树学习算法就是以信息增益为准侧进行划分的)
-
当出现过拟合现象时,我们如何进行处理?
- 首先,我们先认识下为何会出现过拟合现象。在决策树学习过程中,为了尽可能正确划分样本,结点划分过程中会不断重复,有时会造成决策树分支过多,这时就可能因为训练样本学得太好了,以致于将训练集本身的一些特点当做所有数据都具有的性质而导致过拟合。
- 我们可以通过剪枝操作去掉部分分支来降低过拟合风险
- 预剪枝
- 在决策树生成过程中,对每个结点在划分前进行估计,如果当前结点划分不能导致决策树泛化性能的提升,就停止划分,并将当前结点标记为叶子结点,类别标记为训练样例数最多的类别。
- 我们将一部分数据用作验证集做测试,如果划分后,使用验证集验证的精度比划分前小,就说这个划分并不会导致模型泛化性能的提升。
- 优点:预剪枝使得决策树很多分支都没有展开,降低了“过拟合”的风险,还减少了模型训练的时间。
- 缺点:有些分支的划分虽然当时不能提升泛化性能,但在其基础上进行的后续划分却可能导致模型性能的提升,因此,预剪枝只是保证了局部最优,并不能保证全局最优。
- 后剪枝
- 在决策树生成后,自底向上地,将结点替换为其训练样例数最多的类别,如果替换后的精度增大,则将该结点领衔的子树剪去,反之,不剪。
- 优点:后剪枝决策树的欠拟合风险很小,泛化性能优于预剪枝决策树。
- 缺点:由于得训练后生成的决策树的所有非叶结点都考虑,所以训练时间开销较预剪枝大。
- 预剪枝
-
样本数据集中出现缺失值,我们如何考虑?
- 将该条记录舍去?不,舍去显然不是个明智的行为。舍去是对数据的浪费。倘若样本中缺失值过于分散,如果一昧舍去,那么很有可能我们将所有样本都舍去了,那时,我们用什么进行训练呢?
- 我们需要考虑两个问题,一个是如何在属性值缺失的情况下,进行划分属性选择?二是给定划分属性,如果样本在该属性上的值缺失,如何对样本进行划分?
- 我们使用权重来进行处理,给定数据集DDD和属性aaa,另 D~\tilde{D}D~ 表示 DDD 中在属性 aaa 上没有缺失值的样本子集,假定属性 aaa 有 VVV 个可能取值 a1,a2,a3,...,aV{a^1, a^2, a^3,...,a^V}a1,a2,a3,...,aV ,令 Dv~\tilde{D^v}Dv~ 表示 D~\tilde{D}D~ 中在属性 aaa 上取值为 ava^vav 的样本子集,Dk~\tilde{D_k}Dk~ 表示 D~\tilde{D}D~ 中属于第 kkk 类 (k=1,2,...,⩽∣y∣)(k=1,2,...,\leqslant|y|)(k=1,2,...,⩽∣y∣)的样本子集,假定我们给每个样本赋予一个权重wxw_xwx,并定义:ρ=∑x∈D~wx∑x∈Dwx\rho=\frac{\sum_{x \in \tilde{D}} w_{x}}{\sum_{x \in D} w_{x}}ρ=∑x∈Dwx∑x∈D~wx,p~k=∑x∈D~kwx∑x∈D~wx\tilde{p}_{k}=\frac{\sum_{x \in \tilde{D}_{k}} w_{x}}{\sum_{x \in \tilde{D}} w_{x}}p~k=∑x∈D~wx∑x∈D~kwx (1⩽k⩽∣y∣)(1 \leqslant k \leqslant|y|)(1⩽k⩽∣y∣),r~v=∑x∈Dv~wx∑x∈D‾wx\tilde{r}_{v}=\frac{\sum_{x \in \tilde{D^v}} w_{x}}{\sum_{x \in \overline{D}} w_{x}}r~v=∑x∈Dwx∑x∈Dv~wx (1⩽v⩽V)(1 \leqslant v \leqslant V)(1⩽v⩽V),我们可以看到,a、ρa、\rhoa、ρ 表示无缺失值样本所占的比例, pk~\tilde{p_k}pk~表示无缺失值样本中第kkk类样本所占的比例,rv~\tilde{r_v}rv~表示无缺失值样本在属性aaa上取值ava^vav的样本所占的比例。显然,∑k=1∣Y∣p~k=1,∑v=1Vr~v=1\sum_{k=1}^{|\mathcal{Y}|} \tilde{p}_{k}=1, \sum_{v=1}^{V} \tilde{r}_{v}=1∑k=1∣Y∣p~k=1,∑v=1Vr~v=1
- 基于上述处理方法,我们可以将信息增益公式推广为:Gain(D,a)=ρ×Gain(D~,a)=ρ×(Ent(D~)−∑v=1Vr~vEnt(D~v))Ent(D~)=−∑k=1∣p∣p~klog2p~k\begin{aligned} \operatorname{Gain}(D, a) &=\rho \times \operatorname{Gain}(\tilde{D}, a) \\ &=\rho \times\left(\operatorname{Ent}(\tilde{D})-\sum_{v=1}^{V} \tilde{r}_{v} \operatorname{Ent}\left(\tilde{D}^{v}\right)\right) \end{aligned} \\ \operatorname{Ent}(\tilde{D})=-\sum_{k=1}^{|p|} \tilde{p}_{k} \log _{2} \tilde{p}_{k}Gain(D,a)=ρ×Gain(D~,a)=ρ×(Ent(D~)−v=1∑Vr~vEnt(D~v))Ent(D~)=−∑k=1∣p∣p~klog2p~k
- 然后依照前面步骤对其进行处理即可。
- 对于问题2,若样本xxx在划分属性aaa上的取值已知,则将xxx划入与其对应的子结点,且样本权值在子结点中保持wxw_xwx,若样本xxx在划分属性aaa上的取值未知,则将xxx同时划入所有子结点,且样本权值在属性ava^vav对应的子结点中调整为rv~∗wx\tilde{r_v}*{w_x}rv~∗wx
-
当样本中属性出现连续值,我们又该怎么办?
- 对于连续值,我们采用二分法对连续属性进行处理。
- 给定样本集 DDD 和连续属性,我们假定 aaa 在 DDD 上出现了 nnn 个不同取值,将这些值从小到大进行排序,记为 {a1,a2,...,an}\{a^1, a^2,...,a^n\}{a1,a2,...,an},我们计算出所有相邻点的中点,将其放入集合之中,这个n-1个点组成的集合就叫做属性的候选划分点集合。然后,我们对信息增益公式进行改造,Gain(D,a)=Ent(D)−∑λ∈{−,+}∣Dtλ∣DEnt(Dtλ)Gain(D, a) = Ent(D) - {\mathop{ \sum }\limits_{{ \lambda \in \left\{ -,+ \right\} }}{\frac{{ \left| D_t^{\lambda} \right| }}{{D}}Ent \left( D_t^{\lambda} \right) }}Gain(D,a)=Ent(D)−λ∈{−,+}∑D∣Dtλ∣Ent(Dtλ),其中,Gain(D,a,t)Gain(D, a, t)Gain(D,a,t) 是样本基于划分点 ttt 后的二分增益。
- 与离散属性不同的是,若当前若当前属性为连续属性,该属性还可以作为其后代结点的划分属性。