python决策树之CART分类回归树详解


Posted in Python onDecember 20, 2017

决策树之CART(分类回归树)详解,具体内容如下

1、CART分类回归树简介

  CART分类回归树是一种典型的二叉决策树,可以处理连续型变量和离散型变量。如果待预测分类是离散型数据,则CART生成分类决策树;如果待预测分类是连续型数据,则CART生成回归决策树。数据对象的条件属性为离散型或连续型,并不是区别分类树与回归树的标准,例如表1中,数据对象xi的属性A、B为离散型或连续型,并是不区别分类树与回归树的标准。

表1
python决策树之CART分类回归树详解

2、CART分类回归树分裂属性的选择

  2.1 CART分类树——待预测分类为离散型数据

  选择具有最小Gain_GINI的属性及其属性值,作为最优分裂属性以及最优分裂属性值。Gain_GINI值越小,说明二分之后的子样本的“纯净度”越高,即说明选择该属性(值)作为分裂属性(值)的效果越好。
  对于样本集SGINI计算如下:

python决策树之CART分类回归树详解

其中,在样本集S中,Pk表示分类结果中第k个类别出现的频率。

  对于含有N个样本的样本集S,根据属性A的第i个属性值,将数据集S划分成两部分,则划分成两部分之后,Gain_GINI计算如下:

python决策树之CART分类回归树详解

其中,n1n2分别为样本子集S1S2的样本个数。

  对于属性A,分别计算任意属性值将数据集划分成两部分之后的Gain_GINI,选取其中的最小值,作为属性A得到的最优二分方案:

python决策树之CART分类回归树详解

对于样本集S,计算所有属性的最优二分方案,选取其中的最小值,作为样本集S的最优二分方案:

python决策树之CART分类回归树详解

所得到的属性A及其第i属性值,即为样本集S的最优分裂属性以及最优分裂属性值。

  2.2 CART回归树——待预测分类为连续型数据

  区别于分类树,回归树的待预测分类为连续型数据。同时,区别于分类树选取Gain_GINI为评价分裂属性的指标,回归树选取Gain_σ为评价分裂属性的指标。选择具有最小Gain_σ的属性及其属性值,作为最优分裂属性以及最优分裂属性值。Gain_σ值越小,说明二分之后的子样本的“差异性”越小,说明选择该属性(值)作为分裂属性(值)的效果越好。

  针对含有连续型分类结果的样本集S,总方差计算如下:

python决策树之CART分类回归树详解

其中,μ表示样本集S中分类结果的均值,Ck表示第k个分类结果。

  对于含有N个样本的样本集S,根据属性A的第i个属性值,将数据集S划分成两部分,则划分成两部分之后,Gain_σ计算如下:

python决策树之CART分类回归树详解

  对于属性A,分别计算任意属性值将数据集划分成两部分之后的Gain_σ,选取其中的最小值,作为属性A得到的最优二分方案:

python决策树之CART分类回归树详解

  对于样本集S,计算所有属性的最优二分方案,选取其中的最小值,作为样本集S的最优二分方案:

python决策树之CART分类回归树详解

所得到的属性A及其第i属性值,即为样本集S的最优分裂属性以及最优分裂属性值。

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)从原始决策树T0开始生成一个子树序列{T0,T1,...,Tn},其中,Ti+1Ti产生,Tn为根节点。(2)从第1步产生的子树序列中,根据树的真实误差估计选择最佳决策树。

  CCP剪枝法步骤(1)

  生成子树序列{T0,T1,...,Tn}的基本思想是从T0开始,裁剪Ti中关于训练数据集误差增加最小的分枝来得到Ti+1。实际上,当1棵树T在节点t处剪枝时,它的误差增加直观上认为是R(t)−R(Tt),其中,R(t)为在节点t的子树被裁剪后节点t的误差,R(Tt)为在节点t的子树没被裁剪时子树Tt的误差。然而,剪枝后,T的叶子数减少了L(Tt)−1,其中, L(Tt)为子树Tt的叶子数,也就是说,T的复杂性减少了。因此,考虑树的复杂性因素,树分枝被裁剪后误差增加率由下式决定:

python决策树之CART分类回归树详解

其中,R(t)表示节点t的子树被裁剪后节点t的误差,R(t)=r(t)∗p(t)r(t)是节点t的误差率,p(t)是节点t上的样本个数与训练集中样本个数的比例。R(Tt)表示节点t的子树没被裁剪时子树Tt的误差,即子树Tt上所有叶子节点的误差之和。

  Ti+1就是选择Ti中具有最小α值所对应的剪枝树。

  例如:图1中ti表示决策树中第i个节点,A、B表示训练集中的两个类别,A、B之后的数据表示落入该节点分别属于A类、B类的样本个数。

python决策树之CART分类回归树详解

  图1,决策树中训练样本总个数为80。对于节点t4,其中,A类样本46个,B类样本4个,根据大多数原则,则节点t4中样本为A类,故节点t4的子树(t8t9)被裁剪之后t4的误差为:450∗5080=480。节点t4的子树(t8t9)被裁剪之前t4的误差为:145∗4580+25∗580=380。故α(t4)=480−3802−1=0.0125。类似过程,依次得到所有节点的误差增加率,如表2:

表2
python决策树之CART分类回归树详解

  从表2可以看出,在原始树T0行,4个非叶节点中t4α值最小,因此,裁剪T0t4节点的分枝得到T1;在T1行,虽然t2t3α值相同,但裁剪t2的分枝可以得到更小的决策树,因此,T2是裁剪T1中的t2分枝得到的。

  CCP剪枝法步骤(2)

  如何根据第1步产生的子树序列{T0,T1,...,Tn},选择出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.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现批量把SVG格式转成png、pdf格式的代码分享
Aug 21 Python
Python3指定路径寻找符合匹配模式文件
May 22 Python
Python实现的中国剩余定理算法示例
Aug 05 Python
python实现word 2007文档转换为pdf文件
Mar 15 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
浅析PyTorch中nn.Linear的使用
Aug 18 Python
python中的RSA加密与解密实例解析
Nov 18 Python
python Jupyter运行时间实例过程解析
Dec 13 Python
如何在django中添加日志功能
Feb 06 Python
Python+OpenCV实现图像的全景拼接
Mar 05 Python
浅谈Python中的字符串
Jun 10 Python
Python opencv缺陷检测的实现及问题解决
Apr 24 Python
python中文乱码不着急,先看懂字节和字符
Dec 20 #Python
python决策树之C4.5算法详解
Dec 20 #Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
Dec 20 #Python
python实现ID3决策树算法
Dec 20 #Python
理解python中生成器用法
Dec 20 #Python
Python利用turtle库绘制彩虹代码示例
Dec 20 #Python
浅谈Python中range和xrange的区别
Dec 20 #Python
You might like
PHP Curl多线程原理实例详解
2013/11/06 PHP
[IE&FireFox兼容]JS对select操作
2007/01/07 Javascript
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
js 获取屏幕各种宽高的方法(浏览器兼容)
2013/05/15 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
vue-resouce设置请求头的三种方法
2017/09/12 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
Python内建数据结构详解
2016/02/03 Python
Python基于select实现的socket服务器
2016/04/13 Python
python编程实现12306的一个小爬虫实例
2017/12/27 Python
python merge、concat合并数据集的实例讲解
2018/04/12 Python
PyTorch线性回归和逻辑回归实战示例
2018/05/22 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
python验证码图片处理(二值化)
2019/11/01 Python
Python3爬虫mitmproxy的安装步骤
2020/07/29 Python
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
数控技术与应用毕业生自荐信
2013/09/24 职场文书
快递业务员岗位职责
2014/01/06 职场文书
创业计划书的写作技巧及要点
2014/01/31 职场文书
民族团结先进个人材料
2014/02/05 职场文书
有趣的广告词
2014/03/18 职场文书
大学军训自我鉴定大全
2014/09/18 职场文书
天下第一关导游词
2015/02/06 职场文书
检察院起诉书
2015/05/20 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL