python决策树之CART分类回归树详解
作者:zhihua_oba 发布时间:2021-06-22 19:23:16
决策树之CART(分类回归树)详解,具体内容如下
1、CART分类回归树简介
CART分类回归树是一种典型的二叉决策树,可以处理连续型变量和离散型变量。如果待预测分类是离散型数据,则CART生成分类决策树;如果待预测分类是连续型数据,则CART生成回归决策树。数据对象的条件属性为离散型或连续型,并不是区别分类树与回归树的标准,例如表1中,数据对象的属性A、B为离散型或连续型,并是不区别分类树与回归树的标准。

2、CART分类回归树分裂属性的选择
2.1 CART分类树——待预测分类为离散型数据
选择具有最小的属性及其属性值,作为最优分裂属性以及最优分裂属性值。值越小,说明二分之后的子样本的“纯净度”越高,即说明选择该属性(值)作为分裂属性(值)的效果越好。
对于样本集,计算如下:
其中,在样本集中,表示分类结果中第个类别出现的频率。
对于含有个样本的样本集,根据属性的第个属性值,将数据集划分成两部分,则划分成两部分之后,计算如下:
其中,、分别为样本子集、的样本个数。
对于属性,分别计算任意属性值将数据集划分成两部分之后的,选取其中的最小值,作为属性得到的最优二分方案:
对于样本集,计算所有属性的最优二分方案,选取其中的最小值,作为样本集的最优二分方案:

所得到的属性及其第属性值,即为样本集的最优分裂属性以及最优分裂属性值。
2.2 CART回归树——待预测分类为连续型数据
区别于分类树,回归树的待预测分类为连续型数据。同时,区别于分类树选取为评价分裂属性的指标,回归树选取为评价分裂属性的指标。选择具有最小的属性及其属性值,作为最优分裂属性以及最优分裂属性值。值越小,说明二分之后的子样本的“差异性”越小,说明选择该属性(值)作为分裂属性(值)的效果越好。
针对含有连续型分类结果的样本集,总方差计算如下:
其中,表示样本集中分类结果的均值,表示第个分类结果。
对于含有个样本的样本集,根据属性的第个属性值,将数据集划分成两部分,则划分成两部分之后,计算如下:
对于属性,分别计算任意属性值将数据集划分成两部分之后的,选取其中的最小值,作为属性得到的最优二分方案:
对于样本集,计算所有属性的最优二分方案,选取其中的最小值,作为样本集的最优二分方案:
所得到的属性及其第属性值,即为样本集的最优分裂属性以及最优分裂属性值。
3、CART分类回归树的剪枝
由于决策树的建立完全是依赖于训练样本,因此该决策树对训练样本能够产生完美的拟合效果。但这样的决策树对于测试样本来说过于庞大而复杂,可能产生较高的分类错误率。这种现象就称为过拟合。因此需要将复杂的决策树进行简化,即去掉一些节点解决过拟合问题,这个过程称为剪枝。
剪枝方法分为预剪枝和后剪枝两大类。预剪枝是在构建决策树的过程中,提前终止决策树的生长,从而避免过多的节点产生。预剪枝方法虽然简单但实用性不强,因为很难精确的判断何时终止树的生长。后剪枝是在决策树构建完成之后,对那些置信度不达标的节点子树用叶子结点代替,该叶子结点的类标号用该节点子树中频率最高的类标记。后剪枝方法又分为两种,一类是把训练数据集分成树的生长集和剪枝集;另一类算法则是使用同一数据集进行决策树生长和剪枝。常见的后剪枝方法有CCP(Cost Complexity Pruning)、REP(Reduced Error Pruning)、PEP(Pessimistic Error Pruning)、MEP(Minimum Error Pruning)。其中,悲观错误剪枝法PEP(Pessimistic Error Pruning)在“决策树之C4.5算法详解”中有详细介绍,感兴趣的小童鞋可以了解学习。这里我们详细介绍CART分类回归树中应用最广泛的剪枝算法——代价复杂性剪枝法CCP(Cost Complexity Pruning)。
代价复杂性剪枝法CCP(Cost Complexity Pruning)主要包含两个步骤:(1)从原始决策树开始生成一个子树序列,其中,从产生,为根节点。(2)从第1步产生的子树序列中,根据树的真实误差估计选择最佳决策树。
CCP剪枝法步骤(1)
生成子树序列的基本思想是从开始,裁剪中关于训练数据集误差增加最小的分枝来得到。实际上,当1棵树在节点处剪枝时,它的误差增加直观上认为是,其中,为在节点的子树被裁剪后节点的误差,为在节点的子树没被裁剪时子树的误差。然而,剪枝后,的叶子数减少了,其中,为子树的叶子数,也就是说,的复杂性减少了。因此,考虑树的复杂性因素,树分枝被裁剪后误差增加率由下式决定:
其中,表示节点的子树被裁剪后节点的误差,,是节点的误差率,是节点上的样本个数与训练集中样本个数的比例。表示节点的子树没被裁剪时子树的误差,即子树上所有叶子节点的误差之和。
就是选择中具有最小值所对应的剪枝树。
例如:图1中表示决策树中第个节点,A、B表示训练集中的两个类别,A、B之后的数据表示落入该节点分别属于A类、B类的样本个数。

图1,决策树中训练样本总个数为80。对于节点,其中,A类样本46个,B类样本4个,根据大多数原则,则节点中样本为A类,故节点的子树(、)被裁剪之后的误差为:。节点的子树(、)被裁剪之前的误差为:。故。类似过程,依次得到所有节点的误差增加率,如表2:
从表2可以看出,在原始树行,4个非叶节点中的值最小,因此,裁剪的节点的分枝得到;在行,虽然和的值相同,但裁剪的分枝可以得到更小的决策树,因此,是裁剪中的分枝得到的。
CCP剪枝法步骤(2)
如何根据第1步产生的子树序列,选择出1棵最佳决策树是CCP剪枝法步骤(2)的关键。通常采用的方法有两种,一种是V番交叉验证(V-fold cross-validation),另一种是基于独立剪枝数据集。此处不在过分赘述,感兴趣的小童鞋,可以阅读参考文献[1][2][3]等。
参考文献
[1] 魏红宁. 决策树剪枝方法的比较[J]. 西南交通大学学报, 2005, 40(1):44-48.
[2] 张宇. 决策树分类及剪枝算法研究[D]. 哈尔滨理工大学, 2009.
[3] Breiman L, Friedman J H, Olshen R, et al. Classification and Regression Trees[J]. Biometrics, 1984, 40(3):358.
来源:http://blog.csdn.net/zhihua_oba/article/details/72230427


猜你喜欢
- Selenium的介绍、配置和调用Selenium(浏览器自动化测试框架) 是一个用于Web应用程序测试的工具。Selenium测
- 问题:用pycharm每次修改代码后第一次运行还是原来的结果,运行第二次的时候才是修改后代码的结果解决:每次修改代码后保存一下即可解决补充:
- 本文实例讲述了Python实现列表删除重复元素的三种常用方法。分享给大家供大家参考,具体如下:给定一个列表,要求删除列表中重复元素。list
- Python是一种广泛使用的编程语言,不仅在数据科学和网络编程方面具有优势,而且在图形用户界面(GUI)和游戏开发方面也能胜任。Python
- enumerate函数用于遍历序列中的元素以及它们的下标。enumerate函数说明:函数原型:enumerate(sequence, [s
- PHP中的MYSQL常用函数1、mysql_connect()-建立数据库连接格式:resource mysql_connect([stri
- 远程(如通过互联网)连接access数据库的示例:首先,需要使用TCP/IP,ADO及XML(需要安装Microsoft XML 4.0。)
- 一、程序的组织结构任何简单的或者复杂的算法都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成二、顺序结构程序从上到下顺序地执行代码,
- 前言:任何一个编程者都少不了要去调试代码,不管你是高手还是菜鸟,调试程序都是一项必不可少的工作。一般来说调试程序是在编写代码之后或测试期修改
- 前言全可以访问相同的对象, 因此我们讲 这种变量名也叫对象的 "引用".验证1:a = 2b = 3print(id(a
- 发现一个很简单的配置方法,一直想写的没写上,今天抽空就把它给补充完整好了。本文的配置方法Windows,Mac和Linux系统均适合。一.安
- 本文实例为大家分享了简单的Python登录验证,供大家参考,具体内容如下编写登录接口要求:1、输入用户名密码2、认证成功后显示欢迎信息3、输
- 直接赋值:其实就是对象的引用(别名)。浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。深拷贝(deepcopy): copy 模
- 技术背景在一些对python开源库代码的安全扫描中,我们有可能需要分析库中所使用到的函数是否会对代码的执行环境造成一些非预期的影响。典型的例
- 这里用到django-rest-framework-jwt这个库 https://github.com/GetBli
- 背景客户最近有这样的需求,想通过统计Oracle数据库活跃会话数,并记录在案,利用比对历史的活跃会话的方式,实现对系统整体用户并发量有大概的
- 经常有网友会问,SQL Server占用了太多的内存,而且还会不断的增长;或者说已经设置了使用内存,可它没有用到那么多,这是怎么一回事儿呢?
- 最近做接口对接,遇到了.net开发的webservice接口,因为python第一次与webservice对接,连问带查,最后使用suds库
- $tar xvf go1.3.3.linux-amd64.tar.gz$mv go /usr/local/$vim /etc/profile
- 几个方式(本文不作介绍),要将Session保存到SQL Server中,需要有以下几个步骤:1.首先要创建用于保存Session数据的数据