摘要:分类与回归树(Classification and Regression Tree, CART)是一种经典的决策树,可以用来处理涉及连续数据的分类或者回归任务,它和它的变种在当前的工业领域应用非常广泛。本文对这种决策树的思想、结构、训练规则和实现方式进行了简单介绍。
1. 引言
在这个世界里,想要生存,那就得时时刻刻做好决策——做决策的基础,抽象来说,就是对事物的发展做出预测。有些预测得经常做,比如预测气温、预测一个人最喜欢的物品等等。人工智能领域的科学家,提出了很多方法来将一些有价值的预测活动自动化。这些方法可以分为两类:(1)回归模型,如多元线性回归模型;(2)分类算法,如C4.5决策树。
有些变量是连续值,比如气温,以及相关的湿度、气压等等,都是平滑变化的数值。像多元线性回归这样的模型,假设自变量和因变量都是连续值,非常适合气温这类变量取值的预测。理论上,只要特征足够好,这类回归模型可以完美地拟合研究对象、做出没有误差的预测。
但是,有些情况下,不要求模型完美,误差足够小就可以。一些学者采用类似随机投影(可以参考李鹏宇:对simhash的简单理解zhuanlan.zhihu.com
)的思路,将自变量的取值空间切分为若干个碎块,并假设这个空间碎块内的所有样本的因变量取值接近(甚至相同)——在这种思想的指导下,出现了一种非常经典的回归模型,即CART回归树。
本文对CART回归树的基本思想和构建方式进行了简单介绍——CART回归树,稍作修改既可以用来做分类,因此这里顺便在CART回归树的基础上介绍了CART分类树。
2. CART回归树的思想与逻辑结构
CART是“Classification and Regression Tree”的缩写。“CART回归树”特指一种以二叉树为逻辑结构的,用于完成线性回归任务的决策树。
2.1. 决策树的思想
决策树认为,物以类聚、人以群分,在特征空间里相近的样本,那就是一类。如果为每个“类”分配的空间范围比较小,那么,同一个类内的样本差异会非常小,以至于看起来一样。换句话说,如果我们可以将特征空间切分为较小的碎块,然后为每一个碎块内的样本配置一个统一的因变量取值,就有机会做出误差较小的预测。这也是分类和聚类算法的基本假设。
如图2-1,是这种建模思想的图示。它的做法比较粗暴:首先分割特征空间,也就是将样本分组;然后为每一组样本分配一个预测值;最后,在预测阶段,为样本找到分组、找到预测值。
这种思想似乎有点道理,值得一试。当然有2个问题需要回答:(1)如何切分特征空间;(2)如何为各个空间碎块设置因变量取值。图 2-1 用(我臆想的)决策树预测学生考试成绩
2.2. 针对离散数据的分类决策树
假设预测任务的输入和输出都是离散值,我们可以直接以特征的各个取值为候选分割平面(换个说法,就是对训练样本分组),进行决策树的构建——这就是针对离散值的分类决策树。这种决策树包括ID3、C4.5等等,详情可以参考李鹏宇:决策树算法:由来与训练zhuanlan.zhihu.com
和李鹏宇:决策树的python实现:low版,ID3和C4.5zhuanlan.zhihu.com
注意,针对离散值的决策树在对训练样本进行分组时,一般情况下不允许重复使用一个特征。而有能力处理连续变量的CART回归树不同,允许重复使用一个特征。原因和效果后面会讲。
2.3. CART回归树的思想
当然,一些情况下,部门不能直接使用特征取值,比如说,特征为连续变量。这时候,我们需要使用一种新的策略,来选择用于分割样本的特征取值。
另一种情况下,我们不能使用信息增益、基尼系数这样的指标,作为分组质量的表征——输出值是连续变量。这时候,我们也需要一种新的策略,来评估分组质量。
当任务的输出值为连续变量,我们需要使用决策树的另一种版本——回归树。最常见的回归树就是CART回归树。
2.4. CART回归树的逻辑结构——一个可用的CART回归树长什么样
如图2-1,是用于预测一个人每周进行体育锻炼次数的CART回归树。这个模型基于人的年龄和每天工作时长来进行预测,总共使用了3条规则:(1)年龄是否大于30;(2)年龄是否大于66;(3)工作时长是否大于12。这3条规则以二叉树的结构形成一个分组体系,将所有的样本分为4组,而每一个组内的样本配置了(锻炼次数的)预测值——在对一个人进行预测时,基于他的数据从树根走到叶子结点,就得到了锻炼次数。
决策树用起来非常非常的简单高效。那么,这样一种模型是如何构建出来的呢?图 2-2 一个(臆想的)CART回归树
3. 如何构建一个CART回归树
构建一个可用的CART回归树的关键,是设计一个标准,用来指导机器按照最有利于准确计算因变量的情况来切分特征空间。
本节首先介绍经典CART的特征空间分割标准和方法;接着,说说实际应用中需要为CART增加的一些策略;最后,基于CART回归树和决策树的相关知识,简单说说CART分类树。
回归问题可以这样表述:
给定一个数据集
。其中
是任务的输入数据,为第n个样本的特征,是一个K维向量;
为第n个样本的输出值。回归任务就是,构建一个模型
,以最小的误差,基于特征预测输出值 。
3.1. 切分特征空间的标准与输出值计算规则
一般来说,在回归类任务中,我们使用MSE(Mean Square Error, 平均方差)作为模型“误差”的度量指标。MSE的计算方式为:
使用这个指标的原因/好处有很多:(1)符合直觉,一看就知道可以度量预测值和真实值的总体偏离情况;(2)使用梯度下降这类方法优化的时候,推导计算较为方便;(3)等等。
在构建CART树的时候,我们遍历所有特征的所有取值 ——以这个特征的这个取值为分割依据、得到两组样本 和 ,然后计算对这两组样本的预测误差。遍历完毕后,选取预测误差最小的那一个特征的取值 。
这里有一个问题:“预测误差”哪来的?基于预测值和真实值算出来的。“预测值”哪儿来的?需要一个计算方法。为了使MSE最小,一般以一组样本的输出值的均值作为预测值,即:
3.2. 如何让CART回归树的效果更好
由于特征取值为连续值,同时允许重复使用,CART回归树可以生长到非常大的规模,直到每一个样本都拥有一个专门的规则路径——形成非常严重地过拟合。为了抑制这种过拟合的倾向,我们需要对CART回归树进行剪枝,即使用一定的策略,合并一些节点、或者阻止一些节点的分裂。
3.3. CART分类树是什么?
如果特征为连续值,输出为类别,那么我们就需要使用CART的另一种形态,即CART分类树,来解决预测问题。CART分类树和CART回归树的思想和逻辑结构是相同的,二者的主要区别是:样本分组时,评价(特征,取值)的质量指标为gini系数。
3.4. 用python实现一个粗糙的CART回归模型
我用Python实现了一个简单的CART回归模型(https://github.com/lipengyuer/DataScience/blob/master/src/algoritm/CARTRegression.pygithub.com
)。“简单”的意思是,优化策略只有一个:限制树的深度。代码中用到的测试数据来自Energy efficiency Data Setarchive.ics.uci.edu
4. 结语
CART可以被看做决策树的升级版本,用于处理连续数据。
决策树的思想虽然比较粗暴,但是可解释很强、计算效率也比较高,应用非常广泛。如果配合剪枝、集成等策略,我们可以基于C4.5、CART这类模型构建出很多非常优秀的模型,比如随机森林、随机梯度上升树等等。
在构建决策树的过程中,我们评估了每一种特征,在对样本进行分组时的能力大小——这个分数可以作为特征工程中,特征选择的依据。因此,有时候我们也会使用决策树来做特征选择。
注意:本文为李鹏宇(知乎个人主页https://www.zhihu.com/people/py-li-34)原创作品,受到著作权相关法规的保护。如需引用、转载,请注明来源信息:(1)作者名,即“李鹏宇”;(2)原始网页链接,即当前页面地址。如有疑问,可发邮件至我的邮箱:[email protected]。