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修改Excel数据的实例代码
Nov 01 Python
python使用正则表达式检测密码强度源码分享
Jun 11 Python
Python函数式编程指南(四):生成器详解
Jun 24 Python
利用Django内置的认证视图实现用户密码重置功能详解
Nov 24 Python
TensorFlow实现RNN循环神经网络
Feb 28 Python
Python简单定义与使用二叉树示例
May 11 Python
tensorflow 获取变量&打印权值的实例讲解
Jun 14 Python
解决Python下json.loads()中文字符出错的问题
Dec 19 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
Python基础知识之变量的详解
Apr 14 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下对字符串的递增运算代码
2010/08/21 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
php四种定界符详解
2017/02/16 PHP
PHP字典树(Trie树)定义与实现方法示例
2017/10/09 PHP
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
js 通用订单代码
2013/12/23 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
jQuery中document与window以及load与ready 区别详解
2014/12/29 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
JavaScript入门基础
2015/08/12 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
Vue.js自定义指令的用法与实例解析
2017/01/18 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
深入浅出分析Python装饰器用法
2017/07/28 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
python实现机器学习之元线性回归
2018/09/06 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
如何将 awk 脚本移植到 Python
2019/12/09 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
基于Python正确读取资源文件
2020/09/14 Python
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
老海军美国官网:Old Navy
2016/09/05 全球购物
马来西亚户外装备商店:PTT Outdoor
2019/07/13 全球购物
Skyscanner香港:机票比价, 平机票和廉价航空机票预订
2020/02/07 全球购物
银行职员个人的工作自我评价
2014/02/15 职场文书
初一学生评语大全
2014/04/24 职场文书
新学期国旗下演讲稿
2014/05/08 职场文书
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript