【机器学习】机器学习的基本分类-监督学习-决策树-CART(Classification and Regression Tree)

CART(Classification and Regression Tree)

CART(分类与回归树)是一种用于分类和回归任务的决策树算法,提出者为 Breiman 等人。它的核心思想是通过二分法递归地将数据集划分为子集,从而构建一棵树。CART 算法既可以生成分类树,也可以生成回归树


1. CART 的特点

  1. 二叉树结构:CART 始终生成二叉树,每个节点只有两个分支(左子树和右子树)。
  2. 分裂标准不同
    • 对于分类任务,CART 使用**基尼指数(Gini Index)**作为分裂标准。
    • 对于回归任务,CART 使用**最小均方误差(MSE)**作为分裂标准。
  3. 支持剪枝:通过后剪枝减少过拟合。
  4. 处理连续和离散数据:支持连续特征的划分点选择。

2. CART 的基本流程

  1. 输入:训练数据集 D,目标变量类型(分类或回归)。
  2. 递归分裂
    • 按照基尼指数(分类)或均方误差(回归)选择最佳划分点。
    • 对数据集划分为两个子集,递归构造子树。
  3. 停止条件
    • 节点样本数量小于阈值。
    • 划分后不再能显著降低误差。
  4. 剪枝
    • 通过校验集性能优化,剪去不显著的分支。
  5. 输出:最终的二叉决策树。

3. 分类树

(1) 基尼指数

基尼指数(Gini Index)用于衡量一个节点的“纯度”,越小表示越纯:

Gini(D) = 1 - \sum_{k=1}^K \left(\frac{|D_k|}{|D|}\right)^2

其中:

  • D_k:类别 k 的样本数量。
  • K:类别的总数。

节点分裂的基尼指数计算为:

Gini_{split}(D) = \frac{|D_1|}{|D|} Gini(D_1) + \frac{|D_2|}{|D|} Gini(D_2)

最佳划分点是使 Gini_{split}(D) 最小的特征和对应的划分点。


(2) 示例:分类树

数据集

天气温度湿度风力是否运动
晴天30
晴天32
阴天28
雨天24正常
雨天20正常
  1. 计算每个特征的基尼指数

    • 对离散特征(如天气),分别计算不同类别划分后的基尼指数。
    • 对连续特征(如温度),尝试所有划分点,计算每个划分点的基尼指数。
  2. 选择最优特征和划分点

    • 选择基尼指数最小的划分点。
  3. 生成子树

    • 对每个子集递归分裂,直到满足停止条件。

4. 回归树

(1) 分裂标准

对于回归任务,CART 使用**均方误差(MSE)**作为分裂标准:

MSE(D) = \frac{1}{|D|} \sum_{i=1}^{|D|} \left(y_i - \bar{y}\right)^2

其中:

  • y_i:第 i 个样本的目标值。
  • \bar{y}​:节点中所有样本目标值的均值。

节点分裂的误差计算为:

MSE_{split}(D) = \frac{|D_1|}{|D|} MSE(D_1) + \frac{|D_2|}{|D|} MSE(D_2)

最佳划分点是使 MSE_{split}(D) 最小的特征和对应的划分点。


(2) 示例:回归树

假设我们有如下数据集(目标值为房价):

面积(平方米)房价(万元)
50150
60180
70210
80240
90270
  1. 尝试划分点

    • 例如,划分点为 656565。
    • 左子集:{50,60},右子集:{70, 80, 90}。
  2. 计算误差

    • 左子集的均值:\bar{y}_L = (150 + 180) / 2 = 165
    • 右子集的均值:\bar{y}_R = (210 + 240 + 270) / 3 = 240
    • 计算分裂后的总均方误差。
  3. 选择最佳划分点

    • 选择误差最小的划分点,继续构造子树。

 

5. 剪枝

CART 使用后剪枝来防止过拟合:

  1. 生成完全生长的决策树

  2. 计算子树的损失函数

    Cost(T) = \sum_{i=1}^n MSE(T_i) + \alpha \cdot |T|

    其中:

    • T_i:第 i 个叶子节点。
    • |T|:叶子节点的数量。
    • α:正则化参数,控制树的复杂度。
  3. 剪去对验证集性能提升不大的分支


6. CART 的优缺点

优点
  1. 生成二叉树,逻辑清晰,易于实现。
  2. 支持分类和回归任务。
  3. 支持连续特征和缺失值处理。
  4. 剪枝机制增强了泛化能力。
缺点
  1. 易受数据噪声影响,可能生成复杂的树。
  2. 对高维数据表现一般,无法处理稀疏特征。
  3. 生成的边界是轴对齐的,可能不适用于复杂分布。

7. 与其他决策树算法的比较

特点ID3C4.5CART
划分标准信息增益信息增益比基尼指数 / MSE
支持连续特征
树结构多叉树多叉树二叉树
剪枝后剪枝后剪枝
应用分类分类分类与回归

 8. 代码实现

以下是一个简单的 CART 分类树实现:

import numpy as np

# 计算基尼指数
def gini_index(groups, classes):
    total_samples = sum(len(group) for group in groups)
    gini = 0.0
    for group in groups:
        size = len(group)
        if size == 0:
            continue
        score = 0.0
        for class_val in classes:
            proportion = [row[-1] for row in group].count(class_val) / size
            score += proportion ** 2
        gini += (1 - score) * (size / total_samples)
    return gini

# 划分数据集
def split_data(data, index, value):
    left, right = [], []
    for row in data:
        if row[index] < value:
            left.append(row)
        else:
            right.append(row)
    return left, right

# 示例数据
dataset = [
    [2.771244718, 1.784783929, 0],
    [1.728571309, 1.169761413, 0],
    [3.678319846, 2.81281357, 0],
    [3.961043357, 2.61995032, 0],
    [2.999208922, 2.209014212, 1],
]

# 计算基尼指数
split = split_data(dataset, 0, 2.5)
gini = gini_index(split, [0, 1])
print("基尼指数:", gini)

输出结果

基尼指数: 0.30000000000000004

CART 是机器学习中非常经典的算法,同时也是随机森林、梯度提升决策树等模型的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/928598.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

商汤完成组织架构调整,改革完成的商汤未来何在?

首先&#xff0c;从核心业务的角度来看&#xff0c;商汤科技通过新架构明确了以AI云、通用视觉模型等为核心业务的战略方向。这一举措有助于商汤科技集中资源&#xff0c;加强在核心业务领域的研发和市场拓展&#xff0c;提高市场竞争力。同时&#xff0c;坚定生成式AI为代表的…

python学opencv|读取视频(二)制作gif

【1】引言 前述已经完成了图像和视频的读取学习&#xff0c;本次课学习制作gif格式动图。 【2】教程 实际上想制作gif格式动图是一个顺理成章的操作&#xff0c;完成了图像和视频的处理&#xff0c;那就自然而然会对gif的处理也产生兴趣。 不过在opencv官网、matplotlib官网…

【Pytorch】torch.reshape与torch.Tensor.reshape区别

问题引入&#xff1a; 在Pytorch文档中&#xff0c;有torch.reshape与torch.Tensor.reshape两个reshape操作&#xff0c;他们的区别是什么呢&#xff1f; 我们先来看一下官方文档的定义&#xff1a; torch.reshape&#xff1a; torch.Tensor.reshape: 解释&#xff1a; 在p…

ArcGIS对地区进行筛选提取及投影转换

首先我们需要对坐标系和投影这些概念做进一步的解释。 1、基本概念&#xff1a; 想要理解坐标系和投影的概念&#xff0c;首先我们需要先理解什么是坐标。顾名思义&#xff0c;坐标就是指我们所在的位置&#xff0c;比如我在离旗杆东北部50m处&#xff0c;其实就是离旗杆东边…

qt QRadialGradient详解

1、概述 QRadialGradient是Qt框架中QGradient的一个子类&#xff0c;它用于创建径向渐变效果。径向渐变是从一个中心点向外扩散的颜色渐变&#xff0c;通常用于模拟光源或创建类似于高光和阴影的效果。QRadialGradient允许你定义渐变的中心点、焦距&#xff08;控制渐变扩散的…

Docker--Docker Image(镜像)

什么是Docker Image&#xff1f; Docker镜像&#xff08;Docker Image&#xff09;是Docker容器技术的核心组件之一&#xff0c;它包含了运行应用程序所需的所有依赖、库、代码、运行时环境以及配置文件等。 简单来说&#xff0c;Docker镜像是一个轻量级、可执行的软件包&…

《C++ Primer Plus》学习笔记|第1章 预备知识 (24-12-2更新)

文章目录 1.2.4 1.4 程序创建1.4.2 编译和链接 1.2.4 泛型编程 它允许程序员在编写代码时不指定具体的数据类型&#xff0c;而是使用一种通用的模板来处理多种不同的数据类型。以提高代码的复用性 C模板提供了完成这种任务的机制。 1.4 程序创建 使用文本编辑器编写程序&…

string类函数的手动实现

在上一篇文章中&#xff0c;我们讲解了一些string类的函数&#xff0c;但是对于我们要熟练掌握c是远远不够的&#xff0c;今天&#xff0c;我将手动实现一下这些函数~ 注意&#xff1a;本篇文章中会大量应用复用&#xff0c;这是一种很巧妙的方法 和以往一样&#xff0c;还是…

架构06-分布式共识

零、文章目录 架构06-分布式共识 1、分布式共识 &#xff08;1&#xff09;基本概念 **分布式共识&#xff1a;**在分布式系统中&#xff0c;多个节点之间达成一致的过程。**复杂性来源&#xff1a;**网络的不可靠性和请求的并发性。**应用场景&#xff1a;**如何确保重要数…

USB 声卡全解析:提升音频体验的得力助手

在当今数字化的时代&#xff0c;音频领域的追求愈发多元。无论是热衷聆听高品质音乐的爱好者&#xff0c;还是在专业音频工作中精雕细琢的人士&#xff0c;亦或是在游戏世界里渴望极致音效沉浸的玩家&#xff0c;都始终在寻觅能让音频体验更上一层楼的妙法。而 USB 声卡&#x…

系统--线程互斥

1、相关背景知识 临界资源多线程、多执行流共享的资源,就叫做临界资源临界区每个线程内部,访问临界资源的代码互斥在任何时刻,保证有且只有一个执行流进入临界区,访问临界资源,对临界资源起到保护作用原子性不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么…

【短视频矩阵系统==saas技术开发】

在数字媒体领域&#xff0c;短视频的崛起已不可忽视。对于商业实体而言&#xff0c;掌握如何通过短视频平台有效吸引潜在客户并提高转化率&#xff0c;已成为一项关键课题。本文旨在深入剖析短视频矩阵系统的构成与作用机制&#xff0c;以期为企业提供一套系统化的策略&#xf…

Python语法基础(八)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 异常处理 这一个部分&#xff0c;我们来讲一下异常处理这部分。 异常特点 当程序执行的过程中&#xff0c;我们遇到了异常&#xff0c;而且异常未被处理&#xff0c;那么程序…

burp2

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

linux 获取公网流量 tcpdump + python + C++

前言 需求为&#xff0c;统计linux上得上下行公网流量&#xff0c;常规得命令如iftop 、sar、ifstat、nload等只能获取流量得大小&#xff0c;不能区分公私网&#xff0c;所以需要通过抓取网络包并排除私网段才能拿到公网流量。下面提供了一些有效得解决思路&#xff0c;提供了…

React 路由与组件通信:如何实现路由参数、查询参数、state和上下文的使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

爬虫第四篇:Xpath 路径表达式全解析:从网页基础到爬取百度贴吧图片实战

简介&#xff1a;本文围绕 Xpath 路径表达式展开讲解&#xff0c;先是介绍了网页相关基础如 html、css、vue 以及前后端分离的概念与示例&#xff0c;包括各部分的结构、作用及简单代码展示&#xff0c;随后详细阐述了 xml 的节点关系、选取节点、谓语等理论知识&#xff0c;最…

七牛云成功保存但无法显示和访问{“error“:“download token not specified“}

在使用七牛云存储图片时&#xff0c;前端通过链接访问图片时遇到错误&#xff1a; {"error":"download token not specified"} 具体表现为&#xff1a; 后端通过 access_key 和 secret_key 生成了上传和下载的 Token。前端将域名与 res.key 拼接后生成图…

linux下环境变量的使用

文章目录 环境变量一、环境变量的定义与特点二、环境变量的分类三、常用的环境变量四 环境变量相关指令五 c语言获取环境变量接口六 通过代码如何获取环境变量 环境变量 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 一、环境变量…

2-2-18-9 QNX系统架构之文件系统(三)

阅读前言 本文以QNX系统官方的文档英文原版资料为参考&#xff0c;翻译和逐句校对后&#xff0c;对QNX操作系统的相关概念进行了深度整理&#xff0c;旨在帮助想要了解QNX的读者及开发者可以快速阅读&#xff0c;而不必查看晦涩难懂的英文原文&#xff0c;这些文章将会作为一个…