决策树是机器学习中一类非常著名的算法,它模拟人们在解决一个决策问题时的思考方式,因此具有非常好的可解释性。一般来说,一个训练好的决策树模型可以转化成一系列的“if-then”语句,从而可以快速判断新样本的类别。
决策树中的核心概念包括以下几点:
- 如何选择结点的分裂属性
- 如何处理过拟合
- 如何处理连续值
1、如何选择结点的分裂属性
以分为问题为例,决策树模型的训练是一个递归的过程,其核心是如何选择结点的分裂属性,即:在某个结点进行分裂时,为什么按照属性a划分而不是按照属性b。
选择分裂属性的依据是:每个结点所包含的样本尽可能地属于同一个类别,也就是说,每个结点所代表的样本要尽可能的“纯”。
这时,就需要有一个指标来度量结点样本的纯度。
常用的衡量指标包括:信息增益、增益率、基尼指数。
1.1 信息增益
了解信息增益,得先知道「信息熵」的概念。
「熵」就是衡量一个对象的混乱程度的指标,熵越大,越混乱。类似地,在决策树中,信息熵就是用来衡量样本集合的纯度的指标。信息熵越大,说明样本越不纯。
假设在一个分类问题中,目标类别的数量为∣γ∣|\gamma|∣γ∣,在当前样本集合DDD中,第iii类样本的占总数的比例为pip_ipi,则样本集合DDD的信息熵为:
Ent(D)=−∑i=1∣γ∣pi∗log2(pi)Ent(D)=-\displaystyle\sum_{i=1}^{|\gamma|}p_i*log_2(p_i)Ent(D)=−i=1∑∣γ∣pi∗log2(pi)
约定,当pi=0p_i=0pi=0时,pi∗log2(pi)=0p_i*log_2(p_i)=0pi∗log2(pi)=0
根据定义,如果Ent(D)Ent(D)Ent(D)越小,则样本纯度越高。通过数学计算不难看出,Ent(D)Ent(D)Ent(D)的最小值为0(此时集合DDD中没有样本或只有1个样本,最“纯”),最大值为log2∣γ∣log_2|\gamma|log2∣γ∣(此时集合SSS中恰好每一类样本都有,且数量相等,最“不纯”)。
假定离散属性aaa有VVV个可能的取值a1,a2,...aV{a^1,a^2,...a^V}a1,a2,...aV,于是,使用属性aaa来对样本集合DDD进行划分,则会产生VVV个分支结点。其中,第vvv个结点包含了DDD中所有在属性aaa上取值为ava^vav的样本,记作DvD^vDv。这时,利用上述信息熵的计算公式,就可以算出DvD^vDv的信息熵。
遍历所有VVV个分支结点,得到每一个子样本集的信息熵。为了区分各子样本集的重要性,给各个熵乘以一个系数∣Dv∣/∣D∣|D^v|/|D|∣Dv∣/∣D∣,即:样本越多的子类所占的比重越大。
于是,通过结合初始节点的信息熵和分类后的各子节点的信息熵,可以得到如下一个表达式:
Gain(D,a)=Ent(D)−∑v=1V∣Dv∣∣D∣Ent(Dv)Gain(D,a)=Ent(D)-\displaystyle\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
这里,计算结果Gain(D,a)Gain(D,a)Gain(D,a)被称之为信息增益,这就是一种人们用来衡量分裂属性选择合理程度的度量。
从信息增益的计算公式可以发现,它其实是分裂前的样本的信息熵减去按指定属性分裂后的各子样本的信息熵的加权和,可以这样理解:信息增益其实就是衡量按指定属性分裂后,样本不确定性的减少量。 从这个意义上来看,某个属性对应的信息增益越大,说明按照该属性划分所得的子样本就越纯。
著名的ID3算法,就是以信息增益为准则来选择分裂属性的。
1.2 增益率
我们可以通过一种简单的推想来思考一下信息增益的不足之处:假设所有样本在属性a上的取值都相同,那么属性a其实不具备区分样本的能力——属性a的信息增益为0;假设每个样本在属性a上的取值都不相同,那么按照属性a分裂的话,会得到与样本数量相同的子结点数,这时每个子节点的信息熵是0,于是属性a的信息增益达到了最大。
从上面的分析不难猜测,信息增益其实是“不公平”的,它会给那些可取值较多的属性赋予较大的增益。 因此,为了减少这种偏好所带来的影响,人们提出了「增益率」的概念。
从名字上来看,增益率显然就是从信息增益出发得出来的一个指标,其计算公式如下:
Gain_ratio(D,a)=Gain(D,a)IV(a)Gain\_ratio(D,a)=\displaystyle\frac{Gain(D,a)}{IV(a)}Gain_ratio(D,a)=IV(a)Gain(D,a)
其中,
IV(a)=−∑v=1V∣Dv∣∣D∣log2∣Dv∣∣D∣IV(a)=-\displaystyle\sum_{v=1}^{V}\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|}IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
称为属性a的“固有值”。
从固有值的定义可以看出,按属性a分裂后得到的子样本类别越多,那么其固有值就会越大,因此,给属性a的信息增益除以其固有值,可以起到调节的作用。
但是,增益率也不是完美的,它对可取值数目较少的属性有偏好。因此,另一个著名的决策树算法,C4.5,采用了一种启发式方法来寻找最优划分属性:先从所有候选属性中找到信息增益高于平均水平的属性,然后再从中选择增益率最大的属性。
1.3 基尼指数
除了用信息熵以外,还可以用「基尼值」来衡量数据集的纯度,其定义如下:
Gini(D)=∑k=1∣γ∣∑k′≠kpkpk′=1−∑k=1∣γ∣pk2Gini(D)=\displaystyle\sum_{k=1}^{|\gamma|}\sum_{k'\neq k}p_kp_{k'}=1-\sum_{k=1}^{|\gamma|}p_k^2Gini(D)=k=1∑∣γ∣k′=k∑pkpk′=1−k=1∑∣γ∣pk2
直觉上,基尼值衡量了从数据集中随机取出两个样本,其类别标记不一致的概率。 因此,基尼值约小,数据集的纯度越高。
基于基尼值,「基尼指数」的定义如下:
Gini_index(D,a)=∑v=1V∣Dv∣∣D∣Gini(Dv)Gini\_index(D,a)=\displaystyle\sum_{v=1}^{V}\frac{|D^v|}{|D|}Gini(D^v)Gini_index(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
于是,如果按照属性a进行划分后各子样本计算得到的基尼指数最小,那么属性a就是最优划分属性。
著名的CART决策树,就是以基尼指数来选择划分属性的。
2、如何处理过拟合
在决策树的训练中,为了尽可能地将样本分类正确,结点的划分过程将不断重复,就可能造成决策树的分支过多。这样的模型虽然在训练集上表现很好,但是它很有可能会把一些训练集自身的特点误认为是所有数据都具有的特点,从而产生过拟合,导致泛化能力很差。
决策树采取一种名为「剪枝」的策略来降低过拟合带来的影响。
决策树的剪枝可以分为预剪枝和后剪枝两种。顾名思义,预剪枝指的是在生成决策树的过程中,对每个结点在分裂前进行估计,若当前结点的分裂不能导致模型泛化性能的提升,则停止继续分裂,并将当前结点作为叶子节点;后剪枝指的是对已经训练完成的决策树按照自底向上的顺序考察每个非叶子结点,若将该结点对应的子树替换成叶子结点能够带来泛化性能的提升,则执行这种替换。
这里引出了一个新的问题:如何判断剪枝之后的泛化性能提升与否呢?假设有验证集,那么只需要将剪枝前后的决策树分别在验证集上进行测试,判断一下分类的准确率;如果没有单独的验证集,那么就需要利用交叉验证的方式从训练集中选择一部分进行验证。
3、如何处理连续值
如果样本具有取连续值的属性,那么就无法通过枚举所有可能来进行分裂了。这时,一种易于想到的方案就是将连续值离散化。
一种简单且实用的离散化方法被称为「二分法」,C4.5中采用了这种方法。
给定样本集DDD和连续属性a,假定a在DDD上出现了n个不同的取值,首先将这些值从小到大进行排序,记为{a1,a2,a3,...,an}\{a_1,a_2,a_3,...,a_n\}{a1,a2,a3,...,an}。基于划分点ttt可以将DDD划分为Dt−D_t^-Dt−和Dt+D_t^+Dt+,分别对应于DDD中在属性a上取值不大于ttt的样本和大于ttt的样本。显然,对于相邻的属性取值aia^iai与ai+1a^{i+1}ai+1来说,ttt在区间[ai,ai+1)[a^i,a^{i+1})[ai,ai+1)中取任意值所产生的划分结果相同,因此,对于{a1,a2,a3,...,an}\{a_1,a_2,a_3,...,a_n\}{a1,a2,a3,...,an}中的任意的相邻值,取其中位点来作为候选划分点,那么,共需考虑的备选划分点为:
Ta={ai+ai+12∣1≤i≤n−1}T_a=\displaystyle\{\frac{a^i+a^{i+1}}{2}|1\leq i\leq n-1\}Ta={2ai+ai+1∣1≤i≤n−1}
接下来,只需要遍历这些划分点,选出其中最优的来对样本进行划分。
以信息增益为例,其计算公式可以修改为:
Gain(D,a)=maxt∈TaGain(D,a,t)Gain(D,a)=\max\limits_{t\in T_a}Gain(D,a,t)Gain(D,a)=t∈TamaxGain(D,a,t)
其中,Gain(D,a,t)Gain(D,a,t)Gain(D,a,t)是样本集DDD基于划分点ttt二分后的信息增益。
需要注意的是,若当前结点划分属性为连续属性,该属性还可以作为划分属性在其后代结点中出现。