决策树 --- 决策树概要

周志华的《机器学习》一书对决策树的讲解全面且细致,本文根据该书籍作出自己的理解,如有不恰当之处,还请指出,谢谢。

一、决策树概述

参照数据结构中树的定义,树由节点与边构成。决策树便是利用树的结构进行决策。

以二分类问题为例子,银行会通过一个人的个人信息(包括有职业,年龄,收入,学历)来决策是否贷款。决策的过程使用了如下图所示的决策树:

二、构建决策树算法

决策树算法使用了分治的思想,通过递归地选择最优特征,根据该特征对训练数据集进行划分,使得各子类有一个较好的分类过程。

设数据集 D=\{ (x_1,y_1),(x_2,y_2),...,(x_m,y_m) \}

属性集 A=\{ a_1, a_2,...,a_d \}

参照(1)图的实例,这里的数据集 D 中的一个实例, x_i 表示第 i 个人的个人信息(是个向量,包含有职业,年龄,收入,学历), y_i 表示是否贷款给这个人。以根节点为例,职业可以划分成自由职业,白领,工人,那么属性集 A={自由职业,白领,工人 } ,算法用伪代码型式给出:

TreeGenerate(D,A)

生成节点node

if D中的样本全属于同一类别 C
   将node标记成这个类别C的叶子节点
   return
end if

if 属性集无法区分 or D中的样本再A上取值相同
   将node标记成叶子节点,类别标记成D中样本最多的类
   return
end if

从A中选择最优划分属性a

for a' in a
   为 node 建立一个分支,D'表示样本D中在a上取值为a'的样本子集
   if D'为空
      将分支节点标记为叶子节点,类别标记为D中样本最多的类
      return;
   else
      TreeGenerate(D,A\{a'})   // 这里的A\{a'},表示集合A除去a'部分
   end if
end for

三、划分选择

整个决策树算法中,最关键的部分是如何从A中选择最优的划分属性。

1.信息增益

信息熵是度量样本集合纯度最常用的一种指标,设当前集合 D 中第 k 类样本所占比例为 p_k(k=1,2...X) ,则 D 的信息熵定义为:

Ent(D)=-\sum_{k=1}^{X}{p_klog_2p_k} \qquad \qquad\qquad(1)

其中 Ent(D) 的值越小, D 的纯度越高

设属性集为 a=\{ a^1,a^2,...,a^v \} ,使用a对样本集 D 进行划分,则会产生 V 个分支节点,这样 D 就被划分成了 V 个样本子集合,记作 D^v 。由(1)式,可以计算出 D^v 相对于 D 信息熵,这样对于 V 各类别,有:

-\sum_{v=1}^{v}{\frac {\left| D^v\right|}{\left| D \right|}}Ent(D^v)

定义信息增益为:

Gain(D,a)=Ent(D)-\sum_{v=1}^{v}{\frac {\left| D^v\right|}{\left| D \right|}}Ent(D^v)

当信息增益越大的时候,表示使用属性 a 进行划分所获得的纯度提升越大。因此整个优化目的为:

\arg \limits_{a\in A} max\ Gain(D,a)

2.增益率

上述的信息增益算法对取值数目较多的属性有所偏好,在著名的C4.5决策树使用增益率作为最优划分属性。增益率的定义为:

Gain\_ratio(D,a) = \frac{Gain(D,a)}{IV(a)}

其中:

IV=-\sum_{v=1}^{V}{\frac{\left| D^v \right|}{\left| D \right|}}log_2\frac{\left| D^v \right|}{\left| D \right|}

上述的增益率准则对可取值数目较少的属性有所偏好,因此C4.5决策树采用了先从划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。

3.基尼指数

CART决策树使用基尼指数来划分属性。定义数据集 D 的基尼值:

Gini(D)=\sum_{k=1}^{X}{\sum_{k\ne k'}^{}{p_kp_{k'}}}=1-\sum_{k=1}^{X}{p_k^2}

基尼值反映从数据集 D 中随机抽取两个样本,其类别标记不一致的概率,所以 Gini(D) 越小,数据集 D 纯度越高。属性 a 的基尼指数定义为:

Gini\_index(D,a)=\sum_{v=1}^{V}{\frac{\left| D^v \right|}{\left| D\right|}}Gini(D^v)

四、剪枝处理

剪枝是决策树学习算法对付“过拟合”的主要手段。决策树剪枝的基本策略有预剪枝后剪枝

这时将之前的数据集划分成训练集(双线上部)和验证集(双线下部)

1.预剪枝

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

基于信息增益准则,如上图所示,未采用任何划分规则时,假设将此根节点标记为叶子节点,并标记成好,因此验证集的精度为 \frac{3}{7} \times 100\%=42.9\% ,若采用脐带属性作为划分准则,则验证集的精度为 \frac{5}{7} \times 100\%=71.4\% ,因此用脐部进行划分得以确定。之后对上图中的节点2进行预剪枝,基于凹陷得到划分后验证集的精度小于划分前的精度,因此不允划分。对于节点3划分前精度等于划分后精度,未能提升验证集精度,因此也不允予划分。节点4的样本都为同一类别,因此不必进行划分。

预剪枝基于贪心算法的思想,然而这种剪枝效果有时带来的效果并不是很好,甚至可能会陷入欠拟合的情况中。但可以节省很多的计算资源。

2.后剪枝

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

以图(1)的决策树为例,自底向上,先考虑第四层。如果将节点6替换成叶子节点,那么该叶节点包含编号{7,15}的训练样本。该节点的类别标记为好瓜,此时决策树的验证集精度提高到了57.1%,因此决定剪枝。

再考虑第三层,对于节点5,若将其子树替换成叶子节点,替换后的叶子节点包含编号为{6,7,15}的训练样本。叶节点类别标记为好瓜,此时验证机的精度提高到71.4%,因此决定剪枝

同理,对节点2验证后,决定剪枝,对节点3和1,不决定剪枝。最终决策树如下图所示:

因此后剪枝决策树欠拟合风险很小,泛化性能优于预剪枝,但是后剪枝过程的时间开销较预剪枝较大。

五、连续与缺失值

1.连续值处理

上述决策树都是基于离散属性来生成决策树,现实学习任务会遇到连续属性。而处理连续属性是采用C4.5决策树算法中的二分法离散化连续值。

给定样本集和连续属性 a ,设 a 在 D 上出现了n个不同的取值,就将这n个值从小到大排序,记为{ a^1,a^2,...,a^n },设划分点为 t ,将集合 D 分成了子集 D^-_t,D^+_t ,如果属性 a 的值小于 t ,则划分到 D^-_t 中,否则划分到 D^+_t 中。

这里划分点 t 选择是根据最大信息增益的基础上选择。首先,由于 a 在 D 上有n个取值,在区间 [a^i,a^{i+1}) 中所取的任意值的划分结果相同,因此需要考察 n-1 个候选划分点集合。这n-1个候选划分集合:

T_a=\{\frac{a^i+a^{i+1}}{2}|\ 1\leq i \leq n-1\}

由如下公式:

\ Gain(D,a)=\max \limits_{t\in T_a}Gain(D,a,t) \qquad \qquad \qquad \qquad \qquad (2)

\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ = \max \limits_{t\in T_a}Ent(D)-\sum_{\lambda\in \{-,+\}}^{}{\frac{\left| D^{\lambda}_t \right|}{\left| D\right|}}Ent(D^{\lambda}_t )

将候选划分集合带入上式,求解信息增益最大情况下的划分点 t

以下述训练集合为例

对密度属性来说,候选划分集合为

T_{密度}=\{0.244,0.294,0.351,0.381,0.420,0.459,0.518,0.574,0.600,0.621,0.636,0.648,0.661,0.681,0.708,0.746\}

当划分点取0.381时,信息增益最大为0.262

同样地,对含糖率说,当划分点取0.126,此时信息增益最大为0.349

因此: Gain(D,密度)=0.262

Gain(D,含糖率)=0.349

最终可以得到决策树:

2.缺失值处理

如上图数据集,某些样例的部分属性出现缺失。而处理缺失数据的过程要解决两个问题:

  • 如何在属性值缺失的情况下进行划分属性选择
  • 给定划分属性的情况下,若样本在该属性上的值缺失,如何对样本进行划分

对于问题一用如下的方式进行求解:

给定训练集 D 和属性 a ,令 \tilde{D} 表示 D 中在属性 a 没有缺失值的样本子集, \tilde{D}_k 表示 \tilde{D}中属于第 k 类的样本,定义:

无缺失值样本所占比例: \rho=\frac{\sum_{x\epsilon \tilde{D}}^{}{w_x}}{\sum_{x\epsilon D}^{}{w_x}}

无缺失样本中第 k 类所占比例: \tilde{\rho_k}=\frac{\sum_{x\epsilon \tilde{D_k}}^{}{w_x}}{\sum_{x\epsilon D}^{}{w_x}}

无缺失样本中第 k 类占无缺失样本比例: \tilde{r_v}=\frac{\sum_{x\epsilon \tilde{D_k}}^{}{w_x}}{\sum_{x\epsilon   \tilde{D}}^{}{w_x}}

因此可以重新定义信息增益:

Gain(D,a)=\rho \times Gain(\tilde{D},a)

\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ = \rho \times(Ent(\tilde{D})-\sum_{v=1}^{V}{\tilde{r_v}Ent(\tilde{D^v})}

这里有:

Ent(\tilde{D})=-\sum_{k=1}^{X}{\tilde{p}^klog_2\tilde{p}_k}

对于问题二:

如果样本在该属性上出现了缺省值,则将样本按权值划分到所有子节点上,权值计算通过: \tilde{r_v} * w_x

参考文献:

周志华《机器学习》

猜你喜欢

转载自blog.csdn.net/adorkable_thief/article/details/84555000