西瓜书读书笔记整理(五)—— 第四章 决策树

第四章 决策树

    • 4.1 基本流程
      • 4.1.1 什么是决策树算法
      • 4.1.2 决策树学习的目的
      • 4.1.3 决策树学习基本过程
      • 4.1.4 决策树学习基本算法
      • 4.1.5 递归结束的三种情况
    • 4.2 划分选择
      • 4.2.1 信息增益(information gain)—— ID3 决策树学习算法属性划分准则
      • 4.2.2 信息增益率(information gain rate)—— C4.5 决策树学习算法属性划分准则
      • 4.2.3 基尼指数(Gini index)—— CART 决策树学习算法属性划分准则
    • 4.3 剪枝算法
      • 4.3.1 剪枝的目的
      • 4.3.2 预剪枝(prepuning)
      • 4.3.3 后剪枝(postpruning)
    • 4.4 连续与缺失值
      • 4.4.1 连续值处理
      • 4.4.2 缺失值处理
    • 4.5 多变量决策树
    • 4.6 总结

4.1 基本流程

4.1.1 什么是决策树算法

决策树算法 是一种通过构建 树形结构 进行分类和回归的机器学习算法。

4.1.2 决策树学习的目的

决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循简单且直观的 “分而治之”(divide-and-conquer)策略。

4.1.3 决策树学习基本过程

决策树学习的基本过程如下:

  1. 数据准备:首先,收集和准备用于训练的数据集,包含输入特征和对应的标签(类别或数值)。

  2. 特征选择:根据特征的不同属性(离散或连续),选择合适的特征选择方法来找到对分类或回归预测有最大信息增益、基尼系数或均方误差等的特征。这一步骤是决策树学习中最重要的一步。

  3. 数据划分:将数据集按照选定的特征划分为更小的子集。每个子集中的数据都具有相同的特征值,或者至少有类似的特征属性。

  4. 递归构建树:从根节点开始,对每个子集递归地进行特征选择和数据划分,直到满足某个终止条件。终止条件可以是:节点中的数据属于同一类别,节点中的数据样本数量小于某个阈值,或者达到了预先设定的树深度。

  5. 叶节点标记:在构建树的过程中,每个叶节点都对应着一个类别标签或回归数值,这些标签或数值由训练数据决定。

  6. 剪枝(可选):为了避免过拟合,可以对构建完成的决策树进行剪枝,即去掉一些分支,使得树的结构更简单,同时也可以提高泛化能力。

  7. 预测:使用构建好的决策树对新的输入数据进行预测。从根节点开始,根据输入数据的特征值逐步遍历决策树的分支,直到到达叶节点,然后输出叶节点的类别标签或回归数值作为预测结果。

  8. 模型评估:使用测试数据集来评估决策树的性能,通常使用准确率、召回率、F1 分数等指标来评估分类问题的性能,均方误差等指标来评估回归问题的性能。

4.1.4 决策树学习基本算法

原书第 74 页图 4.2

在这里插入图片描述

定义一个函数 TreeGenerate(D,A) 并且这是一个递归算法,因此算法伪代码最后将会重新调用本方法,直到所有的特种特征用尽为止。

面试常常问的可能是其中某一个环节、或者是大体概述整个过程。

4.1.5 递归结束的三种情况

  1. 当前结点包含的样本全属于同一类别,无需划分;
  2. 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分;
  3. 当前结点包含的样本集合为空,无法划分。

4.2 划分选择

如何选择最优划分属性 (选择属性问题)

4.2.1 信息增益(information gain)—— ID3 决策树学习算法属性划分准则

“信息熵” (information entropy)是度量样本集合纯度最常用的一种指标。

假定当前样本集合 D D D 中第 k k k 类样本所占的比例为 p k ( k = 1 , 2 , . . . , ∣ Y ∣ ) p_k(k=1,2,...,|\mathcal{Y}|) pk(k=1,2,...,Y),则 D D D 的信息熵定义为

Ent ⁡ ( D ) = − ∑ k = 1 ∣ Y ∣ p k log ⁡ 2 p k . (4.1) \operatorname{Ent}(D)=-\sum_{k=1}^{|\mathcal{Y}|} p_k \log _2 p_k. \tag{4.1} Ent(D)=k=1Ypklog2pk.(4.1)

Ent ⁡ ( D ) \operatorname{Ent}(D) Ent(D) 的值越小,则 D D D 的纯度越高。

假设离散属性 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。我们可根据式 ( 4.1 ) (4.1) (4.1) 计算出 D v D^v Dv 的信息熵,再考虑到不同的分支结点所包含的样本数不同,给分支结点赋予权重 ∣ D v ∣ / ∣ D ∣ |D^v|/|D| Dv∣/∣D,即样本数越多的分支结点的影响越大,于是可计算出用属性 a a a 对样本集 D D D 进行划分所获得的 “信息增益” (information gain)

Gain ⁡ ( D , a ) = Ent ⁡ ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ Ent ⁡ ( D v ) (4.2) \operatorname{Gain}(D, a)=\operatorname{Ent}(D)-\sum_{v=1}^V \frac{\left|D^v\right|}{|D|} \operatorname{Ent}\left(D^v\right) \tag{4.2} Gain(D,a)=Ent(D)v=1VDDvEnt(Dv)(4.2)

一般而言,信息增益越大,则意味着使用属性 a a a 进行划分所获得的 “纯度提升” 越大。因此,我们用信息增益来进行决策树的划分属性选择。著名的 ID3 决策树学习算法就是以信息增益为准则来选择划分属性。

4.2.2 信息增益率(information gain rate)—— C4.5 决策树学习算法属性划分准则

实际上,信息增益准则对可取值数目较多的属性有所偏好 ,为了减少这种偏好可能带来的不利影响,著名的 C4.5 决策树算法不直接使用信息增益,而使用 “增益率(gain rate)” 来选择最优划分属性。

Gain_ratio ⁡ ( D , a ) = Gain ⁡ ( D , a ) IV ⁡ ( a ) (4.3) \operatorname{Gain\_ ratio}(D, a)=\frac{\operatorname{Gain}(D, a)}{\operatorname{IV}(a)} \tag{4.3} Gain_ratio(D,a)=IV(a)Gain(D,a)(4.3)

其中,

IV ⁡ ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log ⁡ 2 ∣ D v ∣ ∣ D ∣ (4.4) \operatorname{IV}(a)=-\sum_{v=1}^V \frac{\left|D^v\right|}{|D|} \log _2 \frac{\left|D^v\right|}{|D|} \tag{4.4} IV(a)=v=1VDDvlog2DDv(4.4)

称为属性 a a a 的 “固有值” (intrinsic value)。属性 a a a 的可能性取值数目越多(即 V V V 越大),则 I V ( a ) IV(a) IV(a) 的值通常会越大。

需注意的是,增益率准则对可取值数目较少的属性有所偏好,因此,C4.5 算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。

4.2.3 基尼指数(Gini index)—— CART 决策树学习算法属性划分准则

CART 决策树使用 “基尼系数” 来选择划分属性。

Gini ⁡ ( D ) = ∑ k = 1 ∣ Y ∣ ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 ∣ Y ∣ p k 2 . (4.5) \begin{aligned} \operatorname{Gini}(D) & =\sum_{k=1}^{|\mathcal{Y}|} \sum_{k^{\prime} \neq k} p_k p_{k^{\prime}} \\ & =1-\sum_{k=1}^{|\mathcal{Y}|} p_k^2 . \end{aligned} \tag{4.5} Gini(D)=k=1Yk=kpkpk=1k=1Ypk2.(4.5)

直观来说, 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 的基尼指数定义为:

Gini_index ⁡ ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ Gini ⁡ ( D v ) (4.6) \operatorname{Gini\_ index}(D, a)=\sum_{v=1}^V \frac{\left|D^v\right|}{|D|} \operatorname{Gini}\left(D^v\right) \tag{4.6} Gini_index(D,a)=v=1VDDvGini(Dv)(4.6)

于是,我们在候选属性集 A A A 中,选择那个使得划分后基尼指数最小的属性作为最优划分属性,即 a ∗ = arg min ⁡ a ∈ A Gini_index ⁡ ( D , a ) a_*=\underset{a \in A}\argmin \operatorname{Gini\_index}(D, a) a=aAargminGini_index(D,a)

4.3 剪枝算法

人类的局限性导致人类在解决一个问题的同时,往往会制造新的问题。

4.3.1 剪枝的目的

剪枝(pruning)是决策树学习算法对付 “过拟合” 的主要手段。

4.3.2 预剪枝(prepuning)

预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。

4.3.3 后剪枝(postpruning)

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

4.4 连续与缺失值

4.4.1 连续值处理

决策树通常通过二分法来处理连续值特征。在构建决策树的过程中,对于连续值特征,需要选择一个阈值来将其划分为两个子集。以下是处理连续值特征的一般步骤:

  1. 特征选择:从所有特征中选择一个连续值特征作为当前节点的划分依据。通常,使用特征选择方法(例如信息增益、信息增益比、基尼系数等)来选择最优的特征。

  2. 阈值选择:对于选定的连续值特征,选择一个合适的阈值来将其划分为两个子集。通常的做法是遍历所有可能的阈值,并选择使得划分后的子集使得目标函数最优的阈值。

  3. 样本划分:使用选择的阈值,将训练数据中的连续值特征划分为两个子集,一个子集包含小于等于阈值的样本,另一个子集包含大于阈值的样本。

  4. 递归构建:对于每个子集,递归地重复步骤1至步骤3,直到满足停止条件(例如达到预定深度、样本数量少于阈值等)。

  5. 叶节点标签确定:对于每个划分后的子集,决定叶节点的标签。在分类问题中,通常选择子集中最频繁出现的类别作为叶节点的标签。在回归问题中,可以选择子集中样本标签的平均值作为叶节点标签。

需要注意的是,决策树的构建过程中,连续值特征的选择和阈值的确定是至关重要的,直接影响到决策树的性能和泛化能力。因此,对于连续值特征,特征选择和阈值的选择是决策树算法中的重要环节。在实际应用中,可以使用不同的特征选择方法和阈值搜索策略,或者采用其他预处理技术(如离散化)来更好地处理连续值特征。

4.4.2 缺失值处理

决策树在处理缺失值时有几种常见的策略:

  1. 缺失值剔除:最简单的方法是直接删除带有缺失值的样本。这样做可以简化问题,但可能会导致数据的信息损失,特别是当缺失值的数量较大时。

  2. 缺失值填充:另一种常见的方法是填充缺失值,使得样本在该特征上具有有效的值。填充方法可以采用均值、中位数、众数等简单的统计量,或者使用其他预测模型来估计缺失值。

  3. 缺失值作为单独类别:对于分类问题,可以将缺失值视为一个单独的类别,让决策树根据数据的其他特征来判断样本是否属于缺失值类别。

  4. 缺失值分支:在决策树的构建过程中,如果遇到某个样本在某个特征上缺失值,可以考虑将其划分到不同的分支中。这样,在测试时,如果样本的该特征缺失,就可以根据不同分支的情况来进行预测。

  5. 缺失值处理算法:一些特定的决策树算法或扩展版本(如XGBoost)具有内置的缺失值处理能力,可以自动处理缺失值并在构建树时考虑缺失值的影响。

需要根据具体情况选择合适的缺失值处理方法。对于某些数据集,直接删除缺失值可能是合理的选择,而在其他情况下,填充缺失值或将其视为独立类别可能更为适用。重要的是在处理缺失值时要注意不引入额外的偏见或错误,并考虑缺失值对模型性能的影响。

4.5 多变量决策树

多变量决策树(Multivariate Decision Trees)是对传统决策树算法的一种扩展,旨在处理多个特征之间的相互作用和关联。传统的决策树算法(如ID3、C4.5、CART)每次只考虑一个特征来进行划分,因此可能无法充分捕捉多个特征之间的复杂关系。

多变量决策树通过同时考虑多个特征来进行划分,以更好地建模多个特征之间的交互作用。在构建每个节点的决策条件时,它会考虑多个特征的联合情况,而不仅仅是单个特征的划分。这样可以更好地处理特征之间的相关性和非线性关系,提高模型的表现和泛化能力。

多变量决策树的构建过程相对复杂,需要考虑更多的特征组合和划分方式。通常,多变量决策树的构建过程可以通过以下几种方法来实现:

  1. 多变量划分准则:传统决策树使用单变量划分准则(如信息增益、基尼系数)来选择最优划分特征。而多变量决策树可以使用多变量划分准则来选择多个特征的组合作为划分依据。

  2. 贪心算法:多变量决策树的构建可以采用贪心算法,每次选择能够最大程度提升整体模型性能的多变量划分。

  3. 剪枝策略:在多变量决策树的构建过程中,为了防止过拟合,可以采用剪枝策略来简化模型。

  4. 集成学习:多变量决策树也可以与集成学习方法(如随机森林、梯度提升树)相结合,进一步提高模型的性能。

需要注意的是,多变量决策树的构建和优化相对复杂,可能需要更多的计算资源和时间。在实际应用中,根据数据集的大小和复杂性,需要权衡不同决策树算法的优势和劣势,选择合适的方法来构建和训练多变量决策树模型。

4.6 总结

决策树算法是一种非常经典、可解释性强的算法,值得好好学习,并把这个作为其他更加复杂、更加高效的算法的学习基础。

Smileyan
2023.08.06 21:54

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

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

相关文章

JUC之线程中断与LockSupport

什么是中断 首先一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。其次在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中…

力扣 -- 467. 环绕字符串中唯一的子字符串

一、题目 二、解题步骤 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码 class Solution { public:int findSubstringInWraproundString(string s) {int ns.size();vector<int> dp(n,1);int re…

Godot 4 源码分析 - 增加格式化字符串功能

Godot 4的主要字符串类型为String&#xff0c;已经设计得比较完善了&#xff0c;但有一个问题&#xff0c;格式化这块没怎么考虑。 String中有一个format函数&#xff0c;但这个函数只有两个参数&#xff0c;这咋用&#xff1f; String String::format(const Variant &va…

vue 新学习 06 js的prototype ,export暴露,vue组件,一个重要的内置关系

部分内容参考的这篇文章 原文链接&#xff1a;https://blog.csdn.net/harry5508/article/details/84025146 写的很好。 01 在js中&#xff1a; 原型链 注意&#xff1a;构造函数.prototype实例化对象.__proto__&#xff0c;都是指向函数的原型。 export&#xff1a; -export用…

Popover气泡卡片(antd-design组件库)简单使用

1.Popover气泡卡片 点击/鼠标移入元素&#xff0c;弹出气泡式的卡片浮层。 2.何时使用 当目标元素有进一步的描述和相关操作时&#xff0c;可以收纳到卡片中&#xff0c;根据用户的操作行为进行展现。 和 Tooltip 的区别是&#xff0c;用户可以对浮层上的元素进行操作&#xff…

项目实战 — 消息队列(5){统一硬盘操作}

前面已经使用数据库管理了交换机、绑定、队列&#xff0c;然后又使用了数据文件管理了消息。 那么&#xff0c;这里就创建一个类&#xff0c;讲之前的两个部分整合起来&#xff0c;对上层提供统一的一套接口&#xff0c;表示硬盘上存储的所有的类的信息。 /* * 用这个类来管理…

【Linux】Linux下git的使用

文章目录 一、什么是git二、git发展史三、Gitee仓库的创建1.新建仓库2.复制仓库链接3.在命令行克隆仓库3.1仓库里的.gitignore是什么3.2仓库里的git是什么 三、git的基本使用1.将克隆仓库的新增文件添加到暂存区(本地仓库)2.将暂存区的文件添加到.git仓库中3.将.git仓库中的变化…

Flink正常消费一段时间后,大量反压,看着像卡住了,但又没有报错。

文章目录 前言一、原因分析二、解决方案 前言 前面我也有提到&#xff0c;发现flink运行一段时间后&#xff0c;不再继续消费的问题。这个问题困扰了我非常久&#xff0c;一开始也很迷茫。又因为比较忙&#xff0c;所以一直没有时间能够去寻找答案&#xff0c;只是通过每天重启…

如何设计一个自动化测试框架

在进行自动化框架设计之前我们先来看两个问题&#xff0c;什么是自动化框架&#xff0c;设计的时候应该注意什么原则&#xff0c;然后该怎么做&#xff1f;本文会以一个web端的UI自动化测试框架设计为例 Python自动化测试&#xff1a;2023最新合集Python自动化测试开发框架【全…

部署Tomcat和jpress应用

静态页面&#xff1a;静态页面是指在服务器上提前生成好的HTML文件&#xff0c;每次用户请求时直接返回给用户。静态页面的内容是固定的&#xff0c;不会根据用户的请求或其他条件进行变化。静态页面的优点是加载速度快&#xff0c;对服务器资源要求较低&#xff0c;但缺点是无…

fishing之踩坑篇捕获数据不齐全

文章目录 一、问题记录二、解决方法三、更新钓鱼模板四、进行点击邮件五、查看仪表盘免责声明 一、问题记录 通过点击邮件内的链接&#xff0c;提交数据&#xff0c;但是只记录密码&#xff0c;无法记录username 二、解决方法 对于需要被捕获的表单数据&#xff0c;除了inp…

faac内存开销较大,为方便嵌入式设备使用进行优化(valgrind使用)

faac内存开销较大&#xff0c;为方便嵌入式设备使用进行优化&#xff0c;在github上提了issues但是没人理我&#xff0c;所以就搞一份代码自己玩吧。 基于faac_1_30版本&#xff0c;原工程https://github.com/knik0/faac faac内存优化: faac内存开销较大&#xff0c;为方便嵌入…

自然语言处理学习笔记(三)————HanLP安装与使用

目录 1.HanLP安装 2.HanLP使用 &#xff08;1&#xff09;预下载 &#xff08;2&#xff09;测试 &#xff08;3&#xff09;命令行 &#xff08;4&#xff09;测试样例 3.pyhanlp可视化 4. HanLP词性表 1.HanLP安装 HanLP的 Python接口由 pyhanlp包提供&#xff0c;其安装…

Hyper实现git bash在windows环境下多tab窗口显示

1.电脑上安装有git bash 下载链接&#xff1a;https://gitforwindows.org/ 安装Hyper 下载链接:官网 https://hyper.is/ 或者在百度云盘下载&#xff1a; https://pan.baidu.com/s/1BVjzlK0s4SgAbQgsiK1Eow 提取码&#xff1a;0r1f 设置 打开Hyper&#xff0c;依次点左上角-&g…

从特斯拉FSD v11.4.6,看FSD入华

从特斯拉FSD v11.4.6&#xff0c;看FSD入华 1. 芝加哥城区a. 亮点b. 问题 2. 小镇中心a. 亮点b. 问题 3. FSD入华a. 技术路线b. 场景 4. 参考视频 FSD最近更新了v11.4.6&#xff0c;本文根据2个FSD城区测试视频&#xff0c;一起看一下有哪些亮点和问题。 FSD入华的消息也甚嚣尘…

图像快速傅里叶变换的工业应用案例简介:图像自相关,背景纹理去除,旋转矫正,划痕检测

快速傅里叶变换是非常重要的数学分析工具&#xff0c;同时也是一种非常重要的信号处理方法。 下面借助Halcon商业图像处理库&#xff0c;介绍些工业应用案例&#xff0c;我们可以通过案例理解图像快速傅里叶变换的一些应用场景。 案例1&#xff1a;图像自相关性确定芯片间距 …

springCache-缓存

SpringCache 简介&#xff1a;是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;底层可以切换不同的cache的实现&#xff0c;具体是通过CacheManager接口实现 使用springcache,根据实现的缓存技术&#xff0c;如使用的redis,需要导入redis的依赖包 基于map缓存 …

AI编程工具Copilot与Codeium的实测对比

csdn原创谢绝转载 简介 现在没有AI编程工具&#xff0c;效率会打一个折扣&#xff0c;如果还没有&#xff0c;赶紧装起来&#xff0e; GitHub Copilot是OpenAi与github等共同开发的的AI辅助编程工具&#xff0c;基于ChatGPT驱动&#xff0c;功能强大&#xff0c;这个没人怀疑…

【100天精通python】Day27:文件与IO操作_CSV文件处理

目录 专栏导读 1. CSV文件格式简介 2 csv模块的使用方法 3 读写CSV文件的示例 3.1 读取CSV文件示例 3.2 写入CSV文件示例 4 CSV文件的常用数据处理 4.1 读取CSV文件的特定列 4.2 读取CSV文件的特定行 5 csv 文件的特殊处理 5.1 处理包含逗号、换行符、引号的字段 5.…

MySql之日志

Buffer Pool Buffer Pool &#xff08;缓冲池&#xff09;是 InnoDB 存储引擎中非常重要的内存结构&#xff0c;顾名思义&#xff0c;缓冲池其实就是类似 Redis 一样的作用&#xff0c;起到一个缓存的作用&#xff0c;因为我们都知道 MySQL 的数据最终是存储在磁盘中的&#xf…