Python28-1 机器学习算法之决策树

决策树(Decision Tree)

决策树算法是一种常用的机器学习算法,属于监督学习范畴。它可以用于分类和回归任务,具有易于理解和解释的特点。决策树通过递归将数据分割成更小的子集,构建一个树形结构,其中每个节点代表一个特征的测试,分支代表测试结果,叶子节点代表最终的分类或回归结果。

1. 基本概念
  • 根节点(Root Node):树的最顶端节点,包含所有数据样本。

  • 内部节点(Internal Nodes):每个内部节点表示一个特征的测试,根据测试结果将数据分成两个或多个子集。

  • 叶子节点(Leaf Nodes):树的末端节点,表示最终的分类或回归结果。

  • 分支(Branches):从一个节点到下一个节点的路径,代表特征测试的结果。

2. 构建过程

构建决策树的过程涉及以下几个步骤:

  1. 选择最优特征:在每个节点选择一个特征来分割数据。选择的标准通常是信息增益、信息增益率或基尼指数等。

  2. 数据分割:根据选择的特征和阈值,将数据分割成子集。

  3. 递归分割:对每个子集重复上述步骤,直到满足停止条件,如所有数据属于同一类或达到最大树深度。

  4. 构建树形结构:将上述分割过程形成树形结构,根节点和内部节点代表特征测试,叶子节点代表最终预测。

3. 特征选择标准
  • 信息增益(Information Gain):衡量特征在分割数据后信息熵的减少量。选择信息增益最大的特征进行分割。

  • 基尼指数(Gini Index):用于衡量数据集的不纯度。选择基尼指数最小的特征进行分割。

  • 信息增益率(Gain Ratio):信息增益的一种改进,考虑了特征取值的不同数量,选择信息增益率最大的特征进行分割。

4. 优点和缺点

优点

  • 易于理解和解释,适合展示和解释复杂决策

  • 可以处理数值型和类别型数据

  • 不需要太多的数据预处理(如标准化、归一化)

缺点

  • 容易过拟合,特别是当树很深时

  • 对于有噪声的数据敏感,可能导致不稳定的树结构

  • 决策树可能偏向于那些具有较多类别的特征

5. 应用

决策树在很多领域都有广泛的应用,例如:

  • 医疗诊断:根据病人的症状和检查结果,预测疾病

  • 金融:信用评分、欺诈检测

  • 市场营销:客户分类、行为预测

  • 制造业:质量控制、故障诊断

6. 示例

一个简单的决策树分类问题示例是预测某个学生是否会通过考试,特征可以包括学习时间、上课出勤率、是否完成作业等。决策树会根据这些特征逐步分割数据,最终在叶子节点给出“通过”或“不通过”的预测。

                是否完成作业?/       \是          否/             \学习时间 > 2小时?    不通过/         \是           否/             \
通过          不通过

通过这个例子可以看到,决策树通过逐层分割特征,将数据分成不同的子集,最终在叶子节点给出预测结果。以下是一个简单的代码示例:

import matplotlib.pyplot as plt  # 用于绘图
from sklearn.datasets import load_iris  # 用于加载Iris数据集
from sklearn.tree import DecisionTreeClassifier, plot_tree  # 前者用于创建决策树分类器,后者用于可视化决策树
from sklearn.model_selection import train_test_split  # 用于将数据集分为训练集和测试集
from sklearn.metrics import accuracy_score  # 用于计算预测的准确率# 加载Iris数据集
iris = load_iris()  # 调用load_iris函数加载Iris数据集,并将其存储在变量iris中
X = iris.data  # 将Iris数据集中的特征数据存储在变量X中
y = iris.target  # 将Iris数据集中的目标标签存储在变量y中# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)  # 将数据集X和y分为训练集和测试集,test_size=0.3表示30%的数据用作测试集,random_state=42设置随机种子以保证结果可重复# 创建决策树分类器
clf = DecisionTreeClassifier(random_state=42)  # 创建一个DecisionTreeClassifier对象,random_state=42设置随机种子以保证结果可重复
clf.fit(X_train, y_train)  # 使用训练集数据X_train和y_train训练决策树分类器# 预测测试集
y_pred = clf.predict(X_test)  # 使用训练好的决策树分类器对测试集X_test进行预测,并将预测结果存储在变量y_pred中# 计算准确率
accuracy = accuracy_score(y_test, y_pred)  #调用accuracy_score函数,计算预测结果y_pred与真实标签y_test的准确率,并将结果存储在变量accuracy中
print(f'Accuracy: {accuracy:.2f}')# 可视化决策树
plt.figure(figsize=(20,10))  # 创建一个新的图形,并设置图形的尺寸为20x10英寸
plot_tree(clf, filled=True, feature_names=iris.feature_names, class_names=iris.target_names.tolist(), rounded=True)  # 调用plot_tree函数绘制决策树,节点用颜色填充,颜色深浅表示样本数量,rounded=True:使用圆角矩形表示节点
plt.show()

可视化结果:

图片

在决策树的可视化结果中,每个节点包含了多个信息。这些信息帮助我们理解每个节点的决策过程。

以下是对每个节点中数据的解释:

1.Feature and Threshold(特征和阈值)

  • 每个内部节点(非叶子节点)显示用于分割数据的特征和阈值。

  • 例如,如果节点显示 petal length (cm) <= 2.45,表示根据 petal length (cm) 特征,值小于等于 2.45 的样本被分到左子树,值大于 2.45 的样本被分到右子树。

2.Gini(基尼系数)

  • 基尼系数用于衡量数据集的不纯度。基尼系数越小,数据集越纯(即单一类别的样本比例越高)。计算公式为其中 ( pi ) 是第 ( i ) 类的样本比例。

3.Samples(样本数量)

  • 每个节点中样本的总数量。例如,如果节点显示 samples = 50,表示该节点包含50个样本。

4.Value(类别分布)

  • 每个节点中不同类别样本的数量。

  • 例如,如果节点显示 value = [10, 40],表示该节点包含10个属于第一类的样本和40个属于第二类的样本。

5.Class(类别)

  • 每个节点中占多数的类别(仅叶子节点)。例如,如果节点显示 class = versicolor,表示该节点的多数类别是 versicolor

假设我们有如下的决策树节点可视化结果:

petal length (cm) <= 2.45
gini = 0.5
samples = 100
value = [50, 50]
class = setosa

这个节点的信息解释如下:

  • petal length (cm) <= 2.45:使用花瓣长度作为特征,阈值是2.45。花瓣长度小于等于2.45的样本会被分到左子树,大于2.45的样本会被分到右子树。

  • gini = 0.5:基尼系数为0.5,表示数据集的不纯度较高(这通常是根节点或接近根节点的情况)。

  • samples = 100:该节点包含100个样本。

  • value = [50, 50]:这100个样本中,有50个属于第一类(例如,setosa),50个属于第二类。

  • class = setosa:在这个节点中,占多数的类别是 setosa(但在这种情况下,实际上类别是平分的)。

这些信息帮助我们理解模型如何基于特征一步步做出决策。以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

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

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

相关文章

iOS开发中用到的自定义UI库

文章目录 前言cell 左右滑动菜单日历组件仿QQ 侧滑抽屉仿探探、陌陌的卡牌滑动库头部缩放视图自定义UITabbar刮刮乐广告横幅 前言 本文中的UI组件&#xff0c;是作者在移动应用开发中都用到过的。 确实&#xff0c;找到对的三方库可以快速帮助我们构建App, 极大程度上提高了生…

Websocket在Java中的实践——最小可行案例

大纲 最小可行案例依赖开启Websocket&#xff0c;绑定路由逻辑类 测试参考资料 WebSocket是一种先进的网络通信协议&#xff0c;它允许在单个TCP连接上进行全双工通信&#xff0c;即数据可以在同一时间双向流动。WebSocket由IETF标准化为RFC 6455&#xff0c;并且已被W3C定义为…

C++ | Leetcode C++题解之第204题计数质数

题目&#xff1a; 题解&#xff1a; class Solution { public:int countPrimes(int n) {vector<int> primes;vector<int> isPrime(n, 1);for (int i 2; i < n; i) {if (isPrime[i]) {primes.push_back(i);}for (int j 0; j < primes.size() && i …

【建设方案】工单系统建设方案(Word原件)

工单管理系统解决方案 1、工单创建&#xff1a;根据告警信息创建工单。 2、工单管理&#xff1a;列表形式展示所有工单信息及进度状态。 3、工单处理&#xff1a;对接收的工单进行处理反馈。 4、工单催办&#xff1a;根据工单时效自动发送工单催办消息通知。 5、工单归档&#…

Allegro如何单独导出一个封装?

Allegro如何单独导出一个封装? Allegro如何导出封装? 在用Allegro进行PCB设计时,有时候需要从其它的项目中导出需要的封装,但一般情况下不需要全部的封装,只需要其中的某一个封装,那么怎么导出呢? 具体操作方法如下 首先需要在Allegro的安装目录下安装两个文件。(文件附…

css 流动边框

一、背景流动边框 实现原理&#xff1a; 用背景进行旋转&#xff0c;超出我们想显示的范围则hidden&#xff0c;就有以上的效果&#xff0c;可以用after或者before元素来实现也可以。 <!DOCTYPE html> <html lang"en"><head><meta charset&qu…

Ubuntu-22.04 安装Confulence

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

第四节:如何使用注解方式从IOC中获取bean(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;上一节学习了如何理解Spring的两个特性IOC和AOP&#xff0c;这一节来基于上节的内容进行一个简单实践。这节要实现的效果是通过IOC容器获取到Bean&#xff0c;并且将Bean的属性显示打印出来。 第一步&#xff1a;创建pojo实体类stu…

操作系统之《处理器机调度算法》【知识点+详细解题过程】

目录 PS:处理机调度算法相关公式&#xff1a; 1、【FCFS】先来先服务调度算法 2、【SJF&#xff08;SPF&#xff09;】短作业&#xff08;进程&#xff09;优先调度算法 3、【HRRF】最高响应比优先算法 4、【SRTF】最短剩余时间优先调度算法&#xff08;抢占式&am…

SpringCloudAlibaba基础四 微服务调用组件OpenFeign

JAVA 项目中如何实现接口调用&#xff1f; 1&#xff09;Httpclient HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 …

COB显示屏厂家为您详细解析COB显示屏的制造流程

倒装COB显示屏所采用的工艺与传统SMD LED显示屏完全不同&#xff0c;其是直接把LED发光芯片封装于PCB基板之上&#xff0c;因此其能够提供更小的像素间距&#xff0c;并且产品表面覆盖有高分子材料涂层&#xff0c;能够增强产品的防磕碰能力以及防水能力&#xff0c;在之前的文…

STM32开发方式的演变与未来展望

一、STM32开发方式的演变 自2007年STM32微控制器首次亮相以来&#xff0c;其开发方式经历了从寄存器到标准库&#xff0c;再到HAL&#xff08;硬件抽象层&#xff09;的演变。 1.寄存器开发&#xff08;2007年-2010年代初&#xff09; 最初&#xff0c;由于初期缺乏足够的软…

使用AI的100种方法#翻译神器N3

Text "100 ways to" and "use AI" in the poster center .A cozy desk setup with an open notebook featuring notes and drawings, a cup of coffee, a white pen, and dried flowers. Warm, earthy tones create a calming, aesthetic vibe. 第 3 种可能…

【每日一练】python运算符

1. 算术运算符 编写一个Python程序&#xff0c;要求用户输入两个数&#xff0c;并执行以下运算&#xff1a;加法、减法、乘法、求余、除法、以及第一个数的第二个数次方。将结果打印出来。 a input("请输入第一个数&#xff1a;") b input("请输入第二个数&…

15秒下雨短视频:成都柏煜文化传媒有限公司

15秒下雨短视频&#xff1a;瞬间的诗意与情感共鸣 在数字时代的浪潮中&#xff0c;短视频以其独特的魅力&#xff0c;成为了人们生活中不可或缺的一部分。其中&#xff0c;一段仅15秒的下雨短视频&#xff0c;成都柏煜文化传媒有限公司 或许在时间长河中只是一瞬间&#xff0c…

集群分布式储存

硬件&#xff1a; 存储柜 软件 &#xff1a; software define storage 分布式存储 是一种独特的系统架构由一组能够通过网络连通&#xff0c;为了完成共同任务而协调任务的计算机节点组成分布式是为了使用廉价的普通的计算机完成复杂的计算和存储任务目的就是利用更多的机…

【详细】CNN中的卷积计算是什么-实例讲解

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、 CNN的基础卷积计算1.1.一个例子了解CNN的卷积计算是什么1.2.卷积层的生物意义 二、卷积的拓展&#xff1a;多输入通道与多输出通道2.1.多输入通道卷积2.2.多输出通道卷积 三、卷积的实现3.1.pytorch实现卷积…

Redis 缓存预热、缓存雪崩、缓存击穿、缓存穿透业务实践

0、前言 本文所有代码可见 > 【gitee code demo】 本文会涉及 缓存预热、缓存雪崩、缓存击穿、缓存穿透介绍和解决方案业务实践 1、缓存预热 1.1、描述 提前将热点数据加载到缓存&#xff0c;提前响应&#xff0c;降低后端数据源访问压力 1.2、实践 Autowiredprivate R…

搭建Renesas R7FA8D1BHECBD-BTB的开发调试环境(DAP-LINK: N32G45XVL-STB)

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 FSP和KEIL产生测试项目 2.1 FSP生成项目 2.2 Keil中配置 3 硬件连接框图 4 一个测试案例 4.1 功能介绍 4.2 定时器函数 5 测试 搭建Renesas R7FA8D1BHECBD-BTB的开发调试环境&#xff08…

MySQL【触发器、存储过程、函数、范式】

day53 MySQL 触发器 创建触发器&#xff1a;&#xff08;before &#xff1a; 前置触发器、after &#xff1a;后置触发器&#xff09; 语法&#xff1a; delimiter xx 指定分隔符xxcreate trigger 触发器名 [before | after] 触发事件 on 表名 for each row 执行语句begin…