模式识别与机器学习(八):决策树

news2025/1/15 6:28:14

1.原理

决策树(Decision Tree),它是一种以树形数据结构来展示决策规则和分类结果的模型,作为一种归纳学习算法,其重点是将看似无序、杂乱的已知数据,通过某种技术手段将它们转化成可以预测未知数据的树状模型,每一条从根结点(对最终分类结果贡献最大的属性)到叶子结点(最终分类结果)的路径都代表一条决策的规则。

一般,一棵决策树包含一个根节点,若干个内部结点和若干个叶结点。

叶结点对应于决策结果,其他每个结点对应于一个属性测试。每个结点包含的样本集合根据属性测试的结果划分到子结点中,根结点包含样本全集,从根结点到每个叶结点的路径对应了一个判定的测试序列。决策树学习的目的是产生一棵泛化能力强,即处理未见示例强的决策树。

使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

1.步骤

至于如何生成决策树,具体步骤如下图:
在这里插入图片描述

上图就是在生成决策树的过程中经历的步骤。详细步骤如下:

(1).首先从开始位置,将所有数据划分到一个节点,即根节点。

(2).然后经历橙色的两个步骤,橙色的表示判断条件:

若数据为空集,跳出循环。如果该节点是根节点,返回null;如果该节点是中间节点,将该节点标记为训练数据中类别最多的类

若样本都属于同一类,跳出循环,节点标记为该类别;

(3).如果经过橙色标记的判断条件都没有跳出循环,则考虑对该节点进行划分。既然是算法,则不能随意的进行划分,要讲究效率和精度,选择当前条件下的最优属性划分(什么是最优属性,这是决策树的重点,后面会详细解释)

(4).经历上步骤划分后,生成新的节点,然后循环判断条件,不断生成新的分支节点,直到所有节点都跳出循环。

(5).结束。这样便会生成一棵决策树。

2.划分选择

了解了其步骤后,便明白了其关键便是如何寻找最优属性,其选择方法一般有三种。

(1).信息增益

通过方程 Gain ⁡ ( D , a ) = Ent ⁡ ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ Ent ⁡ ( D v ) \operatorname{Gain}(D,a)\mathrm{=}\operatorname{Ent}(D)-\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}\operatorname{Ent}(D^{v}) Gain(D,a)=Ent(D)v=1VDDvEnt(Dv)

来计算每个属性的信息增益,最优属性即为信息增益最大的属性。 E n t ( D ) = − ∑ k = 1 ∣ γ ∣ p k log ⁡ 2 p k \begin{aligned}\mathrm{Ent}(D)&=-\sum_{k=1}^{|\gamma|}p_k\log_2p_k\end{aligned} Ent(D)=k=1γpklog2pk
,Ent(D)即为样本D的信息熵,由该公式计算可得。

(2).信息增益率

信息增益准则对可取值数目较多的属性有所偏好,增益率定义如下:
G a i n _ r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) \mathrm{Gain\_ratio}(D,a)=\frac{\mathrm{Gain}(D,a)}{\mathrm{IV}(a)} Gain_ratio(D,a)=IV(a)Gain(D,a)

其中 I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log ⁡ 2 ∣ D v ∣ ∣ D ∣ \begin{aligned}\mathrm{IV}(a)=&-\sum_{v=1}^V\frac{|D^v|}{|D|}\log_2\frac{|D^v|}{|D|}\end{aligned} IV(a)=v=1VDDvlog2DDv称为属性a的固有值。该划分算法先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的属性。

(3).基尼指数

数据D的纯度可用基尼值来度量,即用如下公式来计算:
G i n i ( D ) = ∑ k = 1 ∣ γ ∣ ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 ∣ γ ∣ p k 2 \mathrm{Gini}(D){=\sum_{k=1}^{|\gamma|}\sum_{k^{\prime}\neq k}p_kp_{k^{\prime}}=1-\sum_{k=1}^{|\gamma|}p_k^2} Gini(D)=k=1γk=kpkpk=1k=1γpk2

Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,Gini(D)越小,表示数据集D的纯度越高。而属性a的基尼指数则是根据这个公式推广而得,具体形式如下: G i n i _ i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) \mathrm{Gini\_index}(D,a)=\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}\mathrm{Gini}(D^{v}) Gini_index(D,a)=v=1VDDvGini(Dv)
。在候选属性集合A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性。

3.剪枝

剪枝顾名思义就是给决策树 “去掉” 一些判断分支,同时在剩下的树结构下仍然能得到不错的结果。之所以进行剪枝,是为了防止或减少 “过拟合现象” 的发生,是决策树具有更好的泛化能力。

剪枝主要分为两种方法,其一是预剪枝,即在决策树构造时就进行剪枝。在决策树构造过程中,对节点进行评估,如果对其划分并不能再验证集中提高准确性,那么该节点就不要继续王下划分。这时就会把当前节点作为叶节点。其二是后剪枝,即在生成决策树之后再剪枝。通常会从决策树的叶节点开始,逐层向上对每个节点进行评估。如果剪掉该节点,带来的验证集中准确性差别不大或有明显提升,则可以对它进行剪枝,用叶子节点来代填该节点。

2.代码

在scikit-learn中,你可以通过设置DecisionTreeClassifier的参数来进行决策树的剪枝,以防止过拟合。以下是一些常用的参数:

max_depth:决策树的最大深度。这可以防止树过于复杂,导致过拟合。

min_samples_split:分割内部节点所需的最少样本数。如果一个节点的样本数少于这个值,那么这个节点就不会被分割。

min_samples_leaf:在叶节点处需要的最小样本数。这可以防止创建样本数过少的叶节点。

max_leaf_nodes:最大叶节点数量。这是另一种控制树大小的方法。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建决策树分类器,并设置剪枝参数
clf = DecisionTreeClassifier(max_depth=3, min_samples_split=10, min_samples_leaf=5, max_leaf_nodes=10)

# 训练模型
clf.fit(X_train, y_train)

# 预测测试集
y_pred = clf.predict(X_test)

# 打印预测结果
print(y_pred)

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

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

相关文章

使用vue-qr,报错in ./node_modules/vue-qr/dist/vue-qr.js

找到node_modules—>vue-qr/dist/vue-qr.js文件,搜…e,将…去掉,然后重新运行项目。

【RabbitMQ】RabbitMQ详解(二)

RabbitMQ详解 死信队列死信来源消息TTL过期队列达到最大长度消息被拒绝 RabbitMQ延迟队列TTL的两种设置队列设置TTL消息设置TTL 整合SrpingBoot队列TTL延时队列TTL优化Rabbtimq插件实现延迟队列 死信队列 先从概念解释上搞清楚这个定义,死信,顾名思义就…

使用keytool查看Android APK签名

文章目录 一、找到JDK位置二、使用方法2.1 打开windows命令行工具2.2 查看签名 三、如何给APK做系统签名呢? 一、找到JDK位置 安卓AS之后,可选择继续安装JDK,如本文使用amazon版本默认位置:C:\Users\66176.jdks\corretto-1.8.0_342可通过自…

数据预处理:多重共线性_检测和解决办法

文章目录 1.多重共线性简介(Collinearity and Multicollinearity)1.1 多重共线性的后果1.2 处理多重共线性问题的方法 2. 设置2.1 导入库2.2 数据集特征波士顿房价BMI 数据集 2.3 导入数据 3. 相关矩阵3.1 聚类图 4. 方差膨胀因子4.1 两种多重共线性4.2 …

HackTheBox - Medium - Linux - Format

Format Format 是一种中等难度的 Linux 机器,它突出显示了由解决方案的结构方式引起的安全问题。立足点涉及PHP源代码审查,发现和利用本地文件读/写漏洞,并利用Nginx中的错误配置在Redis Unix套接字上执行命令。横向移动包括浏览 Redis 数据…

指针的含义

我们还取前面图片解释的道理: pa表示的意思就是这个地址,并不会显示出10这个数字 *pa就是指针,最后指向了a10,所以他最后程序输出是10 &pa这个含义就是取pa的地址,那么pa是一个虚拟的地址,只是简单的…

7种常见的网络安全设备及其功能

网络安全设备在现代网络环境中起着至关重要的作用,帮助保护个人和组织免受恶意攻击。本文将介绍7种常见的网络安全设备,包括防火墙、入侵检测系统、反病毒软件、数据加密设备、虚拟私人网络、安全信息和事件管理系统以及网络访问控制设备,并详…

Apache RocketMQ,构建云原生统一消息引擎

本文整理于 2023 年云栖大会林清山带来的主题演讲《Apache RocketMQ 云原生统一消息引擎》 演讲嘉宾: 林清山(花名:隆基),Apache RocketMQ 联合创始人,阿里云资深技术专家,阿里云消息产品线负…

postgresql vacuum流程分析

概述 VACUUM是postgresql MVCC机制不可分割的组成部分。 postgresql在管理同一个元组的多个版本时,采取在堆表页面上从老版本到新版本放置元组的方法,每个元组都记录了xmax和xmin用于判断其可见性。这样的好处是(1)在索引键没有…

RasaGPT对话系统的工作原理

RasaGPT 结合了 Rasa 和 Langchain 这 2 个开源项目,当超出 Rasa 现有意图(out_of_scope)的时候,就会执行 ActionGPTFallback,本质上就是利用 Langchain 做了一个 RAG,调用 LLM API。RasaGPT 涉及的技术栈比较多而复杂&#xff0c…

OpenCV | 霍夫变换:以车道线检测为例

霍夫变换 霍夫变换只能灰度图,彩色图会报错 lines cv2.HoughLinesP(edge_img,1,np.pi/180,15,minLineLength40,maxLineGap20) 参数1:要检测的图片矩阵参数2:距离r的精度,值越大,考虑越多的线参数3:距离…

[python]用python实现对arxml文件的操作

目录 关键词平台说明一、背景二、方法2.1 库2.2 code 关键词 python、excel、DBC、openpyxl 平台说明 项目Valuepython版本3.6 一、背景 有时候需要批量处理arxml文件(ARXML 文件符合 AUTOSAR 4.0 标准),但是工作量太大,阔以考虑用python。 二、方…

2023尚硅谷大数据项目之数据治理考评平台

教程下载:https://download.csdn.net/download/m0_66047725/88655186 【资源目录】: ├──1.笔记 | ├──课堂随笔.pptx 288.70kb | ├──尚硅谷大数据技术之数据治理考评平台完整V1.2.0.docx 1.87M | ├──数据治理总结.mmap 133.77kb | ├──自测题1.txt …

科研学习|论文解读——面向电商内容安全风险管控的协同过滤推荐算法研究

【论文完整内容详见知网链接】: 面向电商内容安全风险管控的协同过滤推荐算法研究 - 中国知网 (cnki.net) 面向电商内容安全风险管控的协同过滤推荐算法研究* 摘 要:[目的/意义]随着电商平台商家入驻要求降低以及商品上线审核流程简化,内容安…

冒泡排序之C++实现

描述 冒泡排序算法是一种简单的排序算法,它通过将相邻的元素进行比较并交换位置来实现排序。冒泡排序的基本思想是,每一轮将未排序部分的最大元素逐个向右移动到已排序部分的最右边,直到所有元素都按照从小到大的顺序排列。 冒泡排序的算法…

LangChain 31 模块复用Prompt templates 提示词模板

LangChain系列文章 LangChain 实现给动物取名字,LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索I…

HarmonyOS - 鸿蒙开发入门

文章目录 HarmonyOS核心资源特性:全场景终端HarmonyOS 版本 HarmonyOS 和 OpenHarmony教程资源开发环境开发工具 - DevEco开发语言 - ArkTS核心框架 - ArkUI 考证 HarmonyOS 开发交流秋秋群:23458659,V : ez-code,期待交流和合作 …

Arduino上U8g2库显示中文的经历

u8g2自带很多中文库&#xff1b;但是向u8g2_font_wqy12_t_chinese3 比较全的应该是u8g2_font_wqy12_t_gb2312 这个&#xff0c;只是我还没有调用成功 这个库&#xff0c;中文就显示不全&#xff1b;有些没有定义&#xff0c;如百家姓 #include <Arduino.h> #include <…

【微服务】:微服务最佳实践

关键需求 最大限度地提高团队的自主性&#xff1a;创建一个团队可以完成更多工作而不必与其他团队协调的环境。 优化开发速度&#xff1a;硬件便宜&#xff0c;人不是。使团队能够轻松快捷地构建强大的服务。 关注自动化&#xff1a;人们犯错误。更多的系统操作也意味着更多的…

大端和小端传输字节序

大端和小端传输字节序 大端和小端一、最高有效位、最低有效位1.MSB(Most significant Bit)最高有效位2.LSB(Least Significant Bit)最低有效位 二、内存地址三、大端和小端四、网络字节序和主机字节序五、C#位操作符六、C#中关于大端和小端的转换七、关于负数八、关于汉字编码以…