【机器学习】决策树

article/2025/6/30 2:14:46

目录

一、引言

二、决策树的构造

三、决策树的ID3算法

四、决策树的C4.5算法

五、决策树的CART算法

六、动手实现决策树C4.5的算法详解步骤以及Python完整代码实现


一、引言

       在机器学习中,有一种与神经网络并行的非参数化模型——决策树模型及其变种。顾名思义,决策树采用了与树类似的结构。现实中的树是根在下、从下往上生长的,决策树却是根在上,从上往下生长的。但是,两者都有根、枝干的分叉与叶子。在决策树中,最上面的节点称为根节点,最下面没有分叉的节点称为叶节点。其中,根节点和内部节点都有一些边指向其他节点,这些被指向的节点就称为它的子节点。叶节点是树的最末端,没有指向其他根节点的边,而除根结点之外,每个内部节点和叶节点都有唯一的节点指向它,该节点称为其父节点。本文详细介绍了决策树的构造、ID3算法、C4.5的算法、CART算法以及C4.5算法的详细步骤用Python代码实现。

二、决策树的构造

1. 决策树的基本概念

       决策树是一种非参数监督学习算法,通过将数据集按照特定特征递归地分裂为较小的子集,从而构建出一个预测模型。决策树结构包括:

根节点:代表整个数据集。
内部节点:表示对特征的测试。
分支:表示测试的输出。
叶节点:代表最终的分类结果或回归值。

        决策树的构造本质上是一个特征选择和递归划分的过程,目标是构建一个能够最大程度反映数据内在规律的树结构。

2. 决策树构造的基本框架

        决策树构造通常遵循"自顶向下、递归分治"的策略,基本算法框架为:

函数 BuildDecisionTree(数据集D, 特征集A, 选择标准criterion):
    创建节点N
    
    # 终止条件
    如果 满足终止条件:
        将N标记为叶节点,赋予类别/值
        返回N
        
    # 选择最优特征
    根据criterion选择最优特征A_best和分割点
    
    # 根据特征分割数据
    将数据集D根据A_best分割为若干子集{D_1, D_2, ..., D_v}
    
    # 递归构建子树
    对于每个子集D_j:
        子树j = BuildDecisionTree(D_j, A - {A_best}, criterion)
        将子树j连接到节点N
        
    返回N

终止条件通常包括:
(1)节点中的样本全部属于同一类别。

(2)特征集为空或样本在所有特征上取值相同。

(3)节点中的样本数小于预定阈值。

三、决策树的ID3算法

1. ID3算法基本原理

       ID3(Iterative Dichotomiser 3)算法是由Ross Quinlan在1986年提出的决策树生成算法,它通过信息论中的熵(entropy)和信息增益(information gain)来构建决策树。ID3算法的核心思想是:在每一步构建决策树的过程中,选择能够最大化信息增益的特征作为当前节点的分裂特征。

2. 信息论基础

2.1 熵(Entropy)

        熵是信息论中表示随机变量不确定性的度量。对于一个随机变量$Y$,其熵$H(Y)$定义为:

                                                   $H(Y) = -\sum_{i=1}^{n} P(y_i) \log_2 P(y_i)$

其中:
$y_i$是随机变量$Y$可能的取值。
$P(y_i)$$y_i$出现的概率。
$n$$Y$可能取值的数量。
$\log_2$表示以2为底的对数。

在决策树中,对于一个数据集$D$,假设类别标签有$K$个可能取值,第$k$个类别的样本数为$|C_k|$,则数据集$D$的熵为:

                                                  $H(D) = -\sum_{k=1}^{K} \frac{|C_k|}{|D|} \log_2 \frac{|C_k|}{|D|}$

其中$\frac{|C_k|}{|D|}$表示类别$k$在数据集中的占比。

2.2 条件熵(Conditional Entropy)

条件熵$H(Y|X)$表示在已知随机变量$X$的条件下,随机变量$Y$的不确定性:

                                    $H(Y|X) = \sum_{j=1}^{m} P(x_j) H(Y|X=x_j)$

其中:
$x_j$是随机变量$X$的可能取值。

P(x_j)$x_j$出现的概率。
$H(Y|X=x_j)$是在$X=x_j$条件下$Y$的熵。

在决策树中,对于特征$A$,数据集$D$可以划分为$v$个子集$\{D_1, D_2, ..., D_v\}$,则条件熵$H(D|A)$为:

                                         $H(D|A) = \sum_{j=1}^{v} \frac{|D_j|}{|D|} H(D_j)$

其中$\frac{|D_j|}{|D|}$表示子集$D_j$在数据集中的占比。

2.3 信息增益(Information Gain)

信息增益表示由于使用特征$A$划分数据集而导致的不确定性减少量:

                                $Gain(D, A) = H(D) - H(D|A)$

用公式展开为:

      $Gain(D, A) = -\sum_{k=1}^{K} \frac{|C_k|}{|D|} \log_2 \frac{|C_k|}{|D|} - \left( -\sum_{j=1}^{v} \frac{|D_j|}{|D|} \sum_{k=1}^{K} \frac{|D_j^k|}{|D_j|} \log_2 \frac{|D_j^k|}{|D_j|} \right)$

其中:
$|D_j^k|$表示子集$D_j$中属于类别$k$的样本数。

3. ID3算法完整流程

ID3算法采用自顶向下的贪心方法构建决策树,其完整的数学流程如下:

(1)计算当前数据集的熵:

                                      $H(D) = -\sum_{k=1}^{K} \frac{|C_k|}{|D|} \log_2 \frac{|C_k|}{|D|}$

(2) 对每个未使用的特征$A$
   计算条件熵$H(D|A)$
   
                                               $H(D|A) = \sum_{j=1}^{v} \frac{|D_j|}{|D|} H(D_j)$
   
   计算信息增益$Gain(D, A)$
   
                                             $Gain(D, A) = H(D) - H(D|A)$

(3)选择信息增益最大的特征$A_{best}$作为当前节点的分裂特征:

                                                $A_{best} = \arg\max_{A} Gain(D, A)$

(4) 对$A_{best}$的每个可能取值$a_j$
  (1)创建子节点,并将满足$A_{best} = a_j$的样本分配给该子节点。
   (2)如果子节点的样本都属于同一类别$C_k$,则将子节点标记为叶节点,类别为$C_k$
   否则,对子节点递归执行步骤1-4。

4. ID3算法的特点与局限性

4.1 特点:
(1)使用信息增益作为特征选择的度量,倾向于选择具有较大信息增益的特征。
(2)构建的决策树通常较为平衡。
(3)计算简单,易于实现。

4.2 局限性:
(1)偏向多值特征:ID3算法中的信息增益度量会偏向于选择取值较多的特征。例如,对于一个唯(2)一标识符特征(如ID),其信息增益会非常高,但对分类几乎没有泛化能力。
(3)无法处理连续值特征:ID3算法只能处理离散值特征,需要对连续值特征进行离散化处理。
(4)无法处理缺失值:没有内置处理缺失值的机制。
(5)容易过拟合:没有剪枝策略,容易生成过于复杂的树。
(6)无法处理不平衡数据:对于类别不平衡的数据集,ID3算法可能会偏向于主要类别。

5. ID3算法的数学推导

ID3算法的关键是选择最优特征,这是通过最大化信息增益实现的。以下是这一过程的数学推导:

假设特征$A$将数据集$D$分割成$v$个子集$\{D_1, D_2, ..., D_v\}$,这些子集的熵可分别计算为:

                                       $H(D_j) = -\sum_{k=1}^{K} \frac{|D_j^k|}{|D_j|} \log_2 \frac{|D_j^k|}{|D_j|}$

其中$|D_j^k|$是子集$D_j$中属于类别$k$的样本数量。

条件熵$H(D|A)$是这些子集熵的加权平均:

                                               $H(D|A) = \sum_{j=1}^{v} \frac{|D_j|}{|D|} H(D_j)$

用具体公式表示为:

                                    $H(D|A) = \sum_{j=1}^{v} \frac{|D_j|}{|D|} \left( -\sum_{k=1}^{K} \frac{|D_j^k|}{|D_j|} \log_2 \frac{|D_j^k|}{|D_j|} \right)$

而信息增益是原始熵与条件熵的差值:

                                                 $Gain(D, A) = H(D) - H(D|A)$

展开后:

        $Gain(D, A) = -\sum_{k=1}^{K} \frac{|C_k|}{|D|} \log_2 \frac{|C_k|}{|D|} - \sum_{j=1}^{v} \frac{|D_j|}{|D|} \left( -\sum_{k=1}^{K} \frac{|D_j^k|}{|D_j|} \log_2 \frac{|D_j^k|}{|D_j|} \right)$

6. ID3算法伪代码

函数 ID3(数据集D, 特征集A, 阈值ε):
    创建节点N
    
    # 如果数据集D中所有样本属于同一类别C_k
    如果 D中样本都属于类别C_k:
        将N标记为C_k类叶节点
        返回N
        
    # 如果特征集A为空或数据集D中样本在A上取值相同
    如果 A为空 或 D中样本在A上取值相同:
        将N标记为叶节点,类别为D中样本数最多的类
        返回N
        
    # 否则,计算A中各特征的信息增益,选择信息增益最大的特征A_best
    对于每个特征A_i in A:
        计算信息增益Gain(D, A_i)
    A_best = 信息增益最大的特征
    
    # 如果最大信息增益小于阈值ε,则不再划分
    如果 Gain(D, A_best) < ε:
        将N标记为叶节点,类别为D中样本数最多的类
        返回N
        
    # 以A_best为划分特征构建子树
    将N标记为特征A_best对应的内部节点
    对于A_best的每个可能取值a_j:
        D_j = 满足A_best=a_j的D的子集
        如果 D_j为空:
            创建叶节点N_j,类别为D中样本数最多的类
            将N_j作为N的子节点
        否则:
            调用ID3(D_j, A - {A_best}, ε)获得子树
            将子树作为N的子节点
            
    返回N

7. 一个简单的ID3算法示例

假设我们有一个关于是否去钓鱼的决策问题,特征包括:天气(Outlook)、温度(Temperature)、湿度(Humidity)和刮风(Windy),类别为是否去钓鱼(PlayTennis)。

假设部分数据如下:

        ID3算法会计算每个特征的信息增益。首先计算整个数据集的熵$H(D)$,然后计算各个特征的条件熵$H(D|A)$,最后得到信息增益$Gain(D,A)$

        比如,对于特征"Outlook",它有三个可能取值:Sunny、Overcast和Rain,会将数据集分成三个子集。计算这三个子集对应的熵,再根据子集大小计算加权平均,得到条件熵$H(D|Outlook)$

        最终,ID3算法会选择信息增益最大的特征作为根节点,在这个例子中很可能是"Outlook


http://www.hkcw.cn/article/GcOKNUZGvI.shtml

相关文章

美提高钢铝关税至50% 欧盟深表遗憾 谈判进程加速

6月2日,欧盟委员会新闻发言人对美国宣布将钢铁和铝关税从25%提高至50%表示遗憾,认为这一决定加剧了大西洋两岸的经济不确定性。发言人提到谈判仍在继续,双方已同意加快谈判进程,并计划本周举行会谈。欧盟贸易专员塞夫科维奇将于6月4日在法国巴黎会见美国贸易代表格里尔。美…

基于ubuntu和树莓派环境对游戏进行移植

目录 一、在Ubuntu中对波斯王子游戏进行移植 1.1修改Ubuntu系统的仓库镜像网站为国内网站 1.2安装mininim 软件所依赖的库 1.3 编译mininim 软件 二、在树莓派中对波斯王子游戏移植 2.1安装相关环境 2.3编译mininim 软件 三、使用树莓派实现流水灯 一、在Ubuntu中对波…

设计模式——备忘录设计模式(行为型)

摘要 备忘录设计模式是一种行为型设计模式&#xff0c;用于在不破坏封装性的前提下&#xff0c;捕获对象的内部状态并在需要时恢复。它包含三个关键角色&#xff1a;原发器&#xff08;Originator&#xff09;、备忘录&#xff08;Memento&#xff09;和负责人&#xff08;Car…

Linux磁盘管理

磁盘基础 分类 运行方式与原理 详细信息 机械硬盘(HDD)-家用 电机带动磁盘高速旋转&#xff0c;读取数据&#xff1b;速度可以达到5400&#xff0c;7200 rpm&#xff08;round per minute-转/分钟&#xff09; 固态硬盘&#xff08;SSD) 集成电路与芯片&#xff0c;存储芯…

C# XAML 基础:构建现代 Windows 应用程序的 UI 语言

在现代 Windows 应用程序开发中&#xff0c;XAML (eXtensible Application Markup Language) 扮演着至关重要的角色。作为一种基于 XML 的声明性语言&#xff0c;XAML 为 WPF (Windows Presentation Foundation)、UWP (Universal Windows Platform) 和 Xamarin.Forms 应用程序提…

鸿蒙进阶——Mindspore Lite AI框架源码解读之模型加载详解(一)

文章大纲 引言一、模型加载概述二、核心数据结构三、模型加载核心流程 引言 Mindspore 是一款华为开发开源的AI推理框架&#xff0c;而Mindspore Lite则是华为为了适配在移动终端设备上运行专门定制的版本&#xff0c;使得我们可以在OpenHarmony快速实现模型加载和推理等功能&…

趋势因子均值策略思路

本策略旨在通过多种退出条件来管理交易头寸&#xff0c;以实现稳健的交易决策。策略的核心在于利用交易趋势因子&#xff08;ttf&#xff09;及其平均值&#xff08;ttfavg&#xff09;来判断市场趋势&#xff0c;并结合其他技术指标来制定买入、卖出和止损的决策。 交易逻辑思…

FDR的定位原理

一、FDR定位原理概述 频域反射法(FDR)通过分析被测设备在频域上的反射特征&#xff0c;来推断时域(距离域)上的故障位置和性质。当电磁波信号沿着传输线进行传播时&#xff0c;如果遇到阻抗不连续点&#xff0c;一部分能量会继续向前传播&#xff0c;另一部分能量则会反射回来。…

【保姆级教程】PDF批量转图文笔记

如果你有一个PDF文档&#xff0c;然后你想把它发成图文笔记emmm&#xff0c;最好再加个水印&#xff0c;你会怎么做&#xff1f; 其实也不麻烦&#xff0c;打开PDF文档&#xff0c;挨个截图&#xff0c;然后打开PS一张一张图片拖进去&#xff0c;再把水印图片拖进去&#xff0…

【机器学习|评价指标3】平均绝对误差(MAE)、平均绝对百分比误差(MAPE)、均方误差(MSE)、均方根误差(RMSE)详解,附代码。

【机器学习|评价指标3】平均绝对误差&#xff08;MAE&#xff09;、平均绝对百分比误差&#xff08;MAPE&#xff09;、均方误差&#xff08;MSE&#xff09;、均方根误差&#xff08;RMSE&#xff09;详解&#xff0c;附代码。 【机器学习|评价指标3】平均绝对误差&#xff0…

SpringBoot高校宿舍信息管理系统小程序

概述 基于SpringBoot的高校宿舍信息管理系统小程序项目&#xff0c;这是一款非常适合高校使用的信息化管理工具。该系统包含了完整的宿舍管理功能模块&#xff0c;采用主流技术栈开发&#xff0c;代码结构清晰&#xff0c;非常适合学习和二次开发。 主要内容 这个宿舍管理系…

【笔记】在 MSYS2 MINGW64 环境中安装构建工具链(CMake、GCC、Make)

&#x1f4dd; 在 MSYS2 MINGW64 环境中安装构建工具链&#xff08;CMake、GCC、Make&#xff09; ✅ 目标说明 记录在 MSYS2 的 MINGW64 工具链环境中&#xff0c;成功安装用于 C/C 构建的常用开发工具。 包括&#xff1a; GCC 编译器Make 构建系统CMake 跨平台构建工具基础开…

2_MCU开发环境搭建-配置MDK兼容Keil4和C51

MCU开发环境搭建-配置MDK兼容Keil4和C51 一、概述 本文以MDK-ARM V5.36版本基础介绍DMK-ARM工程兼容Keil4和C51的配置。 注:在阅读本文前,请先安装和配置完成MDK-ARM(Keil5)。 二、工具包下载 链接: https://pan.baidu.com/s/1Tu2tDD6zRra4xb_PuA1Wsw 提取码: 81pp 三、…

Redis部署架构详解:原理、场景与最佳实践

Redis部署架构详解&#xff1a;原理、场景与最佳实践 Redis作为一种高性能的内存数据库&#xff0c;在现代应用架构中扮演着至关重要的角色。随着业务规模的扩大和系统复杂度的提升&#xff0c;选择合适的Redis部署架构变得尤为重要。本文将详细介绍Redis的各种部署架构模式&a…

从0开始学习R语言--Day14--贝叶斯统计与结构方程模型

贝叶斯统计 在很多时候&#xff0c;我们经常会看到在统计分析中出现很多反直觉的结论&#xff0c;比如假如有一种病&#xff0c;人群中的患病率为1%&#xff0c;患者真患病时&#xff0c;检测结果为阳性的概率是99%&#xff0c;如果没有&#xff0c;则检测结果为阳性的概率是5…

免费的硬盘工具

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VORkn5VgcUDScW2C5kyqIyX5A1?pwdw5db# 【​本章下载二】&#xff1a;https://pan.quark.cn/s/dc84a71de32a 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…

【Python训练营打卡】day42 @浙大疏锦行

DAY 42 Grad-CAM与Hook函数 知识点回顾 1. 回调函数 2. lambda函数 3. hook函数的模块钩子和张量钩子 4. Grad-CAM的示例 作业&#xff1a;理解下今天的代码即可 Grad-CAM 在深度学习中&#xff0c;我们经常需要查看或修改模型中间层的输出或梯度。然而&#xff0c;标准的…

手机隐藏玩法有哪些?

1️⃣飞行模式充电更快 开启飞行模式后&#xff0c;手机会断开所有网络连接&#xff0c;减少后台数据传输&#xff0c;充电速度能提升 30% 以上 2️⃣关闭后台应用反而更耗电 频繁清理后台可能让耗电量增加 10%-20% &#xff0c;正确做法是让常用程序驻留后台 3️⃣闲置手机别…

浅写弱口令与命令爆破

#作者&#xff1a;允砸儿 #日期&#xff1a;乙巳青蛇年 五月初七 笔者从今天开始写各种的漏洞以及靶场演示&#xff0c;这一部分理论伴随着实践但还是实践比较重要。从这一部分开始我们就要找到对方电脑的漏洞进行渗透测试最终获取我们需要得到的信息。笔者就先拿最简单的弱…

B树和B+树

二叉搜索树和平衡二叉树 二叉搜索树&#xff0c;左子节点小于父节点发值&#xff0c;右子节点大于父节点的值。如果需要查找8&#xff0c;需要三次&#xff0c;而顺序查找需要6次。 同样是二叉搜索树&#xff0c;下图的情况查找效率会很低&#xff0c;从而引出平衡二叉树&#…