数据挖掘算法03 - CART

CART

CART 算法

另一种常见的决策树是 CART 算法(Classification and Regression Trees,分类与回归树)。这种算法和 ID3、C4.5 相比,主要有两处不同:

  • 在分类时,CART 不再采用信息增益或信息增益率,而是采用基尼指数(Gini)来选择最好的特征并进行数据的划分;
  • 在 ID3 和 C4.5 决策树中,算法根据特征的属性值划分数据,可能会划分出多个组。而 CART 算法采用了二叉树,每次把数据切成两份,分别进入左子树、右子树。

当然,CART 算法和 ID3、C4.5 也有类似的地方。首先,CART 中每一次迭代都会降低基尼指数,这类似于 ID3、C4.5 降低信息熵的过程。另外,基尼指数描述的也是纯度,与信息熵的含义相似。我们可以用下面这个公式来计算每个集合的纯度。

数据挖掘算法03 - CART

其中,n 为集合 P 中所包含的不同分组(或分类)数量。如果集合 P 中所包含的不同分组越多,那么这个集合的基尼指数越高,纯度越低

然后,我们需要计算整个数据集的基尼指数。

数据挖掘算法03 - CART

其中,m 为全集使用特征 T 划分后,所形成的子集数量。Pj 为第 j 个集合。

无论是何种决策树算法,来自信息论的几个重要概念:信息熵、信息增益、信息增益率、基尼指数都起到了重要的作用。如果你能很好的学习并运用这些概念,那么决策树这种类型的算法就不难理解了。

CART 分类树的工作流程

我们知道决策树的核心就是寻找纯净的划分,因此引入了纯度的概念。在属性选择上,我们是通过统计“不纯度”来做判断的,ID3 是基于信息增益做判断,C4.5 在 ID3 的基础上做了改进,提出了信息增益率的概念。实际上 CART 分类树与 C4.5 算法类似,只是属性选择的指标采用的是基尼系数。

基尼系数本身反应了样本的不确定度。当基尼系数越小的时候,说明样本之间的差异性小,不确定程度低。分类的过程本身是一个不确定度降低的过程,即纯度的提升过程。所以 CART 算法在构造分类树的时候,会选择基尼系数最小的属性作为属性的划分。

假设 t 为节点,那么该节点的 GINI 系数的计算公式为:

数据挖掘算法03 - CART

这里 p(Ck|t) 表示节点 t 属于类别 Ck 的概率,节点 t 的基尼系数为 1 减去各类别 Ck 概率平方和。

节点 D 的基尼系数等于子节点 D1 和 D2 的归一化基尼系数之和,用公式表示为:

数据挖掘算法03 - CART

归一化基尼系数代表的是每个子节点的基尼系数乘以该节点占整体父亲节点 D 中的比例。

节点 D 被属性 A 划分后的基尼系数越大,样本集合的不确定性越大,也就是不纯度越高。

如何使用 CART 算法来创建分类树

通过上面的讲解你可以知道,CART 分类树实际上是基于基尼系数来做属性划分的。在 Python 的 sklearn 中,如果我们想要创建 CART 分类树,可以直接使用 DecisionTreeClassifier 这个类。创建这个类的时候,默认情况下 criterion 这个参数等于 gini,也就是按照基尼系数来选择属性划分,即默认采用的是 CART 分类树。

CART 回归树的工作流程

CART 回归树划分数据集的过程和分类树的过程是一样的,只是回归树得到的预测结果是连续值,而且评判“不纯度”的指标不同。在 CART 分类树中采用的是基尼系数作为标准,那么在 CART 回归树中,如何评价“不纯度”呢?实际上我们要根据样本的混乱程度,也就是样本的离散程度来评价“不纯度”。

样本的离散程度具体的计算方式是,先计算所有样本的均值,然后计算每个样本值到均值的差值。我们假设 x 为样本的个体,均值为 u。为了统计样本的离散程度,我们可以取差值的绝对值,或者方差。

其中差值的绝对值为样本值减去样本均值的绝对值:

数据挖掘算法03 - CART

方差为每个样本值减去样本均值的平方和除以样本个数:

数据挖掘算法03 - CART

所以这两种节点划分的标准,分别对应着两种目标函数最优化的标准,即用最小绝对偏差(LAD),或者使用最小二乘偏差(LSD)。这两种方式都可以让我们找到节点划分的方法,通常使用最小二乘偏差的情况更常见一些。

如何使用 CART 回归树做预测

这里我们使用到 sklearn 自带的波士顿房价数据集,该数据集给出了影响房价的一些指标,比如犯罪率,房产税等,最后给出了房价。

CART 决策树的剪枝

CART 决策树的剪枝主要采用的是 CCP 方法,它是一种后剪枝的方法,英文全称叫做 cost-complexity prune,中文叫做代价复杂度。这种剪枝方式用到一个指标叫做节点的表面误差率增益值,以此作为剪枝前后误差的定义。用公式表示则是:

数据挖掘算法03 - CART

其中 Tt 代表以 t 为根节点的子树,C(Tt) 表示节点 t 的子树没被裁剪时子树 Tt 的误差,C(t) 表示节点 t 的子树被剪枝后节点 t 的误差,|Tt|代子树 Tt 的叶子数,剪枝后,T 的叶子数减少了|Tt|-1。

所以节点的表面误差率增益值等于节点 t 的子树被剪枝后的误差变化除以剪掉的叶子数量。

  • 生成子树序列:因为我们希望剪枝前后误差最小,所以我们要寻找的就是最小α值对应的节点,把它剪掉。这时候生成了第一个子树。重复上面的过程,继续剪枝,直到最后只剩下根节点,即为最后一个子树。
  • 验证:得到了剪枝后的子树集合后,我们需要用验证集对所有子树的误差计算一遍。可以通过计算每个子树的基尼指数或者平方误差,取误差最小的那个树,得到我们想要的结果。

总结

今天我给你讲了 CART 决策树,它是一棵决策二叉树,既可以做分类树,也可以做回归树。你需要记住的是,作为分类树,CART 采用基尼系数作为节点划分的依据,得到的是离散的结果,也就是分类结果;作为回归树,CART 可以采用最小绝对偏差(LAD),或者最小二乘偏差(LSD)作为节点划分的依据,得到的是连续值,即回归预测结果。

最后我们来整理下三种决策树之间在属性选择标准上的差异:

  • ID3 算法,基于信息增益做判断;
  • C4.5 算法,基于信息增益率做判断;
  • CART 算法,分类树是基于基尼系数做判断。回归树是基于偏差做判断。

实际上这三个指标也是计算“不纯度”的三种计算方式。

在工具使用上,我们可以使用 sklearn 中的 DecisionTreeClassifier 创建 CART 分类树,通过 DecisionTreeRegressor 创建 CART 回归树。

你可以用代码自己跑一遍我在文稿中举到的例子。

数据挖掘算法03 - CART