算法与数据结构--决策树算法

news2024/12/26 0:15:20

2a20c54b85e042bfa2440367ae4807e9.gif

欢迎来到 Papicatch的博客

2a20c54b85e042bfa2440367ae4807e9.gif

文章目录

🍉决策树算法介绍

🍈原理

🍈核心思想包括

🍍递归分割

🍍选择标准

🍍剪枝

🍈解题过程

🍍数据准备

🍍选择最佳分割特征

🍍分割数据集

🍍递归构建子树

🍍剪枝处理

🍈时间复杂度和空间复杂度

🍍时间复杂度

🍍空间复杂度

🍈优缺点

🍍优点

🍍缺点

🍉示例

🍈案例分析1

🍍加载数据集

🍍划分训练集和测试集

🍍构建决策树模型

🍍预测

🍍评估模型

🍍可视化决策树

🍈案例分析2

🍍详细解释

🍉总结


2a20c54b85e042bfa2440367ae4807e9.gif

🍉决策树算法介绍

        决策树算法是一种常见的机器学习算法,广泛应用于分类和回归问题中。它通过将数据集分割成更小的子集,并在这些子集上递归地构建树形结构,从而实现对数据的预测和分类。本文将介绍决策树算法的原理、核心思想、解题过程、时间复杂度和空间复杂度,以及其优点和缺点,并提供一个案例实现。

🍈原理

        决策树的基本思想是将数据集逐步划分为不同的子集,使得每个子集中的数据更加同质化。具体来说,决策树通过选择特征及其对应的阈值来分割数据,选择的标准通常是信息增益或基尼指数等度量标准。树的每个节点表示一个特征,每条边代表该特征的一个取值或取值范围,叶子节点则表示分类结果或回归值。

🍈核心思想包括

🍍递归分割

        从根节点开始,选择一个最佳特征进行分割,继续对分割后的子集进行分割,直到满足停止条件。

🍍选择标准

        常用的选择标准有信息增益、信息增益率和基尼指数。信息增益用于ID3算法,信息增益率用于C4.5算法,而基尼指数用于CART算法。

🍍剪枝

        为防止过拟合,决策树算法通常会进行剪枝,分为预剪枝和后剪枝。

🍈解题过程

决策树的构建过程可以概括为以下步骤:

🍍数据准备

        收集并整理数据。

🍍选择最佳分割特征

        根据某种标准(如信息增益、基尼指数等),选择一个特征进行分割。

🍍分割数据集

        根据选择的特征将数据集分割成子集。

🍍递归构建子树

        对每个子集,重复步骤2和步骤3,直到满足停止条件(如所有样本属于同一类别,或特征用尽)。

🍍剪枝处理

        对生成的树进行剪枝,以提高模型的泛化能力。

🍈时间复杂度和空间复杂度

🍍时间复杂度

        决策树的构建时间复杂度取决于数据集的大小和特征数量。构建过程中需要对每个特征进行排序,复杂度为 O(nlogn),因此总的时间复杂度为O(mnlogn),其中 m 为特征数量,  n 为样本数量。

🍍空间复杂度

        存储决策树的空间复杂度取决于树的深度和节点数量。最坏情况下,空间复杂度为O(nlogn)。

🍈优缺点

🍍优点

  • 易于理解和解释:决策树的模型直观易懂,决策过程类似于人类的思考过程。
  • 无需数据预处理:决策树不需要特征缩放或归一化,能处理缺失数据。
  • 能够处理多种数据类型:既可以处理数值型特征,也可以处理分类型特征。

🍍缺点

  • 容易过拟合:决策树如果不进行剪枝,容易对训练数据过拟合,泛化能力差。
  • 对噪声敏感:对数据中的噪声较为敏感,可能导致模型性能下降。
  • 偏倚问题:不同分割标准可能导致不同的树结构,对数据中的一些重要特征选择不敏感。

🍉示例

🍈案例分析1

以下是使用Python的scikit-learn库实现决策树分类的示例:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

🍍加载数据集

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.3, random_state=42)

🍍构建决策树模型

clf = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=42)
clf.fit(X_train, y_train)

🍍预测

y_pred = clf.predict(X_test)

🍍评估模型

accuracy = accuracy_score(y_test, y_pred)
print(f'模型准确率: {accuracy:.2f}')

🍍可视化决策树

from sklearn.tree import plot_tree
import matplotlib.pyplot as plt

plt.figure(figsize=(12,8))
plot_tree(clf, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.show()

    以上代码展示了如何使用决策树对Iris数据集进行分类,包括数据加载、模型训练、预测和评估,以及决策树的可视化。通过这种方式,我们可以直观地理解决策树的决策过程和模型性能。

🍈案例分析2

        下面是一个更复杂的案例,实现了在一个金融数据集上的决策树分类模型,并进行了模型的性能评估和剪枝处理。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.metrics import accuracy_score, classification_report
import matplotlib.pyplot as plt

# 加载数据集
data = pd.read_csv('financial_data.csv')  # 假设数据集名为financial_data.csv
X = data.drop('target', axis=1)
y = data['target']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 构建决策树模型
clf = DecisionTreeClassifier(criterion='gini', max_depth=5, random_state=42)
clf.fit(X_train, y_train)

# 预测
y_pred = clf.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)
print(f'模型准确率: {accuracy:.2f}')
print('分类报告:')
print(report)

# 可视化决策树
plt.figure(figsize=(20,12))
plot_tree(clf, filled=True, feature_names=X.columns, class_names=['Class 0', 'Class 1'])
plt.show()

# 剪枝处理
path = clf.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas = path.ccp_alphas

clfs = []
for ccp_alpha in ccp_alphas:
    clf = DecisionTreeClassifier(random_state=42, ccp_alpha=ccp_alpha)
    clf.fit(X_train, y_train)
    clfs.append(clf)

# 评估剪枝后的模型
train_scores = [accuracy_score(y_train, clf.predict(X_train)) for clf in clfs]
test_scores = [accuracy_score(y_test, clf.predict(X_test)) for clf in clfs]

plt.figure(figsize=(10,6))
plt.plot(ccp_alphas, train_scores, marker='o', label='Train', drawstyle="steps-post")
plt.plot(ccp_alphas, test_scores, marker='o', label='Test', drawstyle="steps-post")
plt.xlabel('Effective Alpha')
plt.ylabel('Accuracy')
plt.legend()
plt.title('Accuracy vs Alpha for Training and Testing Sets')
plt.show()

🍍详细解释

  1. 数据加载与预处理:加载金融数据集,并进行特征和目标变量的分离。
  2. 数据集划分:将数据集划分为训练集和测试集。
  3. 模型构建与训练:使用DecisionTreeClassifier构建决策树模型,并进行训练。
  4. 预测与评估:对测试集进行预测,并评估模型的准确率和分类报告。
  5. 模型可视化:可视化决策树,展示树的结构。
  6. 剪枝处理:通过计算成本复杂度剪枝路径,评估不同剪枝强度下模型的性能,并绘制准确率随剪枝参数变化的图。

🍉总结

        总之,决策树算法在数据科学和机器学习中具有重要地位,理解其原理和实现方法对解决实际问题具有重要意义。


希望这些能对刚学习算法的同学们提供些帮助哦!!!

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

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

相关文章

pdf转图片,pdf转图片在线转

pdf转图片的方法,对于许多人来说可能是一个稍显陌生的操作。然而,在日常生活和工作中,我们有时确实需要将pdf文件转换为图片格式,以便于在特定的场合或平台上进行分享、展示或编辑。以下,我们将详细介绍一个pdf转成图片…

【每天学会一个渗透测试工具】dirsearch安装及使用指南

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 ✨dirsearch介绍 dirsearch安装包百度网盘 disearch是基于Python开发的,因此需要确保你的系统中已经安装了pyth…

linux中acl策略+文件权限

文档归属的局限性 - 任何人只属于三种角色:属主 属组 其他人- 无法实现更精细的控制 acl访问策略 - 能够对个别用户个别组设置独立的权限- 大多数挂载ext3/4,xfs文件系统默认已支持 Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...setfacl [选项] u:用户名…

消息队列-分布式消息队列技术选型

Kafka Kafka 是 LinkedIn 开源的一个分布式流式处理平台,已经成为 Apache 顶级项目,早期被用来用于处理海量的日志,后面才慢慢发展成了一款功能全面的高性能消息队列。 流式处理平台具有三个关键功能: 消息队列:发布和…

【C++入门(1)】命名空间

一、C出世 我们先简单认识下C的来历,C是在C语言的基础上发展来的。 当年C的设计者Bjarne Stroustrup,本贾尼斯特劳斯特卢普先生设计C语言之初,是为了对C语言做出一些更改,弥补C语言在一些方面的不足,或者做出其他的设…

JAVA开发 选择多个文件,系统运行后自动生成ZIP压缩包

选择多个文件,系统运行后自动生成ZIP压缩包 实现方法1.1 代码块1.2 运行结果截取 相关知识 实现方法 案例简述:通过启动java代码来打开文件选择器对话框,用户选择确认需要进行压缩的文件,可一次性选择多个文件,选择完…

whisper 模型源码解读

whisper官方源码 whisper 模型官方代码:https://github.com/openai/whisper/blob/main/whisper/model.py ;注释如下 import base64 import gzip from dataclasses import dataclass from typing import Dict, Iterable, Optionalimport numpy as np impo…

ffmpeg解封装rtsp并录制视频-(2)使用VLC模拟一个rtsp服务器并用ffmpeg解封装该rtsp流

VCL模拟服务器并打开播放该视频文件: - 准备好一个mp4文件,打开vlc软件 - 选择“媒体”》“流” - 添加一个mp4文件 - 点击下方按钮选择“串流” - 下一步目标选择rtsp 点击“添加” - 端口默认8554 - 路径设置 /test - 用…

XML Encoding = ‘GBK‘ after STRANS,中文乱码

最近帮同事处理了一个中信银行银企直连接口的一个问题,同事反馈,使用STRANS转换XML后,encoding始终是’utf-16’,就算指定了GBK也不行。尝试了很多办法始终不行,发到银行的数据中,中文始终是乱码。 Debug使用HTML视图看报文时也可以看到中文是乱码。 解决方案: 使用cl…

飞腾银河麒麟V10安装Todesk

下载安装包 下载地址 https://www.todesk.com/linux.html 安装 yum makecache yum install libappindicator-gtk3-devel.aarch64 rpm -ivh 下载的安装包文件后台启动 service todeskd start修改配置 编辑 /opt/todesk/config/config.ini 移除自动更新临时密码 passupda…

STM32CubeMX配置-RTC周期唤醒

一、简介 MCU为STM32G070,采用内部时钟32KHZ,配置为周期6s唤醒,调用回调函数,进行喂狗操作。 二、配置 初始时间、日期、周期唤醒时间配置。 开启周期唤醒中断 三、生成代码 调用回调函数,进行喂狗操作。 //RTC唤醒回…

STM32理论 —— μCOS-Ⅲ(2/2):时间管理、消息队列、信号量、任务内嵌信号量/队列、事件标志、软件定时器、内存管理

文章目录 9. 时间管理9.1 OSTimeDly()9.2 OSTimeDlyHMSM()9.3 OSTimeDlyResume()9.4 延时函数实验 10. 消息队列10.1 创建消息队列函数OSQCreate()10.2 发送消息到消息队列函数(写入队列)OSQPost()10.3 获取消息队列中的消息函数(读出队列)OSQPend()10.4 消息队列操作实验 11. …

绿色版DirectoryOpus功能强大且高度可定制的Windows文件管理器

Directory Opus(通常简称为DOpus)是一款功能强大且高度可定制的Windows文件管理器。它提供了许多超越Windows默认文件资源管理器(Explorer)的功能,使得文件和文件夹的管理变得更加高效和直观。以下是对Directory Opus的…

Hex-Rays IDA Pro V7安装教程 (交互式反汇编工具)

前言 DA Pro就像提供了一张二进制的地图,标注了系统函数以及分析人员注解的函数调用,同时展现出各级函数和代码块之间的调用关系。此外,IDA Pro的扩展性能很好,可以利用IDA Pro提供的API接口和IDC脚本来扩展应用,而且…

R语言 | 绘制带P值的差异柱状图

原文链接:R语言 | 绘制带P值的差异柱状图 本期教程 小杜的生信笔记,自2021年11月开始做的知识分享,主要内容是R语言绘图教程、转录组上游分析、转录组下游分析等内容。凡是在社群同学,可免费获得自2021年11月份至今全部教程&…

ElementPlus非表单组件ElUpload值更新后校验不消失问题

项目场景: el-form表单中有一个上传组件,有必填校验。 问题描述 先触发表单的必填校验(点击提交按钮),然后再上传文件,必填校验的提示一直存在,如果再次点击提交,手动触发表单校验,必填校验消…

2. 机器学习概述

机器学习是对能通过经验自动改进的计算机算法的研究。 ---汤姆. 米切尔 1997 通俗来讲,机器学习就是让计算机从数据中进行自动学习,得到某种知识(或规律)。在早期的工程领域,机器学习也经常被称为模式识别(…

Termius安装docker

安装Termius 直接上官网 新建主机 更新一下yum 更新完成 安装docker的包 设置阿里的yum 直接用命令安装 设置一下开机启动,可以查看docker的版本 拉去portainer的镜像发现报错 出现Get “https://registry-1.docker.io/v2/...“:net/http: TLS hand shake time o…

如何从索尼存储卡恢复数据?

Sony 存储卡广泛用于在数码相机、数码摄像机等中存储照片和视频。如果您从 Sony 存储卡中删除重要数据而未备份,您仍然可以找回丢失的数据。实际上,已删除的视频/照片或文档不会永远丢失,它们仍存储在 Sony 存储卡上,可以通过数据…