决策树 Decision Tree

决策树的核心思想就是 if else,实现了 conditional aggregation,关键问题在于分裂的时候哪些特征在前哪些特征在后。从 ID3 开始使用熵(entropy)来作为决策选择的度量。决策树可以做分类,也可以做回归,是一种比较灵活的算法。主要包括 ID3、C4.5、CART,可以作为后续许多 ensemble 方法(例如 random forest 和 gradient boosting decision tree)的基础模型。

决策树 Decision Tree_第1张图片

 

可以把决策树模型从 if else 的角度拆解为 G(x) = ΣTt=1 qt(x)*gt(x) ,其中 qt(x) 表示条件、gt(x) 表示基本假设。从递归角度来拆解,G(x) = ΣCc=1 [b(x) = c]*Gc(x),其中 b(x) 表示分支条件,Gc(x) 表示子树。

决策树模型的原则就是每次决策过程越简单越好,很类似人做决策的过程,可解释性强。

 

 

度量随机变量的不确定性,越混乱熵越大。H(X) = - ∑ p(xi) * log(p(xi)) ,其中 p(xi) b表示随机变量 X 取值到 xi 的概率,熵要对 X 所有可能的取值求和。例如一枚均匀硬币抛一次,正面朝上的次数为 X,那么 H(X) = - 0.5log(0.5) - 0.5log(0.5) = log2。另外定性的分析,均匀的情况下不确定性最大,所以 H(X) = log2 其实也是这个问题中熵的最大值。

 

对于两个随机变量:

  联合熵 H(X, Y) = - ∑ p(x, yi) * log(p(x, yi)) 

  条件熵 H(X | Y) = - ∑ p(x, yi) * log(p(xi | yi)) = Σ p(yj) * H(X | yj) ,度量在知道 Y 以后 X 的剩下的不确定性

  互信息(信息增益) I(X , Y) = H(X) - H(X | Y) , 度量在知道 Y 以后 X 的不确定性的减少程度

 

 

ID3 决策树

用信息增益的大小来选择哪个特征来用于决策树中当前节点的分裂,递归地构建决策树,直到所有特征的信息增益均很小或没有特征可以选择为止。ID3 相当于用极大似然法进行概率模型的选择。

算法流程:

  1. 初始化信息增益的阈值 ε

  2. 如果样本都属于同一类 D,则返回单节点树 T,类别标记为 Di

  3. 如果特征为空则返回单节点树 T,类别直接标记为样本中数量最多的类别

  4. 计算 A 中所有维度的特征(n 维)对输出 D 的信息增益 I(D, A) = H(D) - H(D | A),选择信息增益最大的特征 A分裂。如果 Ag 的信息增益小于设定的阈值,返回单节点树,类别直接标记为样本中数量最多的类别;否则按 Ag 的所有不同取值 ai 把样本集 D 分割成若干类别的非空子集 Di ,每个类别产生一个子节点,对应特征值为 Agi ,类别标记为 Di 中实例数最大的类别。返回增加了节点的树 T

  5. 对所有的子节点,令 D = Di,A = A - { Ag},递归调用 2-4,得到子树 T并返回

 

ID3 决策树存在的问题:

  1. 只有树的生成,容易过拟合。

  2. 没有考虑连续特征

  3. 信息增益作为选择特征的标准存在问题(相同条件下,取值比较多特征信息增益大)

  4. 没法处理缺失值

 

 

C4.5 决策树

如何改进 ID3:

  1. 引入正则化系数初步剪枝

  2. 将连续特征离散化。比如 N 个样本的连续特征取值有 N 个,就取相邻两点取值的平均数作为划分点,一共得到 N-1 个划分点。对所有的划分点,分别计算以该点作为二分类点时的信息增益比,选择最大的作为该连续特征的二元离散分类点

  3. 用信息增益比。IR(D, A) = I(D, A) / HA(D),其中 HA(D) 是 D 关于 A 的熵,HA(D) = - Σni=1 |Di|/|D|  * log(|Di|/|D|),n 是特征 A 取值的个数

  4. 缺失值的处理

   样本缺失某些特征的情况下如何选择划分:对于某一个有缺失值的特征 A,将数据分成两部分,对每部分样本设置一个权重(初始可以都为1),然后划分数据,一部分是有特征值 A 的数据 D1 ,一部分是没有特征值 A 的数据 D2 。然后对 D来和对应的 A 特征的各个特征值一起计算加权后的信息增益比,最后乘上系数 ε, ε 为 D1 样本加权后所占加权总样本的比例

   选定了划分属性,对于该属性上缺失特征的样本如何处理:可以把缺失特征值的样本同时划分入所有的子节点,同时将该样本的权重按各子节点的样本容量比例来分配。

 

C4.5 决策树存在的问题:

  1. 还是需要后剪枝

  2. 多叉树不如二叉树效率高

  3. 只能做分类

  4. 大量对数运算耗时,如果是连续特征还会有大量排序运算

 

 

CART 决策树

比较优的一种决策树,既能做分类也能做回归,基于二叉树结构,也支持对连续特征的处理和对缺失值的处理,采用后剪枝有效解决过拟合。驱动思想就是,要加权考虑分割后两边的数据都各自比较“纯”(如何衡量?均方误差或基尼指数)。如果 serving 的过程中样本缺失某个维度的特征,就找一个 surrogate 来代替缺失的特征(训练的时候为每个特征的分割找一些替代特征的分割,要和原来的切割方式越接近越好)。

 

基尼指数

在分类问题中,假设有 K 个类别,样本点属于第 k 类的概率为p,则概率分布的基尼指数定义为

Gini(p) = ΣKk=1  pk (1 - pk) = 1 -  ΣKk=1  (pk)2

对于给定的样本 D,假设有 K 个类别,第 k 个类别的数量为 Ck ,则样本 D 的基尼指数为

Gini(D) = 1 - ΣKk=1 ( |Ck|/|D| )2

 

可以看出基尼指数和熵之半很接机,都可以用来近似分类误差率,但基尼指数中的二次运算比对数运算简单的多。

决策树 Decision Tree_第2张图片

 

CART 分类树对连续特征和离散特征的处理 

决策树 Decision Tree_第3张图片

 

 对于连续特征,也是离散化,和C4.5相同。区别在于使用基尼指数作为选择划分点的度量(decision stump),以及如果当前节点为连续属性,该属性后面还可以参与子节点的产生选择过程。

对离散特征的处理就是不停的二分离散特征,例如特征 A 有 A1、A2、A3 三种类别,CART 分类树会选择{A1}和{A2, A3}、{A2}和{A1, A3}、{A3}和{A1, A2}中基尼指数最小的组合(decision subset)。由于没有把 A 特征的取值完全分开,后面还有机会在子节点继续选到 A 来划分。这和 ID3、C4.5 直接构建多叉树一次完全分开特征不同。

 

CART 分类树算法流程:

决策树 Decision Tree_第4张图片

从根节点开始,递归地构建 CART 决策树

  1. 对当前节点的数据集合 D,如果样本容量小于阈值或没有特征,则返回决策子树,当前节点停止递归

  2. 计算 D 的基尼指数,如果小于阈值则返回决策子树,当前节点停止递归

  3. 计算当前节点现有的各个特征的各个特征值对 D 的基尼指数,选择最小基尼指数最小的特征 A 和对应的特征值 a,并据此把数据集划分为两部分 D1 和 D2,同时建立当前节点的左右节点,左节点数据集为 D1、右节点为 D2

  4. 对左右节点递归调用 1-3,生成决策树

可以发现 CART 处理多分类是很容易的。

 

CART 回归树

和分类树相比,连续特征处理方法不同、决策树建立后做预测的方式不同。其他和 CART 分类树相同

回归树的度量目标是,对于任意划分特征 A,对应的任意划分点 s 两边划分成的数据集 D1 和 D2,求出使 D1 和 D2各自集合的均方差最小、同时 D1 和 D2 的均方差之和最小所对应的特征和特征值划分点:

决策树 Decision Tree_第5张图片

其中,c1 为 D1 的样本输出均值,c2 为 D2 的样本输出均值。

构建完决策树后,用最终叶子的均值或中位数来做预测。

 

CART 决策树的剪枝

回归树剪枝用均方差度量损失,分类树剪枝用基尼指数度量损失。相当于一种正则化。

剪枝过程中,对任意的一颗子树 T, 参数为 α 的整体损失函数为:Cα(T) = C(T) + α|T|,其中 C(T) 是对训练数据的预测误差,|T| 为叶节点个数,参数 α 衡量训练数据的拟合程度与模型复杂度。对于固定的 α ,一定存在使 Cα(T) 最小的子树(当 α 大的时候最优子树 Tα 偏小,α 小的时候最优子树 Tα 偏大。极端情况 α = 0,整体树最优;α = ∞,根节点构成的单节点树最优)

 

对于整体树 T0 任意的内部节点 t,以 t 为单节点树的损失为 Cα(t) = C(t) + α ;以 t 为根节点的子树 Tt 的损失为 Cα(Tt) = C(Tt) + α|Tt| 

当 α = 0 或充分小时,有不等式  Cα(Tt) < Cα(t) ;当 α 增大时,在某一个 α 有 Cα(Tt)  =  Cα(t) ;再增大时 Cα(Tt) > Cα(t)

只要 α = (C(t) - C(Tt))/ (|Tt| - 1), t 和 Tt 有相同的损失值,而 t 的节点更少,因此 t 比 Tt 更可取,对 Tt 剪枝。为此,对 T0 中对每一个内部节点 t ,计算 g(t) = (C(t) - C(Tt))/ (|Tt| - 1),表示剪枝后整体损失函数减少的程度。在 T0 中剪去 g(t) 最小的 Tt ,将得到的子树作为 T1 ,同时将最小的 g(t) 设为 α1。则 T1 为区间[α1, α2) 的最优子树。如此剪枝下去直到得到根节点。在这个过程中不断增加 α 的值产生新的区间。

利用独立的数据集进行交叉验证,在 T0, T1, ..., Tn 中选出均方误差或基尼指数最小的最优子树,同时对应的 α 也就确定了,即找到 Tα。

CART 决策树剪枝流程:

  1. 设 k = 0, T = T0

  2. 设 α = ∞

  3. 自下而上地对各内部节点 t 计算 C(Tt) ,|Tt| ,以及 g(t) = (C(t) - C(Tt))/ (|Tt| - 1) ;α = min(α, g(t))

  4. 对 g(t) = α 的内部节点 t 进行剪枝,并对叶节点 t 以多数表决法决定类别(分类)或取值所有样本输出均值(回归)

  5. 设 k = k+1,αk = α , Tk = T

  6. 如果 T 不是由根节点及两个叶节点构成的树,则回到步骤2;否则令 Tk = Tn

  7. 交叉验证法在子树 T0, T1, ..., Tn 中选取最优子树 Tα

 

CART 决策树存在的问题:

  1. 每次分裂决策由一个最优的特征线性组合来决定,可能会更合理(OC1)

  2. variance 比较大(样本改动一点点,树结构可能变化剧烈),可以通过 bagging 来改善

  3. 寻找最优的决策树是一个 NP hard 问题,一般是采用启发式,但容易陷入局部最优,可以用 ensemble 改善

 

你可能感兴趣的:(决策树 Decision Tree)