CART树分类、回归、剪枝实现

article/2025/9/24 15:56:08

决策树ID3,C4.5是多叉树,CART树是一个完全二叉树,CART树不仅能完成分类也能实现回归功能,所谓回归指的是目标是一个连续的数值类型,比如体重、身高、收入、价格等,在介绍ID3,C4.5其核心是信息熵的应用,而在实际应用中熵的运算会涉及大量的对数运算,其复杂度还是比较高的。CART树采用了一个与熵近似的概念'基尼系数',不同于熵来自于物理学,基尼系数来自于经济学范畴,原本是用来衡量国民收入是否平均:当基尼系数为0时代表收入平均,而大于0.5时代表贫富差异显著。在决策树模型中,基尼系数越高代表信息纯度越低,基尼系数越低代表纯度越高,而纯度的高低代表样本数据不确定性的大小,这方面来说基尼系数与熵的功效一致,实际上基尼系数在是信息熵的近似,可以观察下图:

u=64237681,321359514&fm=15&gp=0.jpg

上图中红色曲线代表信息熵,绿色曲线代表基尼系数,可以看到两者走势是一样的。基尼系数是初等函数二次多项式的运算,这比熵的对数运算简单多了。如果要问CART树能不能用熵来代替基尼系数呢?答案是当然可以了,熵更能反映出信息的不确定性,香农博士的理论可不是开玩笑的,但是接下来了解算法特性后就会发现如果用熵来构建CART树,计算量将会非常之大,选用基尼系数是平衡准确率与效率之后的折中之举,这个折中的办法其实不会降低CART树的实际效果,在介绍ID3,C4.5结尾时曾提到,决策树本质是一个弱分类器,实际应用中不会单独用一棵决策树来实现分类的,而是会用集成算法将多棵决策树汇总起来进行运算。这里涉及相关知识有Bagging,Boosting 集成算法以及随机森林、GBDT梯度下降树等,这些都将在以后篇章中详细介绍。

一、CART树实现分类

2.1、CART树分类原理介绍

前面已经说过CART树利用基尼系数代替信息熵表示信息的不确定性,CART树实现分类的原理与ID3,C4.5一样,分别计算各个属性对降低基尼系数高低作为构建决策树结点的依据,与ID3,C4.5不同的是CART树是一个二叉树,对结点分裂时会选择一个切分点将一个属性的值分成两类计算,分成两类的过程代表二叉树子树的两个分支。

cart分类算法.jpg

    CART树实现分类过程中每选择一个属性计算条件基尼系数时,都需要遍历整个属性值找到最佳切分点,然后再类似重复计算其他属性的条件基尼系数,择其最优的作为决策树结点,可以看到这个计算量比起ID3,C4.5是成倍上升的,所以CART树选择一个成本较低的二次函数而不是对数作为数学模型。综上所述,每个属性寻找最佳切分点是CART树与ID3,C4.5最大不同之处。

    另外需要注意的是,前面在提到C4.5对ID3改进时其中有一点是ID3偏好值是多元化的属性优先作为决策树结点,C4.5通过除以属性的信息熵来抵消了这方面的偏好,而CART树的条件基尼系数、基尼系数增益其形式都与为ID3的条件熵、信息增益一样,为什么这里就不存在ID3问题呢?或者说CART树是否偏好多元化的属性?其实仔细看一下CART树计算过程可以看到,由于切分点概念的引入,不管属性值有多少,都将所有属性值都划分成两部分,也就是说CART树认为所有的属性值只有两种情况,没有哪个属性能占到多样化这种便宜。

    下面看一个具体的CART树实现分类的例子,这是一个根据是否有房、婚姻状况、收入情况判断是否会拖欠贷款的分类过程,可以看到收入情况是一个数值型的属性,其他两个是离散型属性。

1602292670958073045.png

首先计算分类的基尼系数,这里拖欠贷款的有3例,不拖欠的有7例,利用公式(1)可得:

Gini(是否拖欠贷款)=1−(3/10)^2−(7/10)^2=0.42

然后分别计算属性的条件基尼系数,比如是否有房这个属性,由于这个属性本身只有两个分类,所以切分点只要一个即可:

20180322075455946.png

 

Gini(有房)=1−(0/3)^2−(3/3)^2=0

Gini(无房)=1−(3/7)^2−(4/7)^2=0.4898

Gain_Gini{是否拖欠贷款,是否有房}=0.42−7/10×0.4898−3/10×0=0.077

接下来看婚姻状况,该属性值有三个married,single,divorced,可先选{married} | {single,divorced}计算基尼系数增益为:

Gain_Gini{是否拖欠贷款,{married} | {single,divorced}}=0.42−4/10×0−6/10×[1−(3/6)^2−(3/6)^2]=0.12

移动切分点得到其他两种情况的基尼系数增益:

 

Gain_Gini{是否拖欠贷款,{single} | {married,divorced}}=0.42−4/10×0.5−6/10×[1−(1/6^)2−(5/6)^2]=0.053

Gain_Gini{是否拖欠贷款,{divorced} | {single,married}}=0.42−2/10×0.5−8/10×[1−(2/8)^2−(6/8)^2]=0.02

可以发现婚姻状况按{married} | {single,divorced}切分时基尼系数增益最大(条件基尼系数最小),所以选择这个切分下计算出的基尼系数增益作为婚姻状况对是否拖欠贷款的基尼系数增益。

接下来看收入状况,收入是一个数值型属性,将属性值按从小到大排列,并将排列好的属性值两两计算平均值得到相邻中值点:

1602293800490063075.png

选择相邻中值点作为切分点,从小到大顺序先选择65K,小于65K的年收入为60K的为一个部分,大于65K是第二个部分,然后统计每个部分样本个数,利用上面的公式即可计算出基尼系数增益,从上图可以看到不同切分点下系数增益最大值是0.12,与婚姻状况的系数增益一样。

    以上计算完成了算法的第一步,接下来根据第二步选择婚姻状况作为决策树的节点,并选择切分点{married} | {single,divorced}作为二叉树的两个分支,将married作为左枝,{single,divorced}作为右枝,其中左枝有4个样本其类别都是no,这时左枝为叶结点不需要再分类;而右枝有6个样本,用余下的收入和是否有房两个属性再进行分类,此时剩下的6个样本数据的类别的基尼系数为:

Gini(是否拖欠贷款)=1−(3/6)^2−(3/6)^2=0.5

按是否有房对这6个样本计算系数增益可得:

Gain_Gini{是否拖欠贷款,是否有房}=0.5−4/6×[1−(3/4)^2−(1/4)^2]−2/6×0=0.25

收入情况系数增益表如下图:

1602294688661084385.png

最后得到CART树分类图如下所示:

1602294820880063752.png

2.2 python实现CART分类与剪枝

    介绍C4.5时说过不剪枝的决策树是过拟合的,回顾C4.5剪枝算法是引入惩罚因子后,利用子树结点与叶结点之间的误差率,当两者误差率差不多时剪枝子树结点用叶结点代替从而降低过拟合,当时这个惩罚因子是一个固定的常数0.5,CART树剪枝算法与C4.5大致相同,只不过CART树剪枝算法的惩罚因子不再是一个固定的常数,观察下图,有内部结点t以及以t为根结点的子树Tt:

1602510390490058655.jpg

 剪枝_1.jpg

剪枝_2.jpg

下面python代码实现CART树分类以及剪枝,样本数据是一些二手车数据,属性分别是:'购买时价格','后期保养','车门','装载人数','后备箱大小','安全性',样本分类是根据以上特性得出的客户购买意向,主要有以下几类,acc:接受,unacc:不接受,good:好评,vgood:非常好。可以看出属性都是离散型的,所以这里用基尼系数来实现损失函数。

 

python实现cart树剪枝代码


http://chatgpt.dhexx.cn/article/fX2vjByp.shtml

相关文章

sklearn 决策树例子_sklearn CART决策树分类

sklearn CART决策树分类 决策树是一种常用的机器学习方法,可以用于分类和回归。同时,决策树的训练结果非常容易理解,而且对于数据预处理的要求也不是很高。 理论部分 比较经典的决策树是ID3、C4.5和CART,分别分析信息增益、增益率…

机器学习--详解CART树剪枝原理和过程

这一节主要讲前面多次的提到的决策树问题,前面的决策树生成算法递归的产生决策树,直到不能继续分支或者达到要求为止,这样的决策树往往对训练数据的分类很准确,因为他就是基于训练数据的熵或者基尼不存度进行分类的,因…

【树模型与集成学习】(task2)代码实现CART树(更新ing)

学习心得 task2学习GYH大佬的回归CART树,并在此基础上改为分类CART树。 更新ing。。 这里做一些对决策树分裂依据更深入的思考引导:我们在task1证明离散变量信息增益非负时曾提到,信息增益本质上就是联合分布和边缘分布乘积的kl散度&#xf…

CART 决策树

ID3使用信息增益,而C4.5使用增益比率进行拆分。 在此,CART是另一种决策树构建算法。 它可以处理分类和回归任务。 该算法使用名为gini索引的新度量标准来创建分类任务的决策点。 CART树的核心是决策规则将通过GINI索引值决定。 停止条件。 如果我们继续…

CART决策树算法

在进行自动识别窃漏电用户分析实战时,用到了CART决策树算法,所以整理记录该算法的内容。内容整理参考文档决策树——CART算法及其后的参考文章。 一、CART(classification and regression tree)分类与回归树,既可用于…

CART树算法解析加举例

算法步骤 CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在…

ID3、C4.5与CART树的联系与区别

ID3、C4.5与CART树的联系与区别: 参考博客: 链接1 链接2 特征选择准则: ID3的特征选择准则为信息增益,即集合D的经验熵H(D)与给定特征A下条件经验熵H(D|A)之差,即: H(D)表现了数据集D进行分类的不确定性…

决策树构建算法—ID3、C4.5、CART树

决策树构建算法—ID3、C4.5、CART树 决策树构建算法—ID3、C4.5、CART树 构建决策树的主要算法ID3C4.5CART三种算法总结对比 决策树构建算法—ID3、C4.5、CART树 构建决策树的主要算法 ID3C4.5CART (Classification And Rsgression Tree) ID3 ID3算法…

3-6 决策树、CART树、GBDT、xgboost、lightgbm一些关键点梳理

目录 1、决策树 2、CART树 2.1 CART分类树-输入样本特征;输出样本对应的类别(离散型) 2.2 CART回归树-输入样本特征;输出样本的回归值(连续型) 3、GBDT 3.1 提升树 3.2 GBDT 4、xgboost 4.1 损失函数及节点展开 4.2 精确贪心算法及相关近似算法…

CART树回归

说明:本博客是学习《python机器学习算法》赵志勇著的学习笔记,其图片截取也来源本书。 基于树的回归算法是一类基于局部的回归算法,通过将数据集切分成多份,在每一份数据中单独建模。与局部加权线性回归不同的是,基于…

剪枝、cart树

一、剪枝 1. 为什么要剪枝 在决策树生成的时候,更多考虑的是训练数据,而不是未知数据,这会导致过拟合,使树过于复杂,对于未知的样本不准确。 2. 剪枝的依据——通过极小化决策树的损失函数 损失函数的定义为&#x…

【机器学习】决策树——CART分类回归树(理论+图解+公式)

🌠 『精品学习专栏导航帖』 🐳最适合入门的100个深度学习实战项目🐳🐙【PyTorch深度学习项目实战100例目录】项目详解 数据集 完整源码🐙🐶【机器学习入门项目10例目录】项目详解 数据集 完整源码&…

CART树(分类回归树)

主要内容 (1)CART树简介 (2)CART树节点分裂规则 (3)剪枝 --------------------------------------------------------------------------------------------------------------------- 一、简介 CART…

CART树

算法概述 CART(Classification And Regression Tree)算法是一种决策树分类方法。 它采用一种二分递归分割的技术,分割方法采用基于最小距离的基尼指数估计函数,将当前的样本集分为两个子样本集,使得生成的的每个非叶子节点都有两个分支。因此…

Pytorch之view,reshape,resize函数

对于深度学习中的一下数据,我们通常是要变成tensor格式,并且需要对其调整形状,很多时候我们往往只关注view之后的结果(比如输出的尺寸),而不关心过程。但有时候还是要关注一下这个到底是怎么变换过来的&…

OpenCV-Python图像处理:插值方法及使用resize函数进行图像缩放

☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 图像缩放用于对图像进行缩小或扩大,当图像缩小时需要对输入图像重采样去掉部分像素,当图像扩大时需要在输入图像中根据算法生成部分像素,二者都会利用插值算法来实现。 一…

vector的resize函数和reserve函数

博客原文:C基础篇 -- vector的resize函数和reserve函数_VampirEM_Chosen_One的博客-CSDN博客,写的特别好,谢谢原博主。 正文: 对于C的vector容器模板类,存在size和capacity这样两个概念,可以分别通过vect…

OpenCV 图片尺寸缩放——resize函数

文章目录 OpenCV中的缩放:resize函数代码案例 OpenCV中的缩放: 如果要放大或缩小图片的尺寸,可以使用OpenCV提供的两种方法: resize函数,是最直接的方式;pyrUp,pyrDown函数,即图像…

OpenCV的resize函数优化

背景 在使用OpenCV做图像处理的时候,最常见的问题是c版本性能不足,以resize函数为例来说明,将size为[864,1323,3]的函数缩小一半: Mat img0;gettimeofday(&t4, NULL);cv::resize(source, img0, cv::Size(cols_out,rows_out)…

C++ | resize函数的用法

最近在leetcode用C刷题,刚遇到一题需要给重新弄一个容器,并给容器初始化。新建容器要在private类中声明resize函数用来初始化preSum容器。 resize函数是C中序列式容器的一个共性函数,vv.resize(int n,element)表示调整容器vv的大小为n&#x…