Lucas带你手撕机器学习——决策树
一、决策树简介
决策树是一种基本的分类与回归方法,它通过树状结构对数据进行分类或预测。每个内部节点代表一个特征(属性),每个分支代表特征的一个可能值,而每个叶子节点代表一个分类或预测值。由于其直观和易于理解的特点,决策树广泛应用于机器学习、数据挖掘和决策分析等领域。
1.1 决策树的结构
决策树由以下几个部分组成:
- 根节点:树的起始节点,表示整个数据集。
- 内部节点:每个内部节点表示对某个特征的测试。
- 分支:分支代表特征的取值,连接节点。
- 叶子节点:终止节点,代表最终的分类结果或预测值。
1.2 决策树的类型
根据任务的不同,决策树可以分为两种类型:
- 分类树:用于分类任务,叶子节点表示类别标签。
- 回归树:用于回归任务,叶子节点表示数值预测。
二、构建决策树
构建决策树的基本步骤如下:
- 选择最优特征:根据某种准则(如信息增益、基尼指数等)选择最能区分数据的特征。
- 划分数据集:根据选择的特征将数据集划分为多个子集。
- 递归构建子树:对每个子集重复步骤1和2,直到满足停止条件(如达到最大深度、样本数小于阈值等)。
- 生成决策树:最终生成的树就是完整的决策树。
2.1 特征选择准则
特征选择是构建决策树的关键步骤,常用的准则有:
- 信息增益:通过计算选择特征前后信息熵的变化量来决定特征的重要性。信息增益越大,特征越重要。
[
IG(D, A) = H(D) - \sum_{v \in Values(A)} \frac{|D_v|}{|D|} H(D_v)
]
其中,(H(D)) 是数据集 (D) 的熵,(Values(A)) 是特征 (A) 的所有取值,(D_v) 是特征 (A) 取值为 (v) 的子集。
- 基尼指数:用于衡量一个数据集的不纯度,基尼指数越小,表示数据集的纯度越高。
[
Gini(D) = 1 - \sum_{i=1}^{C} p_i^2
]
其中,(C) 是类别数,(p_i) 是数据集中类别 (i) 的比例。
2.2 决策树的停止条件
在构建决策树时,需要设置停止条件,以避免过拟合。常用的停止条件有:
- 树的深度限制:限制树的最大深度,防止树过于复杂。
- 样本数限制:当节点的样本数小于某个阈值时停止分裂。
- 信息增益阈值:如果当前特征的信息增益小于某个阈值,则停止分裂。
三、决策树的优缺点
3.1 优点
- 易于理解和解释:决策树的结构清晰,容易可视化和理解。
- 无需特征缩放:决策树不受特征尺度影响,不需要进行特征缩放。
- 处理缺失值:决策树能够处理缺失值,通过对样本进行划分,可以有效减少缺失值的影响。
- 适应非线性关系:决策树能够适应特征之间的非线性关系。
3.2 缺点
- 易过拟合:决策树容易在训练集上过拟合,导致在新数据上的性能下降。
- 不稳定性:对数据的微小变化敏感,可能导致结构上的较大变化。
- 偏向于多值特征:决策树在选择特征时,可能偏向于取值较多的特征。
- 局部最优:特征选择过程可能陷入局部最优,导致模型性能不佳。
四、决策树的剪枝技术
为了减少决策树的过拟合问题,可以采用剪枝技术。剪枝分为两种类型:
4.1 预剪枝(Pre-pruning)
在决策树构建的过程中,通过设置一些条件提前停止树的生长。例如,可以根据当前节点的样本数、树的深度或信息增益等,决定是否继续分裂节点。
4.2 后剪枝(Post-pruning)
在决策树构建完成后,通过评估模型在验证集上的表现,剪去一些不必要的节点。常用的方法有:
- 最小化错误率:通过计算剪枝前后的错误率,选择最小的错误率。
- 复杂度惩罚:引入一个惩罚项,对树的复杂度进行约束,选择复杂度与性能之间的最佳平衡点。
五、决策树的实践应用
决策树在实际应用中非常广泛,主要应用于以下领域:
- 医疗诊断:通过分析患者的症状和体征,辅助医生进行疾病的判断。
- 金融风控:在信用评分和贷款审批中,评估客户的风险等级。
- 市场营销:通过客户特征分析,制定个性化的营销策略。
- 客户分类:根据客户行为特征,进行客户细分和个性化服务。
六、用 Python 实现决策树
下面是使用 Python 中的 scikit-learn
库实现决策树的一个完整示例:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix# 加载鸢尾花数据集
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, random_state=42)# 训练模型
clf.fit(X_train, y_train)# 进行预测
y_pred = clf.predict(X_test)# 评估模型
print("准确率:", accuracy_score(y_test, y_pred))
print("\n分类报告:\n", classification_report(y_test, y_pred))
print("混淆矩阵:\n", confusion_matrix(y_test, y_pred))# 可视化决策树
plt.figure(figsize=(12, 8))
plot_tree(clf, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.title("决策树可视化")
plt.show()
6.1 代码解析
- 数据加载:使用
load_iris
函数加载鸢尾花数据集,该数据集包含三个类别的鸢尾花的特征。 - 数据划分:使用
train_test_split
将数据集划分为训练集和测试集,测试集占比为 20%。 - 创建分类器:使用
DecisionTreeClassifier
创建决策树分类器,设置最大深度为 3,确保树不会过于复杂。 - 模型训练:使用训练集训练模型。
- 模型预测:在测试集上进行预测,评估模型的准确率和其他性能指标。
- 可视化决策树:使用
plot_tree
函数可视化决策树结构。
七、总结
决策树是一种强大且易于理解的机器学习模型,适用于分类和回归任务。通过选择最优特征进行划分,决策树能够有效地对数据进行建模。尽管决策树有许多优点,但在实际应用中也需要注意过拟合和不稳定性的问题,因此常常结合剪枝技术进行改进。由于其直观的可视化和解释性,决策树在多个领域都得到了广泛应用。
希望这份详细的讲解对您了解决策树有帮助!如果您有任何疑问或需要更深入的讨论,请随时告诉我!
相关文章:
Lucas带你手撕机器学习——决策树
一、决策树简介 决策树是一种基本的分类与回归方法,它通过树状结构对数据进行分类或预测。每个内部节点代表一个特征(属性),每个分支代表特征的一个可能值,而每个叶子节点代表一个分类或预测值。由于其直观和易于理解…...

OpenIPC开源FPV之Ardupilot配置
OpenIPC开源FPV之Ardupilot配置 1. 源由2. 问题3. 分析3.1 MAVLINK_MSG_ID_RAW_IMU3.2 MAVLINK_MSG_ID_SYS_STATUS3.3 MAVLINK_MSG_ID_BATTERY_STATUS3.4 MAVLINK_MSG_ID_RC_CHANNELS_RAW3.5 MAVLINK_MSG_ID_GPS_RAW_INT3.6 MAVLINK_MSG_ID_VFR_HUD3.7 MAVLINK_MSG_ID_GLOBAL_P…...

合并数组的两种常用方法比较
在 JavaScript 中,合并数组的两种常用方法是使用扩展运算符 (...) 和使用 push 方法。 使用扩展运算符 this.items [...this.items, ...data.items]; 优点: 易于理解:使用扩展运算符的语法非常直观,表达了“将两个数组合并成一个…...

qt 下载安装
1. 官网地址 https://www.qt.io/ 2. 下载 使用邮箱注册账号,登录,后边安装时也用的到 登录后: 这里需要电话号验证,电话号需要正确的,其他随便填,电话号中国区前需要86, 验证后自动下载 …...

Oracle SQL Developer 同时打开多个table的设置
Oracle SQL Developer 同时打开多个table的设置 工具 》 首选项 》数据库 》对象查看器,勾选 “自动冻结对象查看器窗口”...

NVIDIA发布Nemotron-70B-Instruct,超越GPT-4o和Claude 3.5的AI模型
一、Nemotron-70B-Instruct 是什么 Nemotron-70B-Instruct 是由 NVIDIA 基于 Meta 的 Llama 3.1-70B 模型开发的先进大语言模型(LLM)。该模型采用了新颖的神经架构搜索(Neural Architecture Search,NAS)方法和知识蒸馏…...
死锁(Deadlock)C#
在多线程编程中,死锁(Deadlock)是一种非常常见的问题,通常发生在两个或多个线程相互等待对方持有的锁,导致它们都无法继续执行。要避免死锁,需要了解死锁的四个必要条件以及相应的解决策略。 死锁的形成 …...
前端-基础CSS 知识总结
1.书写位置:title 标签下方添加 style 双标签,style 标签里面书写 CSS 代码。 <title>CSS 初体验</title> <style>/* 选择器 { } */p {/* CSS 属性 */color: red;} </style><p>体验 CSS</p> <link rel="stylesheet" href=…...

最新版本jdbcutils集成log4j做详细sql日志、自动释放连接...等
maven坐标 <!-- MySQL 8 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version></dependency><!-- Druid连接池 --><dependency><groupId&…...
jQuery快速填充非form数据
jQuery快速填充非form数据 先看看jQuery根据name填充form表单数据 <!DOCTYPE html> <html><head><script src"https://code.jquery.com/jquery-3.6.0.min.js"></script> </head><body><form id"myForm">…...

语音语言模型最新综述! 关于GPT-4o背后技术的尝试
近期,大型语言模型(LLMs)在生成文本和执行各种自然语言处理任务方面展现出了卓越的能力,成为了强大的AI驱动语言理解和生成的基础模型。然而,仅依赖于基于文本模态的模型存在显著局限性。这促使了基于语音的生成模型的发展,使其能够更自然、直观地与人类互动。 为了…...

根据用户选择的行和列数据构造数据结构(跨行跨列)
方案一 这段代码的功能是根据用户选择的行和列数据,生成一个适合复制粘贴的字符串表格。代码会先按列的 id 从小到大排序,再根据行列的选择关系将数据按顺序填入表格,每行之间使用换行符分隔,每列之间使用制表符分隔。如果某一行…...
Spark教程5-基本结构化操作
加载csv文件 df spark.read.format("json").load("/data/flight-data/json/2015-summary.json")Schema 输出Schema df.printSchema()使用Schema读取csv文件,以指定数据类型 from pyspark.sql.types import StructField, StructType, Strin…...

内置数据类型、变量名、字符串、数字及其运算、数字的处理、类型转换
内置数据类型 python中的内置数据类型包括:整数、浮点数、布尔类型(以大写字母开头)、字符串 变量名 命名变量要见名知意,确保变量名称具有描述性和意义,这样可以使得代码更容易维护,使用_可以使得变量名…...
Win/Mac/Android/iOS怎麼刪除代理設置?
設置代理設置的主要構成 IP 地址和端口 這些是代理伺服器配置的最基本組件。代理伺服器的IP地址引導互聯網流量,而端口號指定伺服器上的通信通道。 為什麼要刪除代理設置? 刪除代理設置通常是為了解決網路問題、提高速度、恢復安全性或過渡到新的網路…...

数据结构------手撕顺序表
文章目录 线性表顺序表的使用及其内部方法ArrayList 的扩容机制顺序表的几种遍历方式顺序表的优缺点顺序表的模拟实现洗牌算法 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,…...

UDP(用户数据报协议)端口监控
随着网络的扩展,确保高效的设备通信对于优化网络功能变得越来越重要。在这个过程中,端口发挥着重要作用,它是实现外部设备集成的物理连接器。通过实现数据的无缝传输和交互,端口为网络基础设施的顺畅运行提供了保障。端口使数据通…...

【Java小白图文教程】-05-数组和排序算法详解
精品专题: 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…...

OpenCV视觉分析之目标跟踪(1)计算密集光流的类DISOpticalFlow的介绍
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 这个类实现了 Dense Inverse Search (DIS) 光流算法。更多关于该算法的细节可以在文献 146中找到。该实现包含了三个预设参数集,以提…...

Lucas带你手撕机器学习——套索回归
好的,下面我将详细介绍套索回归的背景、理论基础、实现细节以及在实践中的应用,同时还会讨论其优缺点和一些常见问题。 套索回归(Lasso Regression) 1. 背景与动机 在机器学习和统计学中,模型的复杂性通常会影响其在…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...