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. 背景与动机 在机器学习和统计学中,模型的复杂性通常会影响其在…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...