第四章 决策树

4.1 基本流程

决策树:基于树结构进行分类决策的机器学习方法。一颗决策树一般包含一个根结点、若干个内部结点和若干个叶结点。

  • 根结点:包含样本全集。
  • 内部结点:对应于一个属性测试。每个结点包含的样本集合根据属性测试的结果被划分到子结点中。
  • 叶结点:对应于决策属性。从根结点到每个叶结点的路径对应了一个判定测试序列。

基本算法

  • 输入:训练集D = {(x1, y1), (x2, y2), ..., (xm, ym)};
          属性集A = {a1, a2, ..., ad}.
  • 过程:函数TreeGenerate(D, A)
    1. 生成结点node;
    2. if D中样本全属于同一类型C then
    3.   将node标记为C类叶结点; return
    4. end if
    5. if A = ∅ OR D中样本在A上取值相同 then
    6.   将node标记为叶结点, 其类别标记为D中样本数最多的类; return
    7. end if
    8. 从A中选择最优划分属性a*;
    9. for a*的每一个值a^v_* do
    10.   为node生成一个分支; 令Dv表示D中在a*上取值为a^v_*的样本子集;
    11.   if Dv为空 then
    12.     将分支结点标记为叶结点, 其类别标记为D中样本最多的类; return
    13.   else
    14.     以TreeGenerate(Dv, A \ {a*})为分支结点
    15.   end if
    16. end for
  • 输出:以node为根结点的一颗决策树

以下为TreeGenerate函数的运行步骤:
第1行:生成根结点。
第2-4行:对应第一种递归返回,当前结点包含的样本全属于同一类别C,无需划分。将此结点标记为C类叶结点。(当前结点里全都是好瓜/全都是坏瓜)
第5-7行:对应第二种递归返回,当前属性集为空,或是所有样本在所有属性上取值相同,无法划分。将此结点划分为叶结点,其类别标记为D中样本数最多的类,利用了当前结点的后验分布。(当前结点中好瓜比较多则标记为好瓜类,反之亦然)
第8行:在所有的属性中挑选出一个最适合划分的属性a* ,挑选方法在4.2节讨论。(如在西瓜的属性中挑选出纹理属性作为a *
第9行-10行 :将根结点按照最优属性a* 的值划分为多个内部结点。(按照纹理属性生成纹理清晰分支、纹理稍糊分支、纹理模糊分支)
第11-16行:若当前结点包含的样本集合为空,对应第三种递归返回,不能划分。将此结点划分为叶结点,其类别标记为D中样本数最多的类,把父结点的样本分布作为当前结点的先验分布。(训练集中没有纹理模糊的瓜, 若训练集中好瓜比较多,则假设纹理模糊的瓜都是好瓜)若当前结点样本集合不为空,则递归调用TreeGenerate函数生成分支结点,输入参数变为Dv和A \ {a* }。(去除纹理属性后在当前结点继续往下分支,分支方法从第1行开始执行。)
决策树的生成是一个递归过程,函数本身只执行生成一次分支,但通过在函数里调用函数的本身,使得分支再往下生成分支直至分类完成。


4.2 划分选择

4.2.1 信息增益

信息熵:度量样本集合纯度最常用的一种指标。假定当前样本集合D中第k类样本所占的比例为pk (k = 1, 2, ..., |y|),则D的信息熵定义为Ent(D) = - \displaystyle\sum_{k=1}^{|y|}p_klog_2p_k(通过好瓜与坏瓜的比例计算熵)

  • Ent(D)的值越小,则D的纯度越高。(信息熵代表的是某件事情(一堆西瓜)到底是那种情况(好坏瓜比例)的不确定性。所以熵越小,越能确定好坏瓜的比例,即纯度越高)
  • 若p = 0,则plog2p = 0。
  • Ent(D)的最小值为0,最大值为log2|y|。

信息熵的公式定义可参考YJango的视频
https://www.bilibili.com/video/av41539594

关于信息熵的上下限计算可参考南瓜书
https://datawhalechina.github.io/pumpkin-book/#/chapter4/chapter4

信息增益:假定离散属性a有V个可能的取值{a1, a2, ..., aV},若使用a来对样本集D进行划分,则会产生V个分支结点,其中第v个分支结点包含了D中所有在属性a上取值为av的样本,记为Dv。考虑到不同的分支结点所包含的样本数不同,给分支结点赋予权重|Dv|/|D|,即样本数越多的分支结点影响越大,于是可计算出用属性a对样本集D进行划分所获得的信息增益。(先选定一个属性,如色泽,可将训练集分成青绿、乌黑、浅白三类。分别计算三个小类的里好瓜和坏瓜的不确定性,即信息熵。而后计算三个小类信息熵的加权和)
Gain(D, a) = Ent(D) - \displaystyle\sum_{v=1}^V\frac{|D^v|}{|D|}Ent(D^v)

  • 信息增益 = 根结点的信息熵 - 所有分支结点的信息熵的加权和。
  • 信息增益越大,则意味着使用属性a来进行划分所获得的纯度提升越大。(因为根结点的信息熵是确定的,通过比较信息增益,可以比较出每个属性的信息熵加权和,信息增益越大,信息熵加权和越小,则不确定性越小,说明此属性更能帮助减少不确定性)
  • 可在算法第8行进行选择属性a_{*}=\underset{a \in A}{\arg \max } \operatorname{Gain}(D, a),即ID3算法。
  • 信息增益准则对可取值数目较多的属性有所偏好。(使用色泽属性只能取三个值,乌黑、青绿、浅白,但如果使用编号属性则能取最多的值,此时一个样本就是一个子集,好瓜坏瓜是确定的,熵为0,信息增益最大,但没有意义)

书上有详细的计算过程,此处省略

代码思路

  1. 使用numpy包创建数据集。
  2. 创建基础函数,用以计算信息熵、信息增益。
  3. 创建寻找最优属性的函数,比较各属性的信息增益,选取信息增益最大的属性。
  4. 创建树生成函数,具体可参考4.1的基本算法,在第8行使用上述函数。
  5. 使用matplotlib包进行树的可视化。

4.2.2 增益率

增益率Gain\_ratio (D, a)=\frac{\operatorname{Gain}(D, a)}{\operatorname{IV}(a)}
固有值IV(a)=-\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \log _{2} \frac{\left|D^{v}\right|}{|D|}

  • 属性a的可能取值数目越多(即V越大),则IV(a)的值通常会越大。(增益率本质上是在信息增益的基础之上乘上一个惩罚参数(\frac{\operatorname1}{\operatorname{IV}(a)})。特征个数较多时,惩罚参数较小;特征个数较少时,惩罚参数较大。可以解决信息增益对可取数值较多的属性的偏好带来的不利影响。)
  • 增益率准则对可取数目较少的属性有所偏好。(可取数目较少的属性的惩罚参数小。)
  • C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。

代码思路

  1. 使用numpy包创建数据集。
  2. 创建基础函数,用以计算信息熵、信息增益、信息增益率。
  3. 创建寻找最优属性的函数,先找出信息增益高于平均水平的属性,再从中选择增益率最高的。
  4. 创建树生成函数,具体可参考4.1的基本算法,在第8行使用上述函数。
  5. 使用matplotlib包进行树的可视化。

4.2.3 基尼指数

基尼值:度量数据集的纯度的指标。假定当前样本集合D中第k类样本所占的比例为pk (k = 1, 2, ..., |y|),
\begin{aligned} \operatorname{Gini}(D) &=\sum_{k=1}^{|y|} \sum_{k^{\prime} \neq k} p_{k} p_{k^{\prime}} \\ &=1-\sum_{k=1}^{|y|} p_{k}^{2} \end{aligned}

  • Gini(D)反映了从数据集中随机抽取两个样本,其类别标记不一样的概率。
  • Gini(D)越小,则数据集D的纯度越高。(如果数据集中好瓜比例很大,则此数据集纯度较高,此时随机抽取两个瓜,两个都为好瓜的概率大于一好一坏,即类别标记不一样的概率小,基尼值小。)

基尼指数:假定离散属性a有V个可能的取值{a1, a2, ..., aV},若使用a来对样本集D进行划分,则会产生V个分支结点,其中第v个分支结点包含了D中所有在属性a上取值为av的样本,记为Dv。考虑到不同的分支结点所包含的样本数不同,给分支结点赋予权重|Dv|/|D|,即样本数越多的分支结点影响越大,于是可计算出用属性a对样本集D进行划分所获得的基尼指数。
\operatorname{Gini\_index}(D, a)=\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \operatorname{Gini}\left(D^{v}\right)

  • 可在算法第8行进行选择属性a_{*}=\underset{a \in A}{\arg \min } \operatorname{Gini\_index}(D, a),即CART决策树。(先选定一个属性,如色泽,可将训练集分成青绿、乌黑、浅白三类。分别计算三个小类的Gini(D),而后计算三个小类Gini(D)的加权和。对属性集A中的每个属性都进行一遍计算,选择那个使得划分后基尼指数最小的属性作为最优划分属性)

代码思路

  1. 使用numpy包创建数据集。
  2. 创建基础函数,用以计算数据集的基尼值和属性的基尼指数。
  3. 创建寻找最优属性的函数,比较各属性的基尼指数,选取基尼指数最小的属性。
  4. 创建树生成函数,具体可参考4.1的基本算法,在第8行使用上述函数。
  5. 使用matplotlib包进行树的可视化。


4.3 剪枝处理

剪枝: 通过主动去掉一些分支来降低过拟合的风险。
决策树桩:仅有一层划分的决策树。

4.3.1 预剪枝

预剪枝:在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。

  • 降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。
  • 有欠拟合风险。有些分支的当前划分虽不能提升泛华性能、甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却又可能导致性能显著提高。

书上有详细的过程,此处略。

代码思路

  1. 创建一个基础函数,用以计算划分前与划分后的进度并进行比较。
  2. 参考4.1的代码,在第14行后使用上述函数。如果划分后的精度相比划分前的精度下降,则直接作为叶结点返回。

4.3.2 后剪枝

后剪枝:先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。

  • 后剪枝决策树通常比预剪枝决策树保留了更多的分支,一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。
  • 后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。

书上有详细的过程,此处略。

代码思路
在生成分支结点的时候计算若直接生成叶结点的精度,在树生成完毕后自下而上进行比较,若精度有所提高则生成叶结点。


4.4 连续与缺失值

4.4.1 连续值处理

二分法:将连续属性离散化。

  1. 给定样本集D和连续属性a,假定a在D上出现了n个不同的取值,将这些值从小到大进行排序,记为{a1, a2, ..., an}(如西瓜的密度,由小到大排序)
  2. 基于划分点t可将D分为子集D^-_tD^+_t,其中D^-_t包含那些在属性a上取值不大于t的样本,而D^+_t则包含那些在属性a上取值大于t的样本。(若划分点t为密度=0.5,则子集D^-_t包含所有密度小于0.5的西瓜样本,子集D^+_t包含所有密度大于0.5的西瓜样本)
  3. 显然,对相邻的属性取值ai与ai+1来说,t在区间[ai, ai+1)中取任意值所产生的划分结果相同。(假设两个相邻取值为密度0.5和密度0.7,则t在0.5~0.7之间任取值都会将0.5和0.7两个瓜划分开来,其划分结果相同)
  4. 因此,对连续属性a,我们可考察包含n-1个元素的候选划分点集合T_{a}=\left\{\frac{a^{i}+a^{i+1}}{2} | 1 \leqslant i \leqslant n-1\right\},即把区间[ai, ai+1)的中位点\frac{\operatorname{a^i+a^{i+1}}}{\operatorname2}作为候选划分点。(按照从小到大的排序,将每两个相邻的密度值的中位点作为候选划分点t,由此得到一个t的合集Ta
  5. 然后,我们就可像离散属性值一样来考察这些划分点,选取最优的划分点来进行样本集合的划分。(假设Ta中有密度=0.381和密度=0.45,按密度=0.381为划分点生成决策树的分支,然后计算其信息增益,再计算密度=0.45划分的信息增益,选择信息增益最大的划分点。此时的信息增益代表密度属性的信息增益,再与其他属性(色泽、根蒂等)的信息增益进行比较。当密度的信息增益最大时,使用划分点划分,如将西瓜分成密度大于0.381、小于0.381两类。)
  6. 若当前结点划分属性为连续属性,该属性还可作为其后代结点的划分属性。

关于(4.8)式可参考南瓜书
https://datawhalechina.github.io/pumpkin-book/#/chapter4/chapter4?id=_46

4.4.2 缺失值处理

如何在属性值缺失的情况下进行划分属性选择

  1. 给定训练集D和属性a,令\tilde{D}表示D中在属性a上没有缺失值的样本子集。(假设属性a为色泽,将色泽属性没有缺失的西瓜挑出作为子集\tilde{D}
  2. 假定属性a有V个可取值{a1, a2, ..., aV},令\tilde{D}^{v}表示\tilde{D}中在属性a上取值为av的样本子集,\tilde{D}_{k}表示\tilde{D}中属于第k类(k = 1, 2, ..., |y|)的样本子集,则显然有\tilde{D}=\bigcup_{k=1}^{|\mathcal{Y}|} \tilde{D}_{k}\tilde{D}=\bigcup_{v=1}^{V} \tilde{D}^{v}(如\tilde{D}^{青绿}表示\tilde{D}中色泽青绿的集合,\tilde{D}_1表示\tilde{D}中好瓜的集合,\tilde{D}_2表示\tilde{D}中坏瓜的集合,则有\tilde{D}\tilde{D}_1\tilde{D}_2的并集,\tilde{D}也是\tilde{D}^{青绿}\tilde{D}^{乌黑 }\tilde{D}^{浅白}的并集,)
  3. 假定我们为每个样本x赋予一个权重wx(在决策树学习的开始阶段,根结点中各样本的权重初始化为1),并定义
    \begin{aligned} \rho &=\frac{\sum_{\boldsymbol{x} \in \bar{D}} w_{\boldsymbol{x}}}{\sum_{\boldsymbol{x} \in D} w_{\boldsymbol{x}}} \\ \tilde{p}_{k} &=\frac{\sum_{\boldsymbol{x} \in \tilde{D}_{\boldsymbol{k}}} w_{\boldsymbol{x}}}{\sum_{\boldsymbol{x} \in \tilde{D}} w_{\boldsymbol{x}}} \quad(1 \leqslant k \leqslant|\mathcal{Y}|) \\ \tilde{\boldsymbol{r}}_{\boldsymbol{v}} &=\frac{\sum_{\boldsymbol{x} \in \bar{D}^{v}} w_{\boldsymbol{x}}}{\sum_{\boldsymbol{x} \in \bar{D}} w_{\boldsymbol{x}}} \quad(1 \leqslant v \leqslant V) \end{aligned}
    直观的看,对属性a,ρ表示无缺失值样本所占比例(色泽属性没有缺失的西瓜数量占所有西瓜的比例)\tilde{p}_{k}表示无缺失值样本中第k类所占的比例\tilde{p}_{1}表示色泽属性没有缺失的西瓜中好瓜的比例,\tilde{p}_{2}表示色泽属性没有缺失的西瓜中坏瓜的比例)\tilde{r}_{v}则表示无缺失值样本中在属性a上取值av的样本所占的比例\tilde{r}_{青绿}表示色泽属性没有缺失的西瓜中,青绿西瓜所占的比例)。显然\sum_{k=1}^{|\mathcal{Y}|} \tilde{p}_{k}=1, \sum_{v=1}^{V} \tilde{r}_{v}=1
  4. 基于上述定义,我们可将信息增益的计算式(4.2)推广为\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}
    其中Ent(\tilde{D}) = - \displaystyle\sum_{k=1}^{|y|}\tilde{p}_klog_2\tilde{p}_k
    信息增益 = 无缺失值样本所占比例 x (无缺失值集合的信息熵 - 无缺失值集合中按属性值划分后所有分支结点的信息熵的加权和)
    (即忽略掉属性值缺失的样本,按照无缺失值的集合的好坏瓜比例来计算属性的信息增益,再乘上无缺失值样本占所有样本的比例,即为该属性的信息增益,而后对比其他属性的信息增益进行划分。)

给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分

  • 若样本x在划分属性a上的取值已知,则将x划入 与其取值对应的子结点,且样本权值在子结点中保持为wx
  • 若样本x在划分属性a上的取值未知,则将x同时划入所有子结点,且样本权值在与属性值av对应的子结点中调整为\tilde{r}_{v}·wx;直观地看,这就是让同一个样本以不同的概率划入到不同的子结点中去。


4.5 多变量决策树

若我们把每个属性视为坐标空间中的一个坐标轴,则d个属性描述的样本就对应了d维空间中的一个数据点,对样本分类则意味着在这个坐标空间中寻找不同类样本之间的分类边界

单变量决策树

  • 因为每一段分类边界的划分都直接对应了某个属性取值,所以其分类边界都与轴平行
  • 但在学习任务的真实分类边界比较复杂时,必须使用很多段划分才能获得较好的近似。(下图黑线)
  • 此时的决策树会想当复杂,由于要进行大量的属性测试,预测时间开销会很大。

多变量决策树

  • 能实现“斜划分”甚至更复杂划分的决策树。(下图红线)
  • 实现斜划分的多变量决策树中,非叶结点不再是仅对某个属性,而是对属性的线性组合进行测试。换言之,每个非叶结点是一个形如\sum_{i=1}^{d} w_{i} a_{i}=t的线性分类器,其中wi是属性ai的权重,wi可在该结点所含的样本集和属性集上学得。(如下图决策树)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容

  • 4.1 基本流程 决策树(decision tree)是一类常见的机器学习方法,它是基于树结构来进行决策的,这是人...
    lammmya阅读 977评论 0 0
  • 4.1 基本流程 决策树(decision tree)是一类常见的机器学习方法,它是基于树结构来进行决策的,这是人...
    Chasing_8513阅读 1,035评论 0 0
  • 4.1 基本流程 1.决策树的基本结构 1)根结点:相当于树的根2)内部结点(决策结点):相当于树的枝干3)叶结点...
    D系鼎溜阅读 1,843评论 3 1
  • (图片来源网络) 1. 章节主要内容 决策树是机器学习的一类常见算法,其核心思想是通过构建一个树状模型来对新样本进...
    闪电随笔阅读 5,224评论 3 14
  • 简述 决策树是机器学习的一类常见算法,其核心思想是通过构建一个树状模型来对新样本进行预测。树的叶结点是预测结果,而...
    泽平阿阅读 964评论 0 0