决策树是根据树结构来进行决策的,决策树的最终结果对应了我们所希望的判定结果。一般的一棵树包含一个根节点、若干个内部节点和若干个叶节点;叶结点对应了决策树的结果,其他每个节点对应于一个属性测试;每个结点根据属性测试的结果别划分到子结点中;根结点包含样本的全集。
决策树的生成是一个递归过程,有三种情况会导致递归返回(也就是出结果):
1、当前结点包含的样本属性全部属于同一类别,无需划分
2、当前属性集为空,或者样本在所有属性值相同,无法划分。称为死结点,设定为所含样本最多的类别
3、当前结点包含的样本集合为空,不能划分。称为死结点,设定为其父结点所含样本最多的类别
情形2是利用当前结点的后验分布;情形3是把父结点的原本分布作为当前结点的先验分布。
划分选择
决策树的关键在于如何选择最优划分属性,我们希望决策树的分支结点所包含的样本尽可能的属于同一类别,即结点的纯度越高越好。
信息增益
“信息熵”是度量样本纯度最常用的指标,
假设样本集D中的第k类样本所占的比例$p_k,(k=1,2,3,...|y|)$,则D的信息熵为:
$Ent(D)=-\sum_{k=1}^{|y|}p_k\log _2p_k$
Ent(D)的值越小,则D的纯度越高。
我们记为$D^v$为数据集D在第v个分结点在属性a上的取值。我们根据上式计算$D^v$的信息熵,
不同结点包含的样本数不同,我们给分支点赋予权重$\frac{|D_v|}{D}$,即样本数越多的分支点影响越大,于是可以计算出属性a对样本集D进行划分所获得的“信息增益”。
$Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{D}Ent(D^v)$
信息增益越大,意味着使用属性s来进行划分所获得的“纯度提升”越大,所以我们使用信息增益来进行决策树的划分属性选择。
例题:计算以下西瓜集的信息熵和信息增益
表1;西瓜数据集
其中正例$p_1=\frac{8}{17}$,反例$p_2=\frac{9}{17}$,所以根结点的信息熵为:
$$Ent(D)=-\sum_{k=1}^{2}p_k\log_2p_k=-(\frac{8}{17}\log_2\frac{8}{17}+\frac{9}{17}\log_2\frac{9}{17})=0.998$$
然后我们要计算出当前属性集合{色泽、根蒂、敲声、纹理、脐部、触感}中每个属性的信息增益。以色泽为例,色泽有三个取值:{青绿、乌黑、浅白},若使用该属性对D进行划分,则可得到3个子集分别为
$D^1$(色泽=青绿)有6个样例,正例$p_1=\frac{3}{6}$反例$p_2=\frac{3}{6}$
$D^2$(色泽=乌黑)有6个样例,正例$p_1=\frac{4}{6}$反例$p_2=\frac{2}{6}$
$D^3$(色泽=浅白)有5个样例,正例$p_1=\frac{1}{5}$反例$p_2=\frac{4}{5}$
分别计算信息熵
$$Ent(D^1)=-(\frac{3}{6}\log_2\frac{3}{6}+\frac{3}{6}\log_2\frac{3}{6})=1.000$$
$$Ent(D^2)=-(\frac{4}{6}\log_2\frac{4}{6}+\frac{2}{6}\log_2\frac{2}{6})=0.918$$
$$Ent(D^2)=-(\frac{1}{5}\log_2\frac{1}{5}+\frac{4}{5}\log_2\frac{4}{5})=0.722$$
计算色泽的信息增益:
$$Gain(D,色泽)=Ent(D)-\sum_{v=1}^{3}\frac{|D^v|}{|D|}Ent(D^v) \\
=0.998-(\frac{6}{17}*1.000+\frac{6}{17}*0.918+\frac{5}{17}*0.722) \\
=0.109$$
类似的我们可以计算出其他属性的信息增益:
Gain(D,根蒂)=0.143; Gain(D,敲声)=0.141; Gain(D,纹理)=0.381; Gain(D,脐部)=0.289; Gain(D,触感)=0.006.
显然属性“纹理”的信息增益最大,于是他被选为划分属性。
以图4.3中第一个分支结点(“纹理=清晰”)为例,该结点包含的样例集合$D^1$中有编号{1,2,3,4,5,6,8,10,15},9个样例,可用熟悉集合为{色泽、根蒂、敲声、脐部、触感},基于$D^1$计算出各属性的信息增益:
$Gain(D^1,色泽)=0.043$; $Gain(D^1,根蒂)=0.458$; $Gain(D^1,敲声)=0.331$; $Gain(D^1,脐部)=0.458$; $Gain(D^1,触感)=0.458$;
“根蒂”“脐部”“触感”3个属性均取得最大值的信息增益,最终得到:
增益率
根据上面的介绍我们有意的忽略了“编号”,如果把“编号”也作为属性进行划分,计算它的信息增益为0.998,远大于其他划分的属性,(解释:“编号”将产生17个分支,每个分支结点仅包含一个样本,这些分支结点的纯度已经达到最大值,然而这样的决策树不具备泛化能力。)
实际上,信息增益准则对可取值数目较多的属性有所偏好,为了减少这偏好带来的影响,使用“增益率”来进行划分属性。增益率定义为:
$$Gain_ratio(D,a)=\frac{Gain(D,a)}{IV(a)}$$
其中:
$$IV(a)=-\sum_{v=1}^{V}\frac{|D^v|}{|D|}\log_2\frac{|D^v|}{|D|}$$
称为属性a的固定值,属性a的可能取值越多(V越大),则IV(a)的值通常会越大。对上道题目的数据集IV(触感)=0.94(V=2),IV(色泽)=1.580(V=3),IV(编号)=4.088(V=17)。
但是增益率多取值较少的属性有一定的偏好,所以:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
基尼指数
基尼指数定义为:$$Gini(D)=\sum_{k=1}^{|y|}\sum_{k'\not\equiv k}p_kp_{k'}$$
$$=1-\sum_{k=1}^{|y|}p_k^2$$
基尼指数反应了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此Gini(D)越小,这数据集D的纯度越高。属性a的基尼指数定义为:
$$Gini\_index(D,a)=\sum_{v=1}^{V}\frac{|D^v|}{|D|}Gini(D^v)$$
于是我们选择在属性集合A中,使得划分后基尼指数最小的属性作为最优划分属性,$a^*=arg\min_{a\in A}Gini\_index(D,a)$
剪枝处理
剪枝是决策树学习算法对付“过拟合”的主要手段,在学习过程中,有时候为了尽可能的正确分类训练样本,会造成决策树的分支过多,以至于把训练集自身的一些特点当做所有和数据都具有的一般性质从而导致过拟合,因此有了“预剪枝”和“后剪枝”。
预剪枝是对每个结点划分前先进行估计,若当前结点的划分不能带来决策树泛化性能的提升,则停止划分并将当前结点标记为叶节点,
后剪枝是先从训练集生成一颗完整的决策树,然后自底向上对非叶结点进行考察,若将该结点对应的子树替换为叶结点能提升决策树性能的提升,则将该子树替换为叶结点。
但是如何判断决策树泛化性能得到提升呢?我之前有一篇博客中有罗列介绍模型的评估与选择,评估法一共有:留出法、交叉验证法、自助法。那么这篇博客采用留出法进行分析决策树的泛化性能。我们将以上的西瓜数据集用“留出法”划分为训练集(双线上部)和测试集(双线下部)
假定我们采用信息增益来划分属性,则生成的决策树如下所示。
预剪枝
根据信息增益准则,我们选取属性“脐部”来对训练集进行划分,并产生3个分支,问题来了我们是否应该对“脐部”这个结点进行划分呢?先来假设一波,我们假设“脐部”这个结点不进行划分,那么该结点为叶结点。我们用测试集对来对这个单节点决策树进行评估,编号{4,5,8}被分类正确,另外4个分类错误,于是测试精度为$\frac{3}{7}=43.9\%$。
在用属性“脐部”划分之后,结点2包含{1,2,3,14}标记为叶节点“好瓜”,结点3包含{6,7,15,17}标记为叶节点“好瓜”,结点4包含{10,16}标记为叶节点“坏瓜”,此时测试集中{4,5,8,11,12}的样例被划分正确,测试精度为$\frac{5}{7}=71.4\%>42.9\%$,于是用“脐部”划分得以确认。
然后对结点2进行划分,基于信息增益挑选出属性“色泽”,我们来看看应不应该对色泽进行划分,如果划分,测试集编号为{5}的样本会由正确转为错误,使得测试精度下降为$57.1\%$
然后对结点3进行划分,基于信息增益挑选出属性“根蒂”,我们来看看应不应该对色泽进行划分,如果划分,划分后的测试精度仍为71.4%,不能提升精度,于是预剪枝禁止结点划分。
然后对结点4进行划分,其训练样例都是同一类,没必要进行划分。
于是基于预剪枝策略,划分的决策树如下所示。
后剪枝
我们先从训练集生成一颗完整决策树,
后剪枝首先考察结点6,若把结点6的分支剪除,把结点6当做叶节点,该结点包含训练集{7,15},我们把该结点标记为“好瓜”,此时决策树的测试集精度提升至57.1%,于是后剪枝决定剪除结点6的分支。
然后考察结点5,替换后的叶节点包含样本{6,7,15},把叶结点标记为“好瓜”,此时测试精度仍为57.1%,所以剪除结点5的分支。
然后考察结点2,然后考察结点2,替换为叶结点后样本有{1,2,3,14},把叶结点标记我“好瓜”,此时测试精度提升至71.4%,于是剪除结点2的分支。
考察结点3和结点1,替换为叶结点后,测试集精度分别为71.4%和42.9%,均未得到提高,于是他们被保留。
基于后剪枝技术,我们得到决策树如下所示:
总结预剪枝和后剪枝,后剪枝得到的决策树比预剪枝得到的决策树分支更多,一般情况,后剪枝决策树欠拟合风险更加小,泛化能力往往优于预剪枝决策树,但是后剪枝是在生成完整的决策树之后自底向上对所有节点进行的考察,训练时间要比预剪枝花的更加多。
连续与缺失值
连续值处理
但目前为止我们都是基于离散属性来生成决策树,那么连续属性该怎么划分呢?就简单的连续属性离散技术就是“二分法”。
假定样本集D和连续属性a,a在D上出现n个不同的取值,将这些值从小到大的排序$a_1,a_2....,a_n$,把区间$a_i,a_{i+1}$的中位点$\frac{a_i+a_{i+1}}{2}$作为划分点。然后我们可像离散属性一样来考察这些划分点。
缺失值处理
对于某样本属性的缺失,我们需要解决两个问题:
1、如何在属性值缺失的情况下进行划分属性选择?
2、给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?
对变量决策树
把每个属性视为坐标空间中的一个坐标轴,则d个属性描述的样本对应了d维空间中的一个数据点,对样本分类意味着在坐标空间中寻找不同类样本之间的分类边界。决策树所形成的分类边界有一个明显的特点:轴平行(分类边界由若干个与坐标平行的分段组成),分类边界都是与坐标轴平行的,因为每一段都对应了某个属性取值。但是在学习任务的真实分类边界较为复杂的时候,就必须使用很多段才能获得更好的近似,这样就会造成决策树相当复杂,预测开销也会很大。
若能使用斜线划分边界,就能简化决策树模型,我们称为“多变量决策树”。在多变量决策树中,非叶节点不再仅对某个属性进行划分,而是对属性的线性组合进行测试;换言之每个非叶节点是$\sum_{i=1}^{d}w_ia_i=t$的线性分类器,其中$w_i$是属性$a_i$的权重,$w_i$和t可在该结点所含的样本集和属性集学的。
代码与实现