机器学习算法基础知识1:决策树

机器学习算法基础知识1:决策树

  • 一、本文内容与前置知识点
    • 1. 本文内容
    • 2. 前置知识点
  • 二、场景描述
  • 三、决策树的训练
    • 1. 决策树训练方式
      • (1)分类原则-Gini
      • (2)分类原则-entropy
      • (3)加权系数-样本量
      • (3)程序是如何实现的
    • 2. 决策树构建结果
  • 三、测试集验证
  • 四、其他知识
  • 五、参考文献

一、本文内容与前置知识点

1. 本文内容

介绍决策树是什么,使用场景有哪些

2. 前置知识点

  1. 概率论基本知识:信息熵增益

二、场景描述

  • 鸢尾花的类别存在Setosa,Versicolour,Virginica三种,我们希望制作一个模型,对鸢尾花进行分类。
  • 我们会提供一些我们已经采集的样本,并且手动提取了每朵花的部分特征,数据集一共包括150个样本,每个样本包括花萼长度,花萼宽度,花瓣长度,花瓣宽度特征,以及对应鸢尾花类别的标签第5列为鸢尾花的类别(包括Setosa,Versicolour,Virginica三类)。

三、决策树的训练

我们把150个样本,取出120个作为训练集,来进行决策树的训练,目的希望决策树这个分类器有如下效果:
(1)对于训练集的样本能有比较好的分类效果
(2)对于测试集的样本能有比较好的分类效果

1. 决策树训练方式

(1)分类原则-Gini

每一层会选取一个特征进行分类,以二分类为主,分类原则遵循贪心算法,希望尽可能的把样本区分开。
使用了基尼系数作为样本分类效果的评估指标:
G i n i = 1 − ∑ i = 1 n p i 2 Gini=1-\sum^n_{i=1}p_i^2 Gini=1i=1npi2
可以看到样本分布越均匀,基尼系数越大,我们希望完成分类,也就是让基尼系数尽可能小,样本完全由同一类别构成的时候,基尼系数为0。

(2)分类原则-entropy

信息熵,同样的,样本的分布越均匀熵越大。
E n t r o p y = − ∑ i = 0 n p i log ⁡ 2 ( p i ) Entropy=-\sum^n_{i=0}p_i\log_2{(p_i)} Entropy=i=0npilog2(pi)

(3)加权系数-样本量

直观的考虑以下场景,三个类别个数分别为9,4,2,记为(9,4,2):
下一级分类有两种方案:
方案A:[(1,0,0),(8,4,2)]
方案B:[(8,0,0),(1,4,2)]
两种方案信息熵或基尼系数的加和相同,但是显然B尽可能多的把第一类分出去了,直观会认为更好。
从上述可以看出,分出的堆的大小同样应该被考虑进去进行loss的计算。

所以实际的loss会被记录为(二分类为例):
l o s s = m G i n i m + n G i n i n loss = mGini_m + nGini_n loss=mGinim+nGinin
m和n分别是所分出两堆的大小,用该等式计算信息量显然方案B会更小,方案B更合适。

(3)程序是如何实现的

程序枚举每个特征和阈值,在每层的数据中找出信息量最小的分类方式进行分类,逐层以这种贪心的方式进行分类
我们只要当好调包侠就行,不需要反复造轮子。

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn import tree
import matplotlib.pyplot as plt# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 构建决策树分类器
clf = DecisionTreeClassifier(criterion='entropy', max_depth=3, random_state=42)
clf.fit(X_train, y_train)
print(iris.feature_names)
print(iris.target_names)
# 可视化决策树
plt.figure(figsize=(12, 8))
tree.plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.show()# 测试准确率
accuracy = clf.score(X_test, y_test)
print("测试集准确率:", accuracy)

2. 决策树构建结果

(1)决策树常用作分类器,通过逐级进行条件判断的方式,将样本进行逐级分类,如下图:
(2)这个决策树通过逐级二分类的方式,将鸢尾花按照不同的特征进行分类。
(3)每个子节点得出最终分类结果,这个决策树是三层的,对于整个鸢尾花的分类结果上看,120个样本大部分都得到了很好的分类。但是有一个白色的子节点,仍然含有4朵花是vriginica,被识别成了versicolor。
在这里插入图片描述
方框中每一行分别是

  1. 分类条件
  2. 基尼系数(表征样本的无序程度,假设样本全都是同一种,则基尼系数=0)
  3. 样本数
  4. 第四行是当前节点在分类中的归属类别。

三、测试集验证

把测试集放进去进行训练得到结果,验证决策树的训练效果

accuracy = clf.score(X_test, y_test)
print("测试集准确率:", accuracy)

四、其他知识

  1. 这里只介绍了决策树用于分类的做法,事实上还可以用于回归。
  2. 这里只介绍了Gini和信息熵增益的训练方式,事实上还有别的。
  3. 树的构建最大层数是需要合理考虑的,过浅分不出来,过深会由于一些极端点导致过拟合,设置合理的层数,允许一些训练集的点分类错误,都是常见的策略。
  4. 决策树本质上是不断的在线性空间进行线性分割,这一点有一点像SVM?
  5. 合理的树的深度会使用交叉验证的方式来进行估算

五、参考文献

五分钟机器学习:决策树

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

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

相关文章

_使用CLion的Vcpkg安装SDL2,添加至CMakelists时报错,编译报错

语言:C20 编译器:gcc 14.2 摘要:初次使用Vcpkg添加SDL2,出现CMakelists找不到错误、编译缺失main错误、运行失败错误。 CMakelists缺失错误: 使用CLion的Vcpkg安装SDL2时,按照指示把对应代码添加至CMakel…

Lumos学习王佩丰Excel第二十二讲:制作甘特图与动态甘特图

一、制作双向条形图 1. 分离坐标轴 2. 自定义坐标轴数字格式:加分号加正常数字 3. 修改图表背景 修改图片艺术效果:虚化图片 二、制作甘特图 1、甘特图定义 甘特图(Gantt chart)又称为横道图、条状图(Bar chart&…

el-pagination 为什么只能展示 10 条数据(element-ui@2.15.13)

好的&#xff0c;我来帮你分析前端为什么只能展示 10 条数据&#xff0c;以及如何解决这个问题。 问题分析&#xff1a; pageSize 的值&#xff1a; 你的 el-pagination 组件中&#xff0c;pageSize 的值被设置为 10&#xff1a;<el-pagination:current-page"current…

【网络安全实验室】SQL注入实战详情

如果额头终将刻上皱纹&#xff0c;你只能做到&#xff0c;不让皱纹刻在你的心上 1.最简单的SQL注入 查看源代码&#xff0c;登录名为admin 最简单的SQL注入&#xff0c;登录名写入一个常规的注入语句&#xff1a; 密码随便填&#xff0c;验证码填正确的&#xff0c;点击登录…

ruoyi 多租户 开启后针对某一条sql不适用多租户; 若依多租户sql规则修改

文章参考&#xff1a;多租户功能 | Ruoyi-TDesign 忽略租户​ 1.如果需要指定单独 SQL 不开启过滤&#xff0c;可在对应的 Mapper 接口添加如下忽略注解&#xff1a; InterceptorIgnore(tenantLine "true", dataPermission "false") 此处注意事项 使…

一文理解条件竞争漏洞

视频教程在我主页简介或专栏里 目录&#xff1a; 理解竞争条件的基本概念 限制超越型竞争条件 使用 Burp Repeater 检测和利用限制超限竞态条件 方法论 1 — 预测潜在的冲突 2 — 线索 3 — 概念验证 如何防止竞态条件漏洞 理解竞争条件的基本概念 竞争条件(也就是条件竞…

一种基于动态部分重构的FPGA自修复控制器

1.FPGA动态部分重构技术 动态部分重构技术指在FPGA运行时&#xff0c;通过加载部分位流文件来修改FPGA可重构区域中的逻辑设计&#xff0c;修改过程中其余逻辑功能不受影响整个系统也能够持续运行。 下图为FPGA动态部分重构的基本原理图。通过下载A1.bit、A2.bit、A3.bit 或A4.…

计算机网络体系结构基础知识

一、计算机网络的两个目标&#xff1a; ①两台计算机之间通信 ②两台计算机之间的资源共享 二、计算机网络概述 1.定义&#xff1a;利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同 的形式连接起来&#xff0c;以功能完善的网络软件及协…

云计算学习架构篇之HTTP协议、Nginx常用模块与Nginx服务实战

一.HTTP协议讲解 1.1rsync服务重构 bash 部署服务端: 1.安装服务 [rootbackup ~]# yum -y install rsync 2.配置服务 [rootbackup ~]# vim /etc/rsyncd.conf uid rsync gid rsync port 873 fake super yes use chroot no max connections 200 timeout 600 ignore erro…

合合信息亮相CSIG AI可信论坛,全面拆解AI视觉内容安全的“终极防线”

合合信息亮相CSIG AI可信论坛&#xff0c;全面拆解视觉内容安全的“终极防线”&#xff01; &#x1f42f; AI伪造泛滥&#xff0c;我们还能相信“眼见为实”吗&#xff1f; 近期&#xff0c;由中国图象图形学学会主办的CSIG青年科学家会议 AI可信论坛在杭州成功举办。本次论…

AI 智能助手对话系统

一个基于 React 和 Tailwind CSS 构建的现代化 AI 对话系统&#xff0c;提供流畅的用户体验和丰富的交互功能。 项目链接&#xff1a;即将开放… 功能特点 &#x1f916; 智能对话&#xff1a;支持与 AI 助手实时对话&#xff0c;流式输出回答&#x1f4c1; 文件处理&#xff…

经验证:将数据从索尼传输到Android的 4 种方法

概括 像Android Galaxy S20 这样的新型Android智能手机很酷&#xff0c;但除了将数据从索尼传输到Android之外。众所周知&#xff0c;旧的索尼手机上存储着大量的文件&#xff0c;因此将数据从旧的索尼手机传输到新的Android手机非常重要。为了解决这个问题&#xff0c;我们做…

IDEA 搭建 SpringBoot 项目之配置 Maven

目录 1?配置 Maven 1.1?打开 settings.xml 文件1.2?配置本地仓库路径1.3?配置中央仓库路径1.4?配置 JDK 版本1.5?重新下载项目依赖 2?配置 idea 2.1?在启动页打开设置2.2?配置 Java Compiler2.3?配置 File Encodings2.4?配置 Maven2.5?配置 Auto Import2.6?配置 C…

走方格(蓝桥杯2020年试题H)

【问题描述】在平面上有一些二维点阵。这些点的编号就像二维数组的编号一样&#xff0c;从上到下依次为第1~n行&#xff0c;从左到右依次为第1~m列&#xff0c;每个点可以用行号和列号表示。 现在有个人站在第1行第1列&#xff0c;他要走到第n行第m列&#xff0c;只能向右或者向…

python opencv的orb特征检测(Oriented FAST and Rotated BRIEF)

官方文档&#xff1a;https://docs.opencv.org/4.10.0/d1/d89/tutorial_py_orb.html SIFT/SURF/ORB对比 https://www.bilibili.com/video/BV1Yw411S7hH?spm_id_from333.788.player.switch&vd_source26bb43d70f463acac2b0cce092be2eaa&p80 ORB代码 import numpy a…

全面解析 Node-RED:功能、Docker 部署与实战示例

言简意赅的讲解Node-RED解决的痛点 Node-RED 是一个基于流的编程工具&#xff0c;专为物联网&#xff08;IoT&#xff09;应用而设计。它通过可视化的编程界面&#xff0c;使开发者能够轻松地连接各种硬件设备、API 以及在线服务&#xff0c;构建复杂的应用流程。本文将详细介…

使用 CSS 的 `::selection` 伪元素来改变 HTML 文本选中时的背景颜色

定义 ::selection 伪元素&#xff1a; 在你的 CSS 文件中&#xff0c;添加 ::selection 伪元素&#xff0c;并设置 background-color 属性来改变选中文本的背景颜色。 示例代码&#xff1a; ::selection {background-color: yellow; /* 你可以根据需要更改颜色 */color: black…

电商项目-数据同步解决方案(四)商品下架同步更新ES索引库数据

商品下架索引库删除数据 一、 需求分析和业务逻辑 商品下架后将商品从索引库中移除。 主要应用技术有&#xff1a; 消息队列-RabbitMQ &#xff0c;分布式搜索引擎-ElasticSearch&#xff0c;Eureka&#xff0c;Canal&#xff0c;Feign远程调用 &#xff08;1&#xff09;在…

HTML5 标签输入框(Tag Input)详解

HTML5 标签输入框&#xff08;Tag Input&#xff09;详解 标签输入框&#xff08;Tag Input&#xff09;是一种用户界面元素&#xff0c;允许用户输入多个标签或关键词&#xff0c;通常用于表单、搜索框或内容分类等场景。以下是实现标签输入框的详细讲解。 1. 任务概述 标…

创建线程的8种方法

创建线程的8种方法 目录 继承Thread类实现Runnable接口实现Callable接口使用线程池使用ScheduledExecutorService使用Fork/Join框架使用CompletableFuture使用Guava的ListenableFuture总结 1. 继承Thread类 最直接的方式是创建一个继承自Thread类的子类&#xff0c;并重写其r…