决策树算法:它们无处不在【01/2】

news2025/1/14 1:12:30

Exploring Natural Language Processing with Hugging Face Transformers

一、说明

        本文首先叙述决策树的概念,进而展开决策树的原理,以及支持理论信息熵,对决策树进行全面描述,如果 您想知道的有关决策树、理论和实施的所有信息,请看此文。

二、介绍

        “两条路在一片树林里分道扬镳,我走了一条人迹罕至的路,这让一切都变得不同了。

        罗伯特·弗罗斯特(Robert Frost)的诗《未走的路》(The Road Not Take)就是这样一句话。这首诗雄辩地描述了一个人的决定如何对他们的生活产生持久的影响。决定不是我们生活中不可或缺的一部分吗?我们走的道路和做出的决定极大地影响着我们的命运和身份。

        决策树算法就像这首诗,展示了决策如何在树中创建新分支;同样,一个小决定可以创造不同的路线并改变我们的生活。

 

        对决策树最基本的理解是,它是一个嵌套的if-else语句的巨大结构。

        这是一个包含 6 行和 3 列的小型分类数据集,我们将尝试使用嵌套的 if-else 语句来解决,如下所示:

 

g = input("Enter gender(M/F): ")
print("Occupation: ")
print("1-> Student")
print("2-> Programmer")
o = int(input("Enter occupation: " ))
if g=='F':
    if o==1:
        print('Fortnite')
    elif o==2:
        print('GitHub')
elif g=='M':
    if o==1:
        print('Minecraft')
    elif o==2:
        print('VS Code')

        我问自己的第一个问题是,如果决策树只是用于解决问题的if-else语句的集合,那么为什么我们需要决策树?答案是:

  1. if-else 语句可能很脆弱,这意味着它们很容易受到数据中微小变化的影响。另一方面,决策树对数据的变化更可靠。
  2. if-else 语句的可扩展性不如决策树,这意味着它们在大型数据集上的训练和预测速度可能很慢。
  3. if-else 语句的解释和调试可能具有挑战性。另一方面,决策树是表示决策规则的一种更直观、更直观的方法。

从图表上看,这将如下所示:

 

2.1 与树数据结构相关的基本术语如下:

  • 根节点:根节点是最顶层的节点。它是产生决策树的起始节点。
  • 父节点:父节点是具有一个或多个子节点的节点。
  • 子节点:子节点是从父节点分支出来的节点。父节点是做出决策的节点,子节点是表示该决策的可能结果的节点。
  • 叶节点:决策树中的叶节点是没有任何子节点的节点。叶节点表示决策树的终端节点,它们包含模型的最终预测。
  • 分裂:将节点划分为两个或多个子节点的过程。
  • 修剪: 修剪与拆分相反。删除决策节点的子节点的过程称为修剪。

2.2 什么是决策树算法?

决策树是一种监督学习算法,它使用树状结构根据输入数据做出决策。它将数据划分为分支,并将结果分配给叶节点。

决策树用于分类和回归任务,提供高效、准确和易于理解的模型。

不同的库使用不同的算法来执行决策树,但在本文中,我们将讨论 CART:分类和回归树

CART 是一种递归算法,它从树的根节点开始,并根据单个特征的值将数据拆分为两个或多个子集。重复该过程,直到每个子集都是纯的,这意味着子组中的所有数据点都属于同一类。
购物车使用各种杂质度量,例如熵和基尼杂质,来决定在每个节点上拆分哪个特征。

从数学上讲,决策树使用平行于任何一个轴的超平面将我们的坐标系切割成超长方体。

2.3 为什么我们在机器学习中需要决策树?

  1. 易于理解和解释,这有助于开发人员调试和理解模型。
  2. 抗噪声意味着决策树可以相对较好地处理噪声数据,使其成为数据不完全干净的问题的不错选择。
  3. 决策树训练高效且灵活。
  4. 决策树广泛用于信用评分、欺诈检测、医疗诊断、客户细分等。

三、与 CART 算法相关的一些关键概念是:

  1. 信息获取
  2. 基尼指数

熵,信息增益和基尼杂质是决策树算法中的三个基本概念。它们用于测量数据的杂质并确定将数据拆分到哪个特征上。决策树算法用于使用这些概念构建准确可靠的模型。

3.1. 熵:

熵是不纯或无序的量度。简单来说,它是随机性的度量。

熵帮助我们识别预测目标变量的最重要特征。它有助于减少数据的杂质,从而使模型更加准确。熵的公式如下: 

 

  • P 是:是的概率
  • P 否:否的概率
  • E: 

熵的一些基本观察如下:

  1. 对于 2 类问题(“是”或“否”/“真”或“假”),最小熵为 0,最大熵为 1。
  2. 对于两个以上的类,最小熵为 0,但最大值可以大于 1。
  3. 杂质为0的数据集对学习没有帮助,但一半“是”和一半“否”熵的数据集将是1,这样的数据集适合学习。

3.2. 信息获取:

信息增益有助于算法决定应选择哪个属性作为决策节点或拆分数据哪个特征。 它是衡量拆分质量的指标。信息增益是通过拆分特定特征上的节点来实现的熵减少的度量。

构建决策树就是要找到一个返回最高信息增益的属性。具有高信息增益的特征是一个很好的拆分器,因为它将导致更纯的节点。信息增益的公式如下:

 
  • E(家长):父项的熵
  • 加权熵/信息 = {加权平均}*E(子)
  • E(儿童): 子项熵
  • IG: 信息获取

3.3 那么,熵和信息增益之间的关系是什么呢?

决策树算法的目标是在我们向下运行时最终解开标签,或者换句话说,在每个节点上产生可能标题的最纯粹分布。 在决策树中,熵和信息增益决定了在构造树的每一步中拆分节点的特征。选择信息增益最高的部分,因为这将导致熵和最纯节点的最显着减少。

信息增益越高,熵越低。 熵是不纯的量度。数据越不纯,不确定性就越大。通过减少数据的熵,我们使其更具体,从而获得更高的信息增益。

信息增益衡量通过拆分特定特征来减少多少数据熵。熵减少得越多,子节点就越均匀,分裂越好。

3.4. 基尼杂质/指数:

这是当数据包含多类标签时使用的误分类度量。基尼类似于熵,但它的计算速度比熵快得多。像CART(分类和回归树)这样的算法使用基尼作为杂质参数。

基尼指数的最小值为0,而基尼指数的最大值为0.5。

比熵更快,计算成本更低,因为熵使用对数,但使用熵准则获得的结果略好。

 

 
  • p 是 = 是的概率
  • p 否 = 否的概率
  • i = 类 i 的概率
基尼杂质和熵;来源: quantdare.com
 

四、决策树如何选择根节点并执行拆分?

        数据集中的五列是前景、温度、湿度、风和游戏。播放列包含基于四个输入列的条件是否播放的结果。

4.1. 整个数据集的熵:

        整个数据集的熵是指目标列的熵。在这里,我们的目标列是“播放”。

import pandas as pd
df = pd.read_csv('play_tennis.csv')
df = df.iloc[:,1:]
print(df)

 

 

这里

9/14 = 否。样本空间中的是/总结果数

5/14 = 否。样本空间中无/总结果

4.2. 每列的信息增益:

由于有四个输入列,“展望”,“温度”,“湿度”和“风”,我们需要计算每列获得的信息。

展望列的信息增益如下:

print(df.groupby('outlook')['play'].value_counts())
 

        在这里,我们可以看到,在我们的第一列展望中,有三个分类值:晴天、阴天和雨。

(a) 我们需要计算晴天、阴天和雨的熵:

 

 (b) 展望栏的信息,等于加权平均数*熵:

(c) 展望栏的信息增益:

 

(d) 其他栏目:温度、湿度和风力的信息增益如下:

        选择信息增益最高的列作为根节点。 由于展望列具有最高的信息增益,因此它被视为根节点。
        一旦它成功地将训练集一分为二,它就会使用相同的逻辑拆分子集,然后是子集,依此类推,递归,直到达到最大深度。

五、使用 sklearn 库的决策树含义:

  • 在实现决策树分类器之前要记住的关键点之一是,即使在分类问题中,CART 算法也要求所有列都是数字。
  • 这是因为,CART使用贪婪算法来构建决策树,并且它需要能够计算树中每个节点的杂质。
  • 机器学习模型使用一种热编码技术将分类变量转换为数值,使用 sklearn 标签编码器可以轻松实现。
#imported the dataset:
import pandas as pd
df = pd.read_csv('play_tennis.csv')
df = df.iloc[:, 1:6]
print(df.head())

# performed one hot encoding: converted categorical to numerical columns
from sklearn.preprocessing import LabelEncoder
cols = ['outlook', 'temp', 'humidity', 'wind', 'play']
le = LabelEncoder()
def preprocess(df):
    for col in cols:
        df[col] = le.fit_transform(df[col])
    return df
preprocess(df)
print(df.head())

#selected the input and target columns:
x = df.iloc[:, 0:4].values
y = df.iloc[:, 4]

#imported Decision Tree Classifier:
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(criterion='entropy')

# trained the model:
dt.fit(x, y)

 

我们数据集的一个热编码

# visualization of decision tree:
from sklearn import tree
import graphviz
tree.plot_tree(dt, feature_names=cols, rounded=True, filled=True)

5.1 决策树的可视化:

 

决策树

5.2、决策树的超参数

超参数是显式指定并控制训练过程的参数。它们在模型优化中起着至关重要的作用。

决策树分类器的一些最常见的超参数如下:

  • max_depth:此超参数指定树的最大深度。更深的树将具有更多的拆分,并且能够捕获有关数据的更多信息,但它也可能更容易过度拟合。
  • min_samples_split:此超参数指定拆分节点所需的最小样本数。较低的值将允许树拆分更多节点,这可能会导致更复杂的树。
  • min_samples_leaf:此超参数指定叶节点中所需的最小样本数。较低的值将允许树具有更多的叶节点,这可以提高树的准确性。
  • 标准: 此超参数指定可用于确定节点最佳拆分的拆分标准。最常见的标准是“基尼”“熵”。
  • 分配器: 此超参数指定将用于查找节点最佳拆分的拆分算法。最常见的拆分器是最佳、随机和均匀的。

六、决策树的缺点

        决策树是一种强大的机器学习算法,可用于分类和回归任务。但是,它们也有一些缺点:

  • 过拟合:决策树可能容易过度拟合,这意味着它们在训练数据中效果很好,但在测试集上则不然。
  • 对数据微小变化的敏感性:数据中的微小变化会显著影响决策树的结构,从而导致过度拟合或不稳定。
  • 可解释性:决策树可能具有挑战性,尤其是在大型且复杂的决策树中。这可能会使理解模型的工作原理并使用它来做出决策变得困难。
  • 大型决策树的计算成本很高。

        在这里,我添加一个 GitHub 链接,指向使用决策树算法执行的心脏病检测模型。姆林莫伊·博拉

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

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

相关文章

k8s之工作负载、Deployment、DaemonSet、StatefulSet、Job、CronJob及GC

文章目录 1、工作负载1.1、定义1.2、分类 2、Deployment2.1、定义2.2、Deployment创建2.3、Deployment 更新机制2.3.1、比例缩放(Proportional Scaling)2.3.2、HPA(动态扩缩容)2.3.2.1、需要先安装metrics-server2.3.2.2、配置hpa…

【LeetCode】1448.统计二叉树中好节点的数目

题目 给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。 「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。 示例 1: 输入:root [3,1,4,3,null,1,5] 输出:4 …

java开发之fastjson

依赖 <!-- fastjson依赖 --> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> <…

php_webshell免杀--从0改造你的AntSword

0x00 前言&#xff1a; 为什么会有改造蚁剑的想法&#xff0c;之前看到有做冰蝎的流量加密&#xff0c;来看到绕过waf&#xff0c;改造一些弱特征&#xff0c;通过流量转换&#xff0c;跳过密钥交互。 但是&#xff0c;冰蝎需要反编译去改造源码&#xff0c;再进行修复bug&am…

CSS3盒模型+flex

1.盒模型 标准盒模型: wwidthpaddingborderhheightpaddingborder 怪异盒模型(ie盒模型) wwidth包含了(paddingborder)hheight包含了(paddingborder) 2.CSS3弹性盒(重点新版弹性盒) 弹性盒: 设置为弹性盒后,父元素为容器,子元素为项目弹性盒中存在两根轴,默认水平为主轴,垂…

.netcore grpc截止时间和取消详解

一、截止时间概述 截止时间功能让 gRPC 客户端可以指定等待调用完成的时间。 超过截止时间时&#xff0c;将取消调用。 设定一个截止时间非常重要&#xff0c;因为它将提供调用可运行的最长时间。它能阻止异常运行的服务持续运行并耗尽服务器资源。截止时间对于构建可靠应用非…

Qt跨平台无边框窗口探索记录

一、前言 实现的效果为&#xff1a;通过黑色矩形框预操作&#xff0c;鼠标释放时更新窗口。效果图如下&#xff1a; 1.功能 1.1 已实现功能 8个方向的缩放标题栏拖动标题栏双击最大化/正常窗口窗口最小尺寸预操作框颜色与背景色互补多屏幕默认标题栏 1.2 待开发功能 拖动到…

张驰咨询:六西格玛培训哪家好?2024年最新推荐榜单来了!

随着2024年的到来&#xff0c;越来越多的企业和个人开始关注六西格玛&#xff08;6σ&#xff09;管理&#xff0c;以提高工作效率和质量。那么&#xff0c;在众多提供六西格玛培训的机构中&#xff0c;哪家好呢&#xff1f;张驰咨询将为您详细解析。 一、六西格玛培训背景 六…

vue项目引入svg组件全过程

文件格式 svg下方对应 .svg index.vue svg-icon 组件 <template><svg:viewBox"viewBox"xmlns"http://www.w3.org/2000/svg"xmlns:xlink"http://www.w3.org/1999/xlink"ref"svg"class"svg-icon":class"class…

Java 小白也能学会OOM内存溢出问题 排查分析

前言 最近在学习群里面&#xff0c;有聊到近几天排查生产问题上面的OOM事故。 有兄弟私聊问到怎么看。 其实非常简单&#xff0c;但是我想了下是不是有很多人没接触过&#xff1f;或者是望而生畏&#xff1f; 那么&#xff0c;就来做个简单的小教程示例吧。 正文 简单写个Us…

深层次分析字符数组和字符串的区别是什么?

前言 &#xff08;1&#xff09;休闲时刻刷B站&#xff0c;看到一个卖课的&#xff0c;发视频问&#xff0c;char arr1[]{‘H’,‘E’,‘L’,‘L’,‘O’};和char arr2[]“HELLO”;区别是什么。 &#xff08;2&#xff09;看那个卖课博主一顿分析&#xff0c;最后成功得出&…

2.linux字符设备

目录 设计字符设备 文件系统调用系统IO的内核处理过程 硬件层原理 驱动层原理 文件系统层原理 设备号的组成与哈希表 Hash Table&#xff08;哈希表、散列表&#xff0c;数组和链表的混合使用&#xff09; 设备号管理 关键的数据结构&#xff1a;char_device_struct&a…

每日一题:leetcode 1448 统计二叉树中好节点的数目

给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,3,null,1,5] 输出&#xff1a;4 解释&a…

kafak消费数据,webSocket实时推送数据到前端

1.导入webSocket依赖 <!--websocket依赖包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 2.编写webSocket类 package com.skyable.device.co…

远程连接虚拟机中ubuntu报错:Network error:Connection refused

ping检测一下虚拟机 可以ping通&#xff0c;说明主机是没问题 #检查ssh是否安装&#xff1a; ps -e |grep ssh发现ssh没有安装 #安装openssh-server sudo apt-get install openssh-server#启动ssh service ssh startps -e |grep ssh检查一下防火墙 #防火墙状态查看 sudo ufw…

工控机驱动自助检票机,打造轨道交通的智慧未来!

随着城市化进程的加速和人口的不断增长&#xff0c;城市轨道交通建设正日益成为解决交通拥堵、提高交通工作效率的重要举措。然而&#xff0c;仅仅依靠传统的交通设施已经无法满足城市发展的需求&#xff0c;轨道交通智能系统建设成为了不可忽视的发展趋势。 AFC&#xff0c;即…

数据分享|R语言PCA主成分、lasso、岭回归降维分析近年来各国土地面积变化影响...

全文链接&#xff1a;http://tecdat.cn/?p31445 机器学习在环境监测领域的应用&#xff0c;着眼于探索全球范围内的环境演化规律&#xff0c;人类与自然生态之间的关系以及环境变化对人类生存的影响&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 课题着眼于…

电脑显示“Operating System not found”该怎么办?

“Operating System not found”是一种常见的电脑错误提示&#xff0c;这类错误会导致你无法成功启动Windows。那么电脑显示“Operating System not found”该怎么办呢&#xff1f; 方法1. 检查硬盘 首先&#xff0c;您可以测试硬盘是否存在问题。为此&#xff0c;您可以采取以…

.NET敏捷开发框架-RDIFramework.NET V6.0发布

1、RDIFramework.NET 敏捷开发框架介绍 RDIFramework.NET敏捷开发框架&#xff0c;是我司重磅推出的基于最新.NET6与.NET Framework的快速信息化系统开发、整合框架&#xff0c;为企业快速构建跨平台、企业级的应用提供了强大支持。 开发人员不需要开发系统的基础功能和公共模…

CentOS7安装jq命令

1. 安装依赖 yum install gmp-devel mpfr-devel libmpc-devel -y2. 安装gcc 2.1 离线环境 wget https://ftp.gnu.org/gnu/gcc/gcc-10.3.0/gcc-10.3.0.tar.gz tar -xzf gcc-10.3.0.tar.gz编译安装 yum -y install gcc c --skip-broken./configure --disable-multilib --enab…