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 相关文章推荐
Tensorflow的可视化工具Tensorboard的初步使用详解
Feb 11 Python
python实现读取大文件并逐行写入另外一个文件
Apr 19 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
Dec 03 Python
python识别图像并提取文字的实现方法
Jun 28 Python
django 微信网页授权认证api的步骤详解
Jul 30 Python
python输出决策树图形的例子
Aug 09 Python
扩展Django admin的list_filter()可使用范围方法
Aug 21 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
Jun 23 Python
python与js主要区别点总结
Sep 13 Python
python基础详解之if循环语句
Apr 24 Python
分享Python获取本机IP地址的几种方法
Mar 17 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实现获取文件后缀名的几种常用方法
2015/08/08 PHP
深入理解JavaScript系列(2) 揭秘命名函数表达式
2012/01/15 Javascript
基于jQuery判断两个元素是否有重叠部分的代码
2012/07/25 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
基于jQuery实现简单的折叠菜单效果
2015/11/23 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
vue+swiper实现侧滑菜单效果
2017/12/28 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
js for终止循环 跳出多层循环
2018/10/04 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
Python多线程扫描端口代码示例
2018/02/09 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
2019/04/15 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
Python工程师必考的6个经典面试题
2020/06/28 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
html5启动原生APP总结
2020/07/03 HTML / CSS
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
斯洛伐克香水和化妆品购物网站:Parfemy-Elnino.sk
2020/01/28 全球购物
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
工程造价管理专业大专生求职信
2013/10/06 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
2014年女职工工作总结
2014/11/27 职场文书
党风廉政承诺书2016
2016/03/25 职场文书
创业计划书介绍
2019/04/24 职场文书
docker-compose部署Yapi的方法
2022/04/08 Servers