【一起啃书】《机器学习》第四章决策树

news2024/11/25 20:49:59

第四章 决策树

在这里插入图片描述

4.1 基本流程

  决策树是一类常见的机器学习方法,是基于树结构来进行决策的,通过对训练样本的分析来确定划分属性,来模拟人类决策过程。

  一般的,一棵决策树包含一个根结点、若干个内部结点和若干个叶结点,叶结点对应于决策结果,其他每个结点则对应于一个属性测试,每个结点包含的样本集合根据属性测试的结果被划分到子结点中,根结点包含样本全集,从根结点到每个叶结点的路径对应了一个判定测试序列。决策树学习的目的是为了产生一棵泛化能力强的决策树,其基本流程遵循简单且直观的“分而治之”策略,如下所示:

4.2 划分选择

  决策树学习的关键在于如何选择最优化分属性,随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,也就是结点的“纯度”越来越高,下面介绍几种在选择最优划分属性时常用的指标。

(1)信息增益

  在介绍信息增益之前,先来介绍一下信息熵。信息熵是度量样本集合纯度最常用的一种指标,假定当前样本集合 D D D中第 k k k类样本所占比例为 p k ( k = 1 , 2 , 3 , . . . , n ) p_k(k=1,2,3,...,n) pk(k=1,2,3,...,n),则 D D D的信息熵定义如下, E n t ( D ) Ent(D) Ent(D)的值越小,说明 D D D的纯度越高。
E n t ( D ) = − ∑ k = 1 n p k log ⁡ 2 p k Ent(D) = - \sum\limits_{k = 1}^n {{p_k}{{\log }_2}{p_k}} Ent(D)=k=1npklog2pk
  下面介绍信息增益。假定离散属性 a a a V V V个可能的取值 a 1 , a 2 , . . . , a V {a^1,a^2,...,a^V} a1,a2,...,aV,若使用属性 a a a来对样本集 D D D进行划分,则会产生 V V V个分支结点,其中第 v v v个分支结点包含了 D D D中所有在属性 a a a上取值为 a v a^v av的样本,记为 D v D^v Dv,这样可以计算出 D v D^v Dv的信息熵。之后考虑到不同的分支结点所包含的样本数不同,为每一个结点赋予权重,即样本数越多的分支结点的影响越大,于是得到如下的信息增益。一般而言,信息增益越大,意味着使用属性 a a a来进行划分所获得的“纯度”提升越大,比如著名的 I D 3 ID3 ID3决策树学习算法。
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a) = Ent(D) - \sum\limits_{v = 1}^V {\frac{{\left| {{D^v}} \right|}}{{\left| D \right|}}Ent({D^v})} Gain(D,a)=Ent(D)v=1VDDvEnt(Dv)
(2)增益率

  实际上,信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,下面我们介绍增益率,定义如下:
G a i n _ r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) , I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log ⁡ 2 ∣ D v ∣ ∣ D ∣ Gain\_ratio(D,a) = \frac{{Gain(D,a)}}{{IV(a)}},IV(a) = - \sum\limits_{v = 1}^V {\frac{{\left| {{D^v}} \right|}}{{\left| D \right|}}} {\log _2}\frac{{\left| {{D^v}} \right|}}{{\left| D \right|}} Gain_ratio(D,a)=IV(a)Gain(D,a),IV(a)=v=1VDDvlog2DDv
  其中 I V ( a ) IV(a) IV(a)称为属性 a a a的固有值,属性 a a a的可能取值数目越多, I V ( a ) IV(a) IV(a)的值通常会越大。需要注意的是,增益率准则对可取值数目较少的属性有所偏好,比如著名的 C 4.5 C4.5 C4.5决策树算法,是使用了一个启发式方法来选择最优划分属性——先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。

(3)基尼指数

  首先介绍基尼值,数据集 D D D的纯度可以用基尼值 G i n i ( D ) Gini(D) Gini(D)来度量, G i n i ( D ) Gini(D) Gini(D)反映了从数据集 D D D中随机抽取两个样本,其类别标记不一致的概率,因此 G i n i ( D ) Gini(D) Gini(D)越小,数据集 D D D的纯度越高。属性 a a a的基尼指数定义如下,最后也是选择使得划分后基尼指数最小的属性作为最优划分属性,比如著名的 C A R T CART CART决策树。
G i n i ( D ) = ∑ k = 1 n ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 n p k 2 , G i n i _ i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini(D) = \sum\limits_{k = 1}^n {\sum\limits_{k' \ne k} {{p_k}{p_{k'}}} } = 1 - \sum\limits_{k = 1}^n {p_k^2} ,Gini\_index(D,a) = \sum\limits_{v = 1}^V {\frac{{\left| {{D^v}} \right|}}{{\left| D \right|}}} Gini({D^v}) Gini(D)=k=1nk=kpkpk=1k=1npk2,Gini_index(D,a)=v=1VDDvGini(Dv)

4.3 剪枝处理

  剪枝是决策树学习算法对付“过拟合”的主要手段,在决策树学习中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会造成决策树分支过多,以致于把训练集自身的一些特点当作所有数据都具有的一般性质而导致过拟合。因此,可以通过主动去掉一些分支来降低过拟合的风险,常见的基本策略有“预剪枝”和“后剪枝”。

(1)预剪枝

  预剪枝是指在决策树生成过程中,对每个结点在划分前进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点,也就是提前终止某些分支的生长。下面举一个西瓜数据集的例子,以下是数据集详情。

  以下是构造的原始决策树。

  下面我们根据属性“脐部”来进行划分,发现划分前的验证集精度为42.9%,划分后为71.4%,于是用“脐部”进行划分得以确定,同样的方式应用于下面的“色泽”和“根蒂”,如下所示:

(2)后剪枝

  后剪枝是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。

  如上面那棵原始决策树所示,首先考察结点6,如果把该结点替换为叶结点,则验证集精度将从42.9%提升到57.1%,所以进行剪枝,其他结点亦如此,如下所示:

(3)预剪枝与后剪枝的优缺点

  预剪枝是在构建决策树的过程中提前停止生长,即在某个结点上不再继续划分子结点,而是直接将该结点作为叶结点。预剪枝的优点是可以减少决策树的规模,节省计算资源和时间,避免过拟合问题。预剪枝的缺点是可能会过于简化决策树,导致欠拟合问题,即对训练集和测试集都不能很好地拟合,损失了一些有用的信息。预剪枝需要设定一些停止生长的条件,例如结点上的样本数、信息增益、基尼指数等。

  后剪枝是在构建完整的决策树之后,从下往上对决策树进行简化,即将某些子树替换为叶结点或者直接删除。后剪枝的优点是可以保留决策树的完整性,避免欠拟合问题,同时也可以通过简化决策树来减少过拟合问题。后剪枝的缺点是需要额外的计算资源和时间来构建完整的决策树和进行剪枝操作,可能会影响效率。后剪枝需要设定一些评估标准来判断是否进行剪枝,例如验证集上的准确率、误差率等。

4.4 连续与缺失值

(1)连续值处理

  由于连续属性的可取值数目不再有限,因此不能直接根据连续属性的可取值来对结点进行划分,这里可以使用连续属性离散化,最简单的是采用二分法,如下所示:
T a = { a i + a i + 1 2 , 1 ⩽ i ⩽ n − 1 } {T_a} = \{ \frac{{{a^i} + {a^{i + 1}}}}{2},1 \leqslant i \leqslant n - 1\} Ta={2ai+ai+1,1in1}
  把这些中位点作为候选划分点,选取最优的划分点进行样本集合的划分,如果采用信息增益,则如下所示:
G a i n ( D , a ) = max ⁡ t ∈ T a G a i n ( D , a , t ) = max ⁡ t ∈ T a E n t ( D ) − ∑ λ ∈ { − , + } ∣ D t λ ∣ ∣ D ∣ E n t ( D t λ ) Gain(D,a) = \mathop {\max }\limits_{t \in {T_a}} Gain(D,a,t) = \mathop {\max }\limits_{t \in {T_a}} Ent(D) - \sum\limits_{\lambda \in \{ - , + \} } {\frac{{\left| {D_t^\lambda } \right|}}{{\left| D \right|}}Ent(D_t^\lambda )} Gain(D,a)=tTamaxGain(D,a,t)=tTamaxEnt(D)λ{,+}D Dtλ Ent(Dtλ)
  其他常用的连续属性离散化方法还有如下所示:

  • 等宽法:将连续属性的取值范围平均分成n个等宽的区间,每个区间代表一个离散值。这种方法简单易行,但是可能会忽略数据的分布特征,导致区间内的数据差异较大,区间间的数据差异较小。
  • 等频法:将连续属性的取值范围分成n个区间,使得每个区间内包含的数据记录数目相等或接近相等,每个区间代表一个离散值。这种方法可以保证数据的均匀性,但是可能会造成区间的划分不合理,导致一些异常值或边界值被分到同一个区间内。
  • 基于聚类分析的方法:将连续属性按照聚类算法进行聚类,然后根据聚类的结果,将同一聚类的记录合并到同一区间内,每个区间代表一个离散值。这种方法可以根据数据的内在特征进行划分,但是需要事先确定聚类的个数,而且聚类算法本身也有一定的复杂度和不确定性。

(2)缺失值处理

  现实任务中常会遇到不完整样本,即样本的某些属性值缺失,尤其是在属性数目较多的情况下,往往会有大量样本出现缺失值,所以对于这样情况下的决策树,有以下两个问题有待解决:

  • 如何在属性值缺失的情况下进行划分属性选择
  • 给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分

  下面介绍几种常见的解决方法:

  • 忽略缺失值:这种方法是直接删除或忽略含有缺失值的样本,只使用完整的样本来构建和预测决策树。这种方法简单易行,但是可能会造成数据的丢失和偏差,降低决策树的性能和泛化能力。
  • 利用缺失值:这种方法是直接计算不缺失的数据,在选择最优划分属性时,直接采用没有缺失属性样本进行选择,在后续进行子结点划分时,如果遇到某个样本在属性上的取值缺失,则同时将这个样本划入当前所有子结点,也就是让同一个样本以不同的概率划入到不同的子结点中去。
  • 填补缺失值:这种方法是利用已知的数据来估计或推断缺失值,然后用估计或推断出来的值来替代原来的缺失值,使得样本变得完整。这种方法可以保留数据的完整性,但是需要选择合适的填补方法,否则可能会引入误差和噪声,影响决策树的准确性。常用的填补方法有均值、中位数、众数、最近邻、回归、插值等。

4.5 多变量决策树

  若把每个属性视为坐标空间中的一个坐标轴,则 d d d个属性描述的样本就对应了 d d d维空间中的一个数据点,对样本分类则意味着在这个坐标空间中寻找不同类样本之间的分类边界,在这里的分类边界由若干个与坐标轴平行的分段组成,这样的决策树也称为“多变量决策树”,比如下面两个例子:

第一张图片显示不出时显示的文字
第二张图片显示不出时显示的文字

4.6 相关论文

  下面结合近几年的一些论文来具体介绍决策树的应用。

(1)NBDT: Neural-Backed Decision Trees
  神经网络是一种强大的机器学习方法,但它们通常缺乏可解释性,难以在需要准确和合理的预测的领域应用,如金融和医疗。为了解决这个问题,本文提出了一种将决策树嵌入神经网络的方法,称为NBDT,它可以在不改变原网络结构、不降低准确度的前提下增加网络的可解释性。NBDT方法保留原神经网络的特征提取部分结构,只在最后的全连接层上进行决策树嵌入,从而将神经网络的输出转化为一系列可理解的决策规则。NBDT方法可以应用于任何预训练的神经网络,无需重新训练或微调,只需使用一个简单的算法生成决策树结构和阈值。NBDT方法在多个图像分类数据集上进行了实验,证明了它可以保持原网络的准确性,同时提供可视化和可解释的决策过程。本文为提高神经网络的可解释性提供了一种有效和通用的方法。

(2)Decision tree based malware detection using static and dynamic analysis

  本篇论文提出了一种使用决策树对恶意软件进行检测的方法,结合静态和动态分析的特征,如APIs、Summary Information、DLLs和Registry Keys Changed,同时使用Cuckoo sandbox进行动态恶意软件分析,它是一种可定制的、提供高准确度的工具。在实验中使用了2300多个恶意软件样本和1500多个正常软件样本,并将决策树与其他机器学习方法进行比较,如支持向量机、朴素贝叶斯、随机森林等,发现决策树在准确度、召回率、精确度和F1分数等指标上都有优势。

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

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

相关文章

分页查询工具类

package xyz.huanggy.minio.upload.Util; import java.util.ArrayList; import java.util.List; public class PageBean<T> {/*** 功能&#xff1a;分页工具类*/private int pageSize; // 每页记录数private int pageNo; // 当前页private int totalPages; // 总页数priv…

【Redis】Lua快速入门使用

【Redis】Lua快速入门使用 文章目录【Redis】Lua快速入门使用1. 概述2. 数据类型2.1 变量2.2 循环3. 函数4. 条件控制1. 概述 Lua 是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并以源代码形式开放&#xff0c; 其设计目的是为了嵌入应用程序中&#xff0c;从而为应用…

vue+Nodejs+Koa搭建前后端系统(二)--koa-generator创建项目及分析

前言 采用上一篇vueNodejsKoa搭建前后端系统&#xff08;一&#xff09;–简易版创建的项目目录的基础上&#xff0c;创建新的后端服务项目server2使用koa-generator脚手架创建后端项目计算机系统为Windows 10 专业版 小说中&#xff0c;终成眷属一般就结局了&#xff0c;但现…

ESP32在ESP-IDF框架下为LVGL(v8.3)配置SD卡文件系统

踩坑记录 1、如果SD卡曾经做过系统盘&#xff08;比如说&#xff1a;作为树莓派的系统盘&#xff09;&#xff0c;那么要把系统盘的分区合并成一个&#xff08;这个网上有很多教程&#xff09;&#xff0c;并重新格式化&#xff0c;否则实验会失败。 2、并不是买回来的新的SD卡…

基于Vant组件库二次封装组件(TS+Vue3.x环境)

1. 今天的需求是封装一个 Navigation Bar 导航栏组件&#xff0c;目的是给到App几乎所有的页面复用&#xff1a; 2. 因为之前的项目里使用过Vant组件库&#xff0c;笔者第一时间想到了Vant组件库中的 NavBar 组件&#xff0c;和当前App的需求匹配度很高。Vant组件库的 NavBar 组…

压箱底教程分享,手把手教会你如何注册target账号和下单

喜欢套利的朋友肯定都认识target这个平台吧&#xff0c;它是美国热门的综合性海淘网站之一。东哥近日收到私信有朋友向我请教在注册target账号时遇到的一些问题&#xff0c;所以今天东哥想跟大家分享的就是就是target账号注册教程和下单流程&#xff0c;让也想注册target账号的…

软考第五章 无线通信网

无线通信网 无线通信网包括面向语音通信的移动电话系统以及面向数据传输的无线局域网和无线广域网。 WiFI底层是如何传输数据的呢 1.移动通信 1.1 蜂窝通信系统 1980年中期&#xff0c;欧洲和日本都建立了第一代蜂窝移动电话系统。蜂窝网络把一个地理区域划分成若干个称为…

Vue2-黑马(五)

目录&#xff1a; &#xff08;1&#xff09;vue2-组件重用 &#xff08;2&#xff09;vue2-element ui安装 &#xff08;3&#xff09;vue2-ElementUI-table &#xff08;4&#xff09;Element-ui-分页pagination &#xff08;1&#xff09;vue2-组件重用 页面上有很多的…

PyTorch中的符号索引和函数索引用法

Pytorch中很多函数都采用的是函数式索引的思路&#xff0c;而且使用函数式索引对代码可读性会有很大提升。 张量的符号索引 张量也是有序序列&#xff0c;我们可以根据每个元素在系统内的顺序位置&#xff0c;来找出特定的元素&#xff0c;也就是索引。 一维张量的索引 一维…

离线安装JumpServer

官网操作手册&#xff1a; https://docs.jumpserver.org/zh/v3/installation/setup_linux_standalone/offline_install/ 环境要求&#xff1a;&#xff08;内存最小需要4G&#xff09; 架构图 安装部署 1、下载 JumpServer官网下载&#xff1a; https://community.fit2cloud…

定点数的二进制表示形式

定点数的二进制表示形式 文章目录定点数的二进制表示形式什么是定点数表示格式数值范围与分辨率转换python 转换定点数C 双精度浮点数转换为8位和16位定点数C 将定点数转回浮点数测试什么是定点数 在嵌入式系统中&#xff0c;为了降低运算复杂度&#xff0c;通常还会使用定点数…

有趣的数学之回文数

“回文”是指正读反读都能读通的句子&#xff0c;它是古今中外都有的一种修辞方式和文字游戏&#xff0c;如“我为人人&#xff0c;人人为我”等&#xff0c;最有名的莫过于“上海自来水来自海上&#xff0c;人过大佛寺佛大过人 ”。你们知道吗&#xff0c;在数学中也有这样一类…

30多份软件测试报告模板,如何写一份优秀测试报告模板流程

相信很多做软件测试的小伙伴在软件测试后期&#xff0c;都为软件测试报告总结花费了很多的精力&#xff0c;那么如何做好软件测试报告呢&#xff1f;一份优秀的测试报告又包含哪些内容呢&#xff1f; 测试报告的核心要素 一、测试结论 从测试工程师的专业角度分析&#xff0…

pytorch进阶学习(四):使用不同分类模型进行数据训练(alexnet、resnet、vgg等)

课程资源&#xff1a;5、帮各位写好了十多个分类模型&#xff0c;直接运行即可【小学生都会的Pytorch】_哔哩哔哩_bilibili 目录 一、项目介绍 1. 数据集准备 2. 运行CreateDataset.py 3. 运行TrainModal.py 4. 如何切换显卡型号 二、代码 1. CreateDataset.py 2.Train…

如何基于ChatGPT+Avatar搭建24小时无人直播间

0 前言 最近朋友圈以及身边很多朋友都在研究GPT开发&#xff0c;做了各种各样的小工具小Demo&#xff0c;AI工具用起来是真的香&#xff01;在他们的影响下&#xff0c;我也继续捣鼓GPT Demo&#xff0c;希望更多的开发者加入一起多多交流。 上一篇结合即时通 IM SDK捣鼓了一个…

因为这三个面试题,我与字节offer失之交臂

我一个朋友挑战3个月入职字节&#xff0c;一路过关斩将直到终面&#xff0c;着实把我惊了一把&#xff0c;可惜的是&#xff0c;他倒在了最后三个面试题上。 我很讶异&#xff0c;前面不是打得很好吗&#xff1f;怎么会在最后几题上犯错误呢&#xff1f; 朋友说&#xff1a;别…

电瓶隔离器工作原理与发展简史

电瓶隔离器(Battery Isolators)工作原理与发展简史 电池隔离器(英文&#xff1a;Battery Isolators)&#xff0c;又叫双电池隔离器、双电瓶隔离器、双电瓶保护器&#xff0c;还有叫双电池分离器的。 电瓶隔离器其实并没有真正的隔离&#xff0c;负极是始终连在一起的。房车、…

拓展系统命令

文章目录拓展系统命令使用方式拓展系统命令快速运行方法命令 - ZFASTRUN安全运行方法命令 - ZFASTSAFERUN快速运行Query方法命令 - ZFASTQUERY安全运行Query方法 命令 - ZSAFEQUARY防止调试时误将数据提交命令 - ZTRN在Terminal执行SQL语句命令 - ZSQL安全Global命令 - ZSAFEKI…

动态内存管理【上篇】

文章目录⚙️1.为什么存在动态内存分配⚙️2.动态内存函数的介绍&#x1f4ec;2.1. malloc函数&#x1f4ec;2.2. free函数&#x1f4ec;2.3. calloc函数&#x1f4ec;2.4. realloc函数⚙️3.常见的动态内存错误&#x1f512;3.1.对NULL指针的解引用操作&#x1f512;3.2.对动态…

二叉树(OJ)

单值二叉树&#xff08;力扣&#xff09; ---------------------------------------------------哆啦A梦的任意门------------------------------------------------------- 我们来看一下题目的具体要求&#xff1a; 既然我们都学了二叉树了&#xff0c;我们就应该学会如何去…