机器学习——决策树模型
1 决策树概述
1.1 决策树模型简介
决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶子节点代表一种类别。
树的组成:
根节点:第一个选择点
非叶子结点与分支:中间过程
叶子节点:最终的决策结果
1.2 决策树建立步骤
1.3 三种经典的决策树生成算法
决策树建立过程中,选择合适的特征及该特征下选择合适的决策值对决策树的结构影响很大,对决策树的研究基本上集中于该问题,该问题习惯上称为样本集分裂,依其解决方法可将决策树算法分为ID3、C4.5、CART等三种。
2 信息熵与基尼指数
2.1 信息量
信息的概念:信息就是对不确定性的消除。如一条天气预报消息“明天气温下降8度”可以消除人们对明天天气变化的不确定性。
消除的不确定性越大,那么信息量就应该越大。不确定性的消除是根据人们的先验知识来比较的。再比如,“中国足球队打败巴西足球队”比“中国乒乓球队打败巴西乒乓球队”所消除的不确定性就大的多。因此,预言以往发生小概率的事件的消息所带来的信息量就要大。以往发生的概率叫做先验概率,用p表示。香农基于先验概率来定义信息量公式:
$I(x)=log(\frac{1}{p})=-log(p)$
假设中国足球队和巴西足球队曾经有过8次比赛,其中中国队胜1次。以U1表示未来的中巴比赛中国队胜的事件,那么U1的先验概率就是1/8,因此其信息量就是:
$I(U_{1})=-log_2{}(\frac{1}{8})=3$
如果以U2表示巴西队胜,那么U2的先验概率是$\frac{7}{8}$,其信息量就是:
$I(U_{2})=-log_2{}(\frac{7}{8})=0.19$
“值越大,越不寻常”,对应的信息量越大。
2.2 信息熵
信息量描述的是信源发出的单个事件消除的不确定性,还不能刻画信源消除的平均不确定性。如果把信源发出的所有事件的信息量求均值,就可以刻画信源消除的平均不确定性,定义为信息熵:
$H(x)=E[I(x_i)]=-\sum_{i=1}^{n}p_i{\mathbf{log}_2{p_i}}$
信息熵通常用来描述整个随机分布所带来的信息量平均值,更具统计特性。信息熵也叫香农熵,在机器学习中,由于熵的计算是依据样本数据而来,故也叫经验熵。
样本集合的信息熵越大,说明各样本相对均衡,区别就越小,越不利于分类。
以下表中的数据为例,表中的数据为决定是否相亲的5组数据,影响是否相亲结果的特征主要有年龄、身高、学历和月薪。
示例的样本集合A中,相亲3次,不相亲2次,其信息熵计算如下:
$H(A)=-\frac{2}{5}\times \textbf{log}_2{\frac{2}{5}}-\frac{3}{5}\times \textbf{log}_2{\frac{3}{5}}=0.971$
信息熵值越大,事件越不确定,最大值为1,对立事件此时各发生概率为0.5;确定事件信息熵值为0,比如太阳从东边升起。
2.3 信息增益
当把样本集$A$按照第𝑗个特征$𝐹^(𝑗)$的某决策值𝑓划分成两个独立的子集$A_{1}$和$A_{2}$时,此时$A$的信息熵为两个子集$A_{1}$和$A_{2}$的信息熵按样本数量的比例作加权的和:
$H(A,F^{(j)}=f)=\frac{A_1}{A}H(A_{1})+\frac{A_2}{A}H(A_2)$
其中,|A|,|A1 |,|A2 |表示A,A1,A2三个集合的样本个数。
将示例的样本集合𝐴按学历特征是否等于高于硕士划分为两个集合时,其信息熵为:
$H(A,F^{(2)}=master)=\frac{3}{5}H(A_{1})+\frac{2}{5}H(A_2)$
$= -[\frac{3}{5}(\frac{2}{3}log_2{\frac{2}{3}})+\frac{2}{5}(log_2{1})]=0.551$
划分前后信息熵的减少量称为信息增益,即:
$Gain(A,F^{(j)}=f)=H(A)-H(A,F^{(j)}=f)=H(A)-(\frac{|A_1|}{|A|}H(A_1)+\frac{|A_2|}{|A|}H(A_2))$
ID3决策树算法采用信息增益作为划分样本集的指标。在生成二叉决策树时,选择使Gain(𝐴,𝐹(𝑗) =𝑓)最大的那个特征𝐹(𝑗)及其决策值𝑓作为分裂点。
将示例的样本集合𝐴按身高(175cm)、学历(硕士)、月薪(1万元)三个特征及决策值切分后的子集的信息增益分别为0.02、0.42、0,所以在三者之中,选择学历(高于等于硕士)作为分裂点更为合理。
2.4 增益率
使用信息增益来选择特征时,算法会偏向于取值多的特征,也就是说取值越多可能会使得信息增益越大,但有时候并没有实际意义,C4.5决策树算法对此做了修正,它采用增益率作为选择特征的依据。增益率定义如下:
$GainRatio(A,F^{(j)})=\frac{Gain(A,F^{(j)})}{SplitInfo(F^{(j)})}$
其中,划分信息𝑆𝑝𝑙𝑖𝑡𝐼𝑛𝑓𝑜(𝐹(𝑗))定义如下:
$SplitInfo(F^{(j)})=-\sum \frac{|A_i|}{|A|}log_2{\frac{|A_i|}{|A|}}$
其中,𝐴𝑖是依据特征𝐹(𝑗)的取值划分的样本子集。显然,在样本子集数增加的时,𝑆𝑝𝑙𝑖𝑡𝐼𝑛𝑓𝑜(𝐹(𝑗))也有增加的趋势,因此,信息增益增加的趋势得到了一定的修正。
2.5 基尼指数
CART决策树算法采用基尼指数(Gini Index)来选择划分特征。对于样本集𝐴,假设有𝐾个分类,则样本属于第𝑘类的概率为𝑝𝑘,则此概率分布的基尼指数为:
$Gini(p)=\sum_{k=1}^{K}p_k(1-p_k)=1-\sum_{k=1}^{K}p_{k}^{2}$
对于样本集𝐴,其基尼指数为:
$Gini(A)=1-\sum_{k=1}^{K}(\frac{|A_k}{|A|})^2=1-\frac{\sum_{k=1}^{K}|A_k|^2}{|A|^2}$
示例样本集的5个样本中,有2个相亲,3个不相亲,因此其基尼指数为:
$Gini(A)=1-[(\frac{2}{5})^2+(\frac{3}{5})^2]=0.48$
基尼指数也是一种不等性度量的指标,取值介于0-1之间,分类越不平衡,基尼指数就越小。
基尼指数为0,表示纯度越高,越不均匀如太阳东边或西边升起,基尼指数为0.5,表示纯度越低,越均匀,如抛硬币。
如果样本集A划分成独立的两个子集A1和A2,其基尼指数为:
$Gini(A_1,A_2)=\frac{|A_1|}{|A|}Gini(A_1)+\frac{|A_2|}{|A|}Gini(A_2)$
在样本集分裂时,要选择使分开后两个集合基尼指数最小的那个特征及其决策值作为分裂点,即与分裂前基尼指数相比,选择使之减少最多的那个特征及其决策值。
利用学历特征的决策值为“硕士”时划分样本集为两个子集,基尼指数为:
$Gini(A,F^{(2)}=master)=\frac{3}{5}\left\{1-\left [ (\frac{2}{3})^2+(\frac{1}{3})^2 \right ] \right\}+\frac{2}{5}\left\{1-(\frac{2}{2})^2 \right\}=0.267$
用年龄特征的决策值为30来划分样本集,此时的基尼指数为:
$Gini(A,F^{(0)}=30)=\frac{4}{5}\left\{1-\left [ (\frac{3}{4})^2+(\frac{1}{4})^2 \right ] \right\}+\frac{1}{5}\left\{1-(\frac{1}{1})^2 \right\}=0.3$
3 ID3与C4.5算法
ID3算法基于信息增益,以信息增益最大的属性为分类特征,基于贪心策略自顶向下地搜索遍历决策树空间,通过递归方式构建决策树。
ID3算法的切分特征选择容易向特征值类型多的特征倾斜,C4.5算法采用信息增益率为依据,以信息增益率最大的属性为分类特征,构建方法与ID3算法相同。
3.1 例题1
3.1.1题目
下表所示的数据集表示豌豆种子在不同环境下能否发芽情况。豌豆种子自身有形状、大小和种皮颜色等特征,外部影响环境有土壤、水分和日照等特征。试通过所示数据集构建决策树并根据最后一行测试数据预测该豌豆能否发芽。
3.1.2 解题步骤分析
使用ID3算法,基于信息熵增益:
第一步,计算样本总信息熵;
第二步,依次选择不同的特征及该特征对应的分类值,将数据集划分为不同子集,计算划分子集后的相应信息熵,再由之前的总信息熵减去划分子集后的信息熵,得到信息增益,从不同的信息增益结果中选择信息增益最大的特征与对应值作为划分依据,将数据集分为两个子集;
第三步,继续第二步,直到子集无法再分或子集数量达到预设要求,结束划分,得到决策树。
3.1.3 解析
【解】首先计算训练样本数据集的经验熵。
对于训练样本的两个可能取值:能发芽和不能发芽
能发芽占比:5/9
不能发芽占比:4/9
可得,训练样本数据集的经验熵为:
$H(D)=E[I(x_i)]=-\sum_{i=1}^{n}p_i{\mathbf{log}_2{p_i}}=-(\frac{5}{9}\mathbf{log}_2(\frac{5}{9})+\frac{4}{9}\mathbf{log}_2(\frac{4}{9}))=0.99$
假设以形状作为划分属性,可将集合𝐷划分成𝐷(圆形)和𝐷(皱形),分别计算𝐃(圆形)和𝐃(皱形)的经验熵:
由此可得形状属性的信息增益如下:
$G(D,shape)=0.99-(\frac{5}{9}(H(D(circle)))+\frac{4}{9}H(D(wrinkled)))=0.99-(\frac{5}{9}\ast 0.97+\frac{4}{9}\ast 1.00)=0.01$
同理可得其他属性的信息增益如下:
𝐺(𝐷,颜色)=0.09 ;𝐺(𝐷,大小)=0.09;𝐺(D,土壤)=0.09;𝐺(𝐷,水份)=0.23;𝐺(𝐷,日照)=0.09
显然,水份属性的信息增益最大,故选择水份作为第一个划分属性,得到下图所示的初始决策树
𝐷(多)={1,3,4,8}:表示水份为多的训练样本集;
𝐷(少)={2,5,6,7,9}:表示水份为少的训练样本集。
继续对𝐷(多)和𝐷(少)进行划分,可得完整决策树。
用所得决策树对测试1样本进行预测如下:
首先:“水份”为“多”,故进入左子树;接着:“日照”在“12小时以下”进入左子树;最后:“大小”为“饱满”。
判断测试1样本预测结果:能够发芽。
3.2 例题2
3.2.1 题目
下表是一个由16个样本组成的感冒诊断训练数据集𝐷。每个样本由四个特征组成,即体温、流鼻涕、肌肉疼、头疼。其中体温特征有3个可能取值:普通、较高、非常高;流鼻涕,肌肉疼、头疼分别有两个可能取值:是、否;样本的标注值为是否感冒。试用ID3算法通过训练数据集𝐷建立一个用于判断是否感冒的决策树。
3.2.2 解析
【解】训练数据集𝐷的经验熵为:
$H(D,shape)=-(\frac{12}{16}\mathbf{log}_2{\frac{12}{16}}+\frac{4}{16}\mathbf{log}_2{\frac{4}{16}})=0.8113$
以体温作为划分属性,可将数据集𝐷划分为:
𝐷(普通),𝐷(较高),𝐷(非常高)
分别计算它们的经验熵,得到:
𝐻(𝐷(普通))=0.971
𝐻(𝐷(较高))=0.65
𝐻(𝐷(非常高))=0.7219
由此可得体温属性信息增益:
$G(D,temp)=H(D)-\frac{5}{16}H(D(common))-\frac{6}{16}H(D(higher))-\frac{5}{16}H(D(very high))=0.0385$
同理可得其它属性信息增益:
𝐺(𝐷,流鼻涕)=0.5117
𝐺(𝐷,肌肉疼)=0.0038
𝐺(𝐷,头疼)=0.0359
其中𝐺(𝐷,流鼻涕)值最大,故取 “流鼻涕”作为第一个划分属性。将集合𝐷划分为:
D1=𝐷(流鼻涕=是)={1,3,4,6,7,8,10,11}
D2=𝐷(流鼻涕=否)={2,5,9,12,13,14,15,16}
对集合𝐷1计算其余三个属性的信息增益,得到:
𝐺(𝐷1,体温)=0.1992 ;𝐺(𝐷1,肌肉疼)=0.0924;𝐺(𝐷1,头疼)=0.1379
𝐺(𝐷1,体温)值最大,故选择“体温”特征作为对集合𝐷1的划分属性。
同理对集合𝐷2计算其余三个属性的信息增益,得到:
𝐺(𝐷2,体温)=0.0157
𝐺(𝐷2,肌肉疼)=0.0157
𝐺(𝐷2,头疼)=0.0032
由于𝐺(𝐷2,体温)=𝐺(𝐷2,肌肉疼),故可在这两者中任选其一作为该节点划分属性。
此处选择“肌肉疼”特征作为集合𝐷2的划分属性。
递归调用上述步骤进一步对子集进行划分,直至满足算法终止条件,得到完整决策树如下:
4 决策树的剪枝
当输入的原始数据有较多的变量时,通过决策树算法生成的决策树可能会非常的庞大。这样的一颗决策树在训练集上有很好的表现,但是在测试集上的表现往往不甚理想,这样的问题也被叫做过拟合问题。面对这样的问题,一般所采用的处理方法是对决策树进行剪枝,常用的剪枝算法有REP、PEP、CCP等。本文详细介绍了三种剪枝算法,并配以计算实例。
4.1 剪枝的有关概念
4.1.1 决策树的过拟合问题
决策树算法生成的决策树非常庞大,每个变量都被详细地考虑过。在每一个叶节点上,只要继续分支会有信息增益的情况,不管信息增益有多大,都会进行分支操作。最终所达到的目的是决策树的叶节点所覆盖的训练样本都属于同一类。
如果我们用这个决策树来对训练集进行分类的话,那么这颗树的表现非常好。但是在测试集上的表现就远没有在训练集上的表现好,这就是过拟合问题。
4.1.2 决策树的剪枝
顾名思义,树的剪枝就是剪掉树的一些枝叶,考虑大决策树的枝代表着逻辑判断,也代表着分类后的子集。决策树的剪枝就是删掉一些不必要的逻辑判断,并且将子集合并。这样确实会造成在训练集上子集不纯的现象,但是因为我们最终目标是模型在测试集上的效果,所以牺牲在训练集上的效果换取解决测试集的过拟合问题这样的做法也是值得的。决策树剪枝可以分为两类,一类是预剪枝,一类是后剪枝。
4.1.3 预剪枝
预剪枝就是在生成决策树的同时进行剪枝。正常决策树的生成是只要有信息增益就要进行分支。预剪枝就是设定一个阈值,只有在信息增益大于这个阈值的时候(也即是在分类后的信息混乱程度减小程度大于一定标准的时候)才进行分类。如果在信息增益过小的情况下,即使存在信息增益的现象,也不会对其进行分支。预剪枝的思想比较简单,但在实际应用中,预剪枝的表现并不是很好。所以,目前我们基本都是使用后剪枝方法。
4.1.4 后剪枝
后剪枝就是在决策树构造完成后进行剪枝。剪枝的过程是对拥有相同父节点的一组节点进行检查,如果将其合并,熵增小于某一阈值,那么这一组节点可以合并一个节点。如果将其合并后熵增大于这个阈值,那么说明将其分枝是合理的。后剪枝就是删除一些子树,然后用其叶节点代替。这个叶节点代表的子集不一定都是“纯”的。那么,这个叶子节点所标识的类别通过大多数原则确定。大多数原则就是指这个叶节点所代表的子集中大多数的类别来表示这个叶节点。
4.2 常见的后剪枝算法
4.2.1 错误率降低剪枝法
错误率降低剪枝法(Reduced-Error Pruning)简称REP方法。
REP方法是通过一个新的验证集来纠正树的过拟合问题。对于决策树中的每一个非叶子节点的子树,我们将它替换成一个叶子节点,该叶子节点的类别用大多数原则来确定,这样就产生了一个新的相对简化决策树,然后比较这两个决策树在验证集中的表现。
如果新的决策树在验证集中的正确率较高,那么该子树就可以替换成叶子节点,从而达到决策树剪枝的目的。
该算法是从下往上依次遍历所有的子树,直至没有任何子树可以替换使得在验证集上的表现得以改进时,算法就可以终止。
实例:
生成的决策树,我们要对其进行剪枝,使用REP算法。
Step 1: 将节点4删掉替换成8和9,测试在验证集上的表现,若表现更好,则将节点4删掉并替换成8和9的并集,若表现不好则保留原树的形状。
Step 2: 将节点2删掉替换成8、9和5,测试在验证集上的表现。
Step 3: 将节点3删掉替换成6和7,测试在验证集上的表现。
4.2.2 悲观剪枝法
悲观剪枝法(Pessimistic Error Pruning)简称PEP方法。
REP方法思想简单且易于使用,不过最大的问题在于它需要一个新的验证集来修正我们的决策树。在PEP方法中,我们不需要新的验证集。
PEP方法也是根据剪枝前后的错误率来决定是否剪枝。和REP不同之处在于:PEP不需要新的验证集,并且PEP是自上而下剪枝的。由于我们还是用生成决策树时相同的训练样本,那么对于每个节点剪枝后的错分率一定是会上升的,因此在计算错分率时需要加一个惩罚因子0.5。
对于一叶节点,它覆盖了N个样本,其中有E个错误,那么该叶子节点的错误率为(E+0.5)/N。这个0.5就是惩罚因子,那么一颗子树,它有L个叶子节点,那么该子树的误判率估计为:
$p=\frac{\sum_{=1}^{L}E_{i}+0.5L}{\sum_{i=1}^{L}Ni}$
我们假设在子树中每一个样本的误判服从一个二项分布B(N,p),其中N表示子树所包含的所有样本个数。
所以,在剪枝前,其期望的误判数为:
$E(剪枝前误判数)=N*p$
其误判的标准差为:
$std(剪枝前误判数)=\sqrt{N*p*(1-p)}$
在剪枝之后,把子树替换成叶节点后,该叶子的误判次数也是一个伯努利分布,其概率误判率e为(E+0.5)/N,因此叶节点的误判次数均值为:
$E(剪枝后误判数)=N*e$
当子树的误判个数大于对应叶节点的误判个数一个标准差之后,就决定剪枝。剪枝条件为:
$E(剪枝后误判数)-std(剪枝前误判数)<E(剪枝前误判数)$
实例:
对于节点T4而言,剪枝前后的计算过程如下:
E(T7)=0 ;E(T8)=2;E(T9)=1;E(T10)=1;E(T4)=7;所以,剪枝前的误判概率为:
$p=\frac{(0+2+1+1)+4*0.5}{20}=0.3$
所以:
$E(剪枝前误判数)=20+0.3=6$
$std(剪枝前误判数)=\sqrt{20*0.3*0.7}=2.05$
在我们对T4进行剪枝后,即将T4直接作为叶节点,剪枝后的误判概率
$e=\frac{7+0.5}{20} =0.375$
剪枝后的误判期望数为:
$E(1)=20*0.375=7.5$
剪枝条件为:
$7.-2.05<6$
因此满足条件,所以我们将把T4节点剪枝。
4.2.3 代价复杂度剪枝法
代价复杂度算法(Cost-Complexity Pruning)简称为CCP算法。
CCP算法为子树Tt定义了代价和复杂度,以及一个衡量代价与复杂度之间关系的参数α。
代价指的是在剪枝过程中因子树Tt被叶节点替代而增加的错分样本;
复杂度表示剪枝后子树Tt减少的叶结点数;
α则表示剪枝后树的复杂度降低程度与代价间的关系,定义为:
$\alpha =\frac{R(t)-R(T_{t})}{|N|-1}$
其中,R(t)表示节点t的错误代价,R(t)=r(t)∗p(t)
r(t)表示节点t的错分样本率;
p(t)表示节点t中样本占全部样本的比例
∣N∣表示子树Tt中的叶节点数
CCP算法可以分为两个步骤,
Step 1: 按照上述公式从下到上计算每一个非叶节点的$\alpha$值,然后每一次都剪掉具有最小$\alpha$值的子树。从而得到一个集合 $\left\{T_0,T_1,T_2,...,T_M \right\}$,其中$\left\{T_0 \right\}$表示完整的决策树,$\left\{T_M \right\}$表示根节点。
Step 2: 根据真实的错误率在集合 $\left\{T_0,T_1,T_2,...,T_M \right\}$选出一个最好的决策树。
实例:
假设数据有100条,从下往上,首先计算$T_{5}$的$\alpha$值。
$R(T_5)= \frac{2}{12}*\frac{12}{100}=0.02$
$R(T_{5}t)=\sum_{i}^{} (R_{i})=\frac{0}{6}*\frac{6}{100}+\frac{2}{6}*\frac{6}{100}=0.02$
$\alpha = \frac{0.02-0.02}{2-1}=0 $
同理,$T_{6}$的$\alpha$为0.03,由于0<0.03,此时,我们将$T_{5}$剪掉而得到一棵新树。
5 CART算法
CART全称叫Classification and Regression Tree,即分类与回归树。CART假设决策树是二叉树,内部结点特征的取值只有“是”和“否”,左分支是取值为“是”的分支,有分支则相反。这样的决策树等价于递归地二分每个特征。
CART分类回归树可以做分类或者回归。如果待预测结果是离散型数据,则CART生成分类决策树;如果待预测结果是连续型数据,则CART生成回归决策树。数据对象的属性特征为离散型或连续型,并不是区别分类树与回归树的标准。CART作为分类决策树时,待预测样本落至某一叶子节点,则输出该叶子节点中所有样本所属类别最多的那一类(即叶子节点中的样本可能不是属于同一个类别,则多数为主);作为回归决策树时,待预测样本落至某一叶子节点,则输出该叶子节点中所有样本的均值。
5.1 CART分类树
CART分类树使用基尼指数作为节点划分依据,我们通过例题分析CART分类树实现过程。
5.1.1 例题
下表5-1为拖欠贷款人员训练样本数据集,使用CART算法基于该表数据构造决策树模型,并使用5-2表中测试样本集确定剪枝后的最优子树。
编号 | 房产状况 | 婚姻情况 | 年收(千元) | 拖欠贷款 |
1 | 是 | 单身 | 125 | 否 |
2 | 否 | 已婚 | 100 | 否 |
3 | 否 | 单身 | 70 | 否 |
4 | 是 | 已婚 | 120 | 否 |
5 | 否 | 高异 | 95 | 是 |
6 | 否 | 已婚 | 60 | 否 |
7 | 是 | 高异 | 220 | 否 |
8 | 否 | 单身 | 85 | 是 |
9 | 否 | 已婚 | 75 | 否 |
10 | 否 | 单身 | 90 | 是 |
编号 | 房产状况 | 婚姻情况 | 年收入(千元) | 拖欠贷款 |
1 | 否 | 已婚 | 225 | 否 |
2 | 否 | 已婚 | 50 | 是 |
3 | 否 | 单身 | 89 | 是 |
4 | 是 | 已婚 | 320 | 否 |
5 | 是 | 离异 | 150 | 是 |
6 | 否 | 离异 | 70 | 否 |
【解】对于房产状况特征,根据是否有房划分数据集:
𝐷(有)={1,4,7};𝐷(无)={2,3,5,6,8,9,10}
𝐷(有)和𝐷(无)的基尼指数为:
房产状况特征对𝐷进行子集划分时所得的基尼指数为:
$Gini(D,房产状态)=\frac{3}{10}\times Gini(D(有))+\frac{7}{10}\times Gini(D(无))=0.343$
对婚姻情况特征划分,因为婚姻状况有三种,需对其构造二元划分:
每种取值形式所对应的基尼指数分别为:
$Gini(D,婚姻)=\frac{4}{10}\times Gini(D(已婚))+\frac{6}{10}\times Gini(D(¬已婚))=0.3$
$Gini(D,婚姻)=\frac{4}{10}\times Gini(D(单身))+\frac{6}{10}\times Gini(D(¬单身))=0.3667$
$Gini(D,婚姻)=\frac{2}{10}\times Gini(D(离异))+\frac{8}{10}\times Gini(D(¬离异))=0.4$
(对比上述计算结果,取值分组:
“婚姻情况=已婚”和“婚姻情况≠已婚”
故取:Gini(𝐷,婚姻)=0.3
年收入特征具体做法如下:
首先依据“年收入”特征取值对样本进行升序排序,从小到大依次用“年收入”特征相邻取值的均值作为划分阈值,将训练样本集划分为两个子集。结果如下表所示:
使用年收入特征对𝐷进行划分的最小基尼指数为:
Gini(𝐷,R=97.5)=0.3
婚姻情况和年收入特征所对应基尼指数并列最小,均为0.3。
不妨选取婚姻状况作为第一个划分点,将集合𝐷划分为
𝐷(已婚)={2,4,6,9}和𝐷(¬已婚)={1,3,5,7,8,10}
得到如图所示的初始决策树。
𝐷(已婚)中所有人均不欠贷款,故无需再划分;
𝐷(¬已婚)递归调用上述过程继续划分,最后得到完整决策树,其中𝑌和𝑁分别表示两类不同取值样本数目。
5.2 CART回归树
CART决策树的生成就是递归地构建二叉决策树的过程,对回归树用平方误差最小化准则,对分类树用基尼指数最小化准则,进行特征选择,生成二叉树。
回归决策树(简称回归树)中,采用启发式搜索方法。假设有n个特征,每个特征有Si个取值,遍历所有特征,尝试该特征所有取值,对空间进行划分,直到取到特征j的取值s,使得损失函数最小,这样就得到1个划分点。公式如下:
$\underset{j,s}{\mathbf{min}}[\underset{C_1}{\mathbf{min}}\textit{{Loss}}(y_i,C_1)+\underset{C_2}{\mathbf{min}}\textit{{Loss}}(y_i,C_2)]$ (1)
假设将输入空间划分为M个单元,R1,R2,...,Rm。并在每个单元Rm上有一个固定输出值为$C_m=\mathbf{avg}(y_i|x_i\in R_m)$,Cm也就是该区域内所有点y值的平均数。
5.2.1 算法描述
输入:训练数据集D
输出:回归数f(x)
与线性回归相似,需要1个损失函数对回归效果进行评估,这里采用平方残差和RSS进行评估:
$RSS=\sum_{j=1}^{J}\sum_{i\in R_j}(y_i-\hat{y}_{R_j})^2$ (2)
上式内层$\sum_{}^{}$就是将该区域内所有样本预测值和真实值的差值平方进行求和。外层$\sum_{}^{}$就是遍历所有划分出来的区域。
公式(1)中,先寻找最优C1、C2使R1、R2的误差平方和最小,数学上很容易证明,当C1、C2分别为子集R1、R2的y的均值时成立,此时(1)式写成:
$\underset{j,s}{\mathbf{min}}[(\sum_{x_i\in R_1(j,s)}^{}(y_i-\bar{C_1})^2+(\sum_{x_i\in R_2(j,s)}^{}(y_i-\bar{C_2})^2]$ (3)
上式中,使表达式值最小的j(特征)和s(特征下对应的取值)值就是划分依据值。
这样,对于每一个(j,s),都会根据(3)式得到一个数值,然后取得使(3)式最小的(j,s),作为最优切分点。
找到最优切分点后,将样本切分为左右两个子节点,子节点的输出值为该节点内所有样本y的均值。
5.2.2 算法流程
在训练数据集所在的输入空间中,递归将每个区域划分为两个子区域,并决定每个子区域上的输出值,构建二叉树。
(1)选择最优切分特征j与切分点要,求解:
$\underset{j,s}{\mathbf{min}}[\underset{C_1}{\mathbf{min}}\sum_{x_1\in R_{1}(j,s)}^{}(y_i-C_1)^2+\underset{C_2}{\mathbf{min}}\sum_{x_2\in R_{2}(j,s)}^{}(y_i-C_2)^2]$
(2)用选定的对(j,s)划分区域并决定相应的输出值:
$R_{1(j,s)}=x|x^{(j)}\leqslant s, R_{2(j,s)}=x|x^{(j)}> s$
$\hat{C_m}=\frac{1}{N}\sum_{x_{1}\in R_{m(j,s)}}^{}y_{i},x\in R_{m},m=1,2$
(3)继续对两个区域调用步骤(1)和步骤(2),直到满足停止条件。
(4)将输入空间划分为M个区域R1、R2、...、Rm,生成决策树。
$f(x)=\sum_{m=1}^{M}\hat{C_{m}}I(x\in R_{m})$
5.2.3 例题
已知一批样本数据如下表所示,其中x为输入特征对应值,y为输出值,请建立该批数据的CART。
x | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
y |
5.56
|
5.7
|
5.91
|
6.4
|
6.8
|
7.05
|
8.9
|
8.7
|
9
|
9.05
|
5.2.4 解析
(1)选择最优切分特征j与最优切分点s:
确定第一个问题,选择最优特征,本数据据中,只有一个特征,因此,最优切分特征是x。
一共有10组数据,取中位数,得到9个切分点[5.56,5.7,5.91,6.4,6.8,7.05,8.9,8.7,9,9.05]。损失函数定义为最小平方损失函数。
$Loss(y,f(x))=(f(x)-y)^{2}$,将上述9个切分点依次代入下面公式,其中:
$C_{m}=\mathbf{avg}(y_{i}|x_{i}\in R_{m})$
a)计算子区域输出值:
例如,取s=1.5,此时区域1为R1=1,区域2为R2=2,3,4,5,6,7,8,9,10,这两个区域输出值分别为:
C1=5.56
C2=(5.7+5.91+6.4+6.8+7.05+8.9+8.7+9+9.05)/9=7.50
同理,取分别取s为2.5-9.5,计算结果如下:
S | 1.5 | 2.5 | 3.5 | 4.5 | 5.5 | 6.5 | 7.5 | 8.5 | 9.5 |
C1 | 5.56 | 5.63 | 5.72 | 5.89 | 6.07 | 6.24 | 3.62 | 6.88 | 7.11 |
C2 | 7.5 | 7.73 | 7.99 | 8.25 | 8.54 | 8.91 | 8.92 | 9.03 | 9.05 |
b)计算损失函数值,找到最优切分点:把C1、C2的值代入到平方损失函数$Loss(y,f(x))=(f(x)-y)^{2}$:
当s=1.5时,
L(1.5)=(5.56-5.56)2+[(5.7-7.5)2+(5.91-7.5)2+...+(9.05-7.5)2]=15.72,同理得:
S | 1.5 | 2.5 | 3.5 | 4.5 | 5.5 | 6.5 | 7.5 | 8.5 | 9.5 |
m(s) | 15.72 | 12.07 | 8.36 | 5.78 | 3.91 | 1.93 | 8.01 | 11.73 | 15.74 |
显然,当s=6.5时,m(s)最小,因此第一个划分变量为(j=x,s=6.5)。
(2)用选定的(j,s)划分区域并决定输出值:
两个区域是R1={1,2,3,4,5,6},R2={7,8,9,10}
输出值$C_{m}=\mathbf{avg}(y_{i}|x_{i}\in R_{m})$,C1=6.24,C2=8.91
(3)调用步骤(1)、(2),继续划分:
x | 1 | 2 | 3 | 4 | 5 | 6 |
y | 5.56 | 5.7 | 5.91 | 6.4 | 6.8 | 7.05 |
取划分点[1.5,2.5,3.5,4.5,5.5],则各区域输出值c如下表:
S | 1.5 | 2.5 | 3.5 | 4.5 | 5.5 |
C1 | 5.56 | 5.63 | 5.72 | 5.89 | 6.07 |
C2 | 6.37 | 6.54 | 6.75 | 6.93 | 7.05 |
计算损失函数值m(s)
S | 1.5 | 2.5 | 3.5 | 4.5 | 5.5 |
m(s) | 1.3087 | 0.754 | 0.2771 | 0.4368 | 1.0644 |
当s=3.5时,m(s)值最小。
(4)生成回归树,假设在生成3个区域后停止划分,则生成的回归树形式如下:
$T=\left\{\begin{matrix}5.72 & x\leqslant 3.5 \\6.75 & 3.5<x\leqslant 6.5 \\8.91 & 6.5<x \\\end{matrix}\right.$
(未完待续...)
参考资料:
机器学习各种熵:从入门到全面掌握 - 知乎 (zhihu.com)