决策树原理及实现(二)--CART算法及剪枝

本节介绍决策树中使用最多的CART方法以及剪枝,主要参考资料。

在上一节我们将了ID3算法,和ID3算法的改进版C4.5算法。对于C4.5算法,我们也提到了它的不足,特别是不能处理连续数据等。而目前最常见的CART既可以做回归,也可以做分类,在skleran包中的决策树也采用此种方法。

特征选择方法

前面无论是ID3或者C4.5算法,我们都是使用的“熵”这一度量单位来选取特征。但计算熵需要大量的对数运算,有没有其他的特征选取方法呢?答案是肯定的,这里使用了统计学中的基尼系数,其基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好。这和信息增益(比)是相反的。

假设在分类问题中有 K K 个类别,第 k k 个类别的概率为 pk p k ,则基尼系数表示为:

Gini(p)=k=1KjkKpkpj=k=1Kpk(1pk)=1k=1Kp2k G i n i ( p ) = ∑ k = 1 K ∑ j ≠ k K p k p j = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2

从直观上,我们可以认为基尼系数是某种属性分类错误的概率度量。

对于给定的样本 D D ,假设有 K K 个类别, 第 k k 个类别的数量为 Ck C k ,则样本 D D 的基尼系数表达式为:

Gini(D)=1k=1K(|Ck||D|)2 G i n i ( D ) = 1 − ∑ k = 1 K ( | C k | | D | ) 2

我们后面会构造二叉树,因此当只有两个节点时,其公式可以表示为:

Gini(D)=|C1||D|Gini(D1)+|C2||D|Gini(D2) G i n i ( D ) = | C 1 | | D | G i n i ( D 1 ) + | C 2 | | D | G i n i ( D 2 )

二叉树

在CART算法中,生成的决策树始终是二叉树。

离散值处理

对于CART分类树离散值的处理问题,采用的思路是不停的二分离散特征。

若某个特征 A A 被选择建立决策树点,有 A1A2A3 A 1 、 A 2 、 A 3 三种分类,CART分类树会考虑把A分成{ A1 A 1 }和{ A2,A3 A 2 , A 3 }{ A1 A 1 },{ A2 A 2 }和{ A1,A3 A 1 , A 3 }, { A3 A 3 }和{ A1,A2 A 1 , A 2 }三种情况,找到基尼系数最小的组合,比如{ A2 A 2 }和{ A1,A3 A 1 , A 3 }{ A2 A 2 },然后建立二叉树节点,一个节点是 A2 A 2 对应的样本,另一个节点是{ A1,A3 A 1 , A 3 }对应的节点。

同时,由于这次没有把特征A的取值完全分开,后面我们还有机会在子节点继续选择到特征A来划分 A1 A 1 A3 A 3 这和ID3或者C4.5不同,在ID3或者C4.5的一棵子树中,离散特征只会参与一次节点的建立。

连续值处理

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

minA,s[minc1xiD1(A,s)(yic1)2+minc2xiD2(A,s)(yic2)2] min A , s [ min c 1 ∑ x i ∈ D 1 ( A , s ) ( y i − c 1 ) 2 + min c 2 ∑ x i ∈ D 2 ( A , s ) ( y i − c 2 ) 2 ]

对于决策树建立后做预测的方式,上面讲到了CART分类树采用叶子节点里概率最大的类别作为当前节点的预测类别。而回归树输出不是类别,它采用的是用最终叶子的均值或者中位数来预测输出结果。

剪枝

由于决策时算法很容易对训练集过拟合,而导致泛化能力差,为了解决这个问题,我们需要对CART树进行剪枝,即类似于线性回归的正则化,来增加决策树的返回能力。但是,有很多的剪枝方法,我们应该这么选择呢?

CART采用的办法是后剪枝法,即先生成决策树,然后产生所有可能的剪枝后的CART树,然后使用交叉验证来检验各种剪枝的效果,选择泛化能力最好的剪枝策略。

因此,CART树的剪枝算法可以概括为两步:

  1. 第一步是从原始决策树生成各种剪枝效果的决策树,
  2. 第二步是用交叉验证来检验剪枝后的预测能力,选择泛化预测能力最好的剪枝后的数作为最终的CART树。

损失函数

首先对于是否对一个节点进行剪枝,我们需要一个度量标准,也就是剪枝前后的损失谁更大。

  • 在剪枝的过程中,对于任意的一刻子树 Tt T t ,其损失函数为:

    Cα(Tt)=C(Tt)+α|Tt| C α ( T t ) = C ( T t ) + α | T t |

    其中, α α 为正则化参数,这和线性回归的正则化一样。

    C(Tt) C ( T t ) 为训练数据的预测误差,分类树是用基尼系数度量,回归树是均方差度量

    |Tt| | T t | 是子树 Tt T t 的叶子节点的数量。

  • α=0 α = 0 时,即没有正则化,原始的生成的CART树即为最优子树。当 α= α = ∞ 时,即正则化强度达到最大,此时由原始的生成的CART树的根节点组成的单节点树为最优子树。当然,这是两种极端情况。一般来说, α α 越大,则剪枝剪的越厉害,生成的最优子树相比原生决策树就越偏小。对于固定的 α α ,一定存在使损失函数 Cα(T) C α ( T ) 最小的唯一子树。

  • 若将节点全部剪掉,只保留根节点,则根节点损失是:

    Cα(T)=C(T)+α C α ( T ) = C ( T ) + α

  • α=0 α = 0 或者 α α 很小时,很容易得到:

    Cα(Tt)Cα(T) C α ( T t ) ≤ C α ( T )

    这表示根节点损失大于叶节点损失。

  • 而我们需要得到根节点损失小于等于叶节点损失,这样我们才能合理的将其剪枝,即:

    Cα(Tt)=Cα(T)C(T)+α=C(Tt)+α|Tt| C α ( T t ) = C α ( T ) ⇒ C ( T ) + α = C ( T t ) + α | T t |

    α=C(T)C(Tt)|Tt|1 α = C ( T ) − C ( T t ) | T t | − 1

  • 此时, Tt T t T T 有相同的损失函数,但是 T T 节点更少,因此可以对子树进行剪枝,也就是将它的子节点全部剪掉,变为一个叶子节点 T T

交叉验证

我们可以计算出每个子树是否剪枝的阈值 α α ,然后分别针对不同的 α α 所对应的剪枝后的最优子树做交叉验证。

这样就可以选择一个最好的 α α ,有了这个 α α ,我们就可以用对应的最优子树作为最终结果。

算法小结

算法 支持模型 树结构 特征选择 连续值处理 缺失值处理 剪枝
ID3 分类 多叉树 信息增益 不支持 不支持 不支持
C4.5 分类 多叉树 信息增益比 支持 支持 支持
CART 分类,回归 二叉树 基尼系数,均方差 支持 支持 支持

优点:

  1. 简单直观,生成的决策树很直观。
  2. 基本不需要预处理,不需要提前归一化,处理缺失值。
  3. 使用决策树预测的代价是O(log2m)O(log2m)。 m为样本数。
  4. 既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。
  5. 可以处理多维度输出的分类问题。
  6. 相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释
  7. 可以交叉验证的剪枝来选择模型,从而提高泛化能力。
  8. 对于异常点的容错能力好,健壮性高。

缺点:

  1. 决策树算法非常容易过拟合,导致泛化能力不强。
  2. 如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。

参考资料

  1. 决策树算法原理

你可能感兴趣的:(MachineLearning)