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

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. 剪枝处理:通过计算成本复杂度剪枝路径,评估不同剪枝强度下模型的性能,并绘制准确率随剪枝参数变化的图。

🍉总结

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


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分类模型部署-ONNX

分类模型部署-ONNX 0 引入:1 模型部署实战测试:1 安装配置环境:2 Pytorch图像分类模型转ONNX-ImageNet1000类3 推理引擎ONNX Runtime部署-预测单张图像: 2 扩展阅读参考 0 引入: 在软件工程中,部署指把开发…

消息队列-RabbitMQ-延时队列实现

死信队列 DLX,全称为Dead-Letter-Exchange,死信交换机,死信邮箱。当消息在一个队列中变成死信之后,它能重新发送到另外一个交换器中,这个交换器就是DLX,绑定DLX的队列就称为死信队列。 导致死信的几种原因: ● 消息…

Swift开发——简单函数实例

函数是模块化编程的基本单位,将一组完成特定功能的代码“独立”地组成一个执行单位,称为函数。函数的基本结构如下所示: 其中,func为定义函数的关键字;“函数名”是调用函数的入口;每个函数可以有多个参数,即可以有多个“参数标签 参数名称:参数类型”,一般地,各个参…

边缘微型AI的宿主?—— RISC-V芯片

一、RISC-V技术 RISC-V(发音为 "risk-five")是一种基于精简指令集计算(RISC)原则的开放源代码指令集架构(ISA)。它由加州大学伯克利分校在2010年首次发布,并迅速获得了全球学术界和工…

跟着刘二大人学pytorch(第---13---节课之RNN高级篇)

文章目录 0 前言0.1 课程视频链接:0.2 课件下载地址: 1 本节课任务描述模型的处理过程训练循环初始化分类器是否使用GPU构造损失函数和优化器每个epoch所要花费的时间遍历每个epoch时进行训练和测试记录每次测试的准确率加入到列表中 具体实现&#xff0…

中国最著名的起名大师颜廷利:父亲节与之相关的真实含义

今天是2024年6月16日,这一天被广泛庆祝为“父亲节”。在汉语中,“父亲”这一角色常以“爸爸”、“大大”(da-da)或“爹爹”等词汇表达。有趣的是,“爸爸”在汉语拼音中表示为“ba-ba”,而当我们稍微改变“b…

DeepDriving | 经典的目标检测算法:CenterNet

本文来源公众号“DeepDriving”,仅用于学术分享,侵权删,干货满满。 原文链接:经典的目标检测算法:CenterNet 1 前言 CenterNet是2019年发表的一篇文章《Objects as Points》中提出的一个经典的目标检测算法&#xf…

MySQL-创建表~数据类型

070-创建表 create table t_user(no int,name varchar(20),gender char(1) default 男);071-插入数据 语法格式: insert into 表名(字段名1, 字段名2, 字段名3,......) values (值1,值2,值3,......);insert into t_user(no, name, gender) values(1, Cupid, 男);字…

监控异地组网的方法?

监控异地组网是一项关键的技术,能够实现远程连接和访问。在复杂的网络环境中,使用传统的方法可能会遭遇网络限制和访问速度较慢的问题。而采用新兴的监控异地组网方法,如【天联】组网技术,可以克服这些问题并提供更好的用户体验。…

计算机缺失d3dcompiler_43.dll怎么办,介绍5种靠谱的解决方法

在电脑使用过程中,我们经常会遇到一些错误提示,其中之一就是“找不到d3dcompiler43.dll”的错误。那么,d3dcompiler43.dll到底是什么?为什么会出现丢失的情况?它对计算机有什么具体影响?如何解决这个问题&a…

黄仁勋最新建议:找到一门技艺,用一生去完善、磨炼!

“你可能会找到你的英伟达。我希望你们将挫折视为新的机遇。” 黄仁勋职业生涯中最大的教诲并非来自导师或科技公司 CEO,而是来自他在国际旅行时遇到的一位园丁。 近日在加州理工学院毕业典礼上发表演讲时,黄仁勋向毕业生分享了自己在日本京都的小故事。…

跟着刘二大人学pytorch(第---12---节课之RNN基础篇)

文章目录 0 前言0.1 课程视频链接:0.2 课件下载地址: 1 Basic RNN1.1 复习DNN和CNN1.2 直观认识RNN1.3 RNN Cell的内部计算方式 2 具体什么是一个RNN?3 使用pytorch构造一个RNN3.1 手动构造一个RNN Cell来实现RNN3.2 直接使用torch中现有的RN…

赶紧转行大模型,预计风口就今年一年,明年市场就饱和了!不是开玩笑

恕我直言,就这几天,各大厂都在裁员,什么开发测试运维都裁,只有大模型是急招人。 你说你不知道大模型是什么?那可太对了,你不知道说明别人也不知道,就是要趁只有业内部分人知道的时候入局&#…

深度学习1 -- 开头

感觉用这玩意越来越多,所以想学学。不过没想好怎么学,也没有提纲,买了两本书,一本是深度学习入门,小日子写的。还有一本就是花书。还有就是回Gatech参加线上课程,提纲大概是这样的。 https://omscs.gatech…

生产中的 RAG:使你的生成式 AI 项目投入运营

作者:来自 Elastic Tim Brophy 检索增强生成 (RAG) 为组织提供了一个采用大型语言模型 (LLM) 的机会,即通过将生成式人工智能 (GenAI) 功能应用于其自己的专有数据。使用 RAG 可以降低固有风险,因为我们依赖受控数据集作为模型答案的基础&…

比利时海外媒体宣发,发稿促进媒体通稿发布新形势-大舍传媒

引言 随着全球化的推进,海外媒体的影响力也日益增强。在这一背景下,比利时海外媒体的宣发工作成为了媒体通稿发布的新形势。大舍传媒作为一家专注于宣传推广的公司,一直致力于与比利时博伊克邮报(boicpost)合作&#…

ModuleNotFoundError: No module named ‘distutils‘的解决办法

最近想试试odoo17,在windows环境下,想安装试验一下,结果老出现oduleNotFoundError: No module named ‘distutils‘错误。查了一下,以为是python版本导致的,结果试了很多版本如下: 试了几个,每个…

4-异常-log4j配置日志滚动覆盖出现日志丢失问题

4-异常-log4j配置日志打印滚动覆盖出现日志丢失问题(附源码分析) 更多内容欢迎关注我(持续更新中,欢迎Star✨) Github:CodeZeng1998/Java-Developer-Work-Note 技术公众号:CodeZeng1998(纯纯技术文&…

浪潮信息内存故障预警技术再升级 服务器稳定性再获提升

浪潮信息近日对其内存故障智能预警修复技术进行了全面升级,再次取得技术突破。此次升级后,公司服务器的宕机率实现了80%锐降,再次彰显了浪潮信息在服务器技术领域的卓越能力。 浪潮信息全新升级服务器内存故障智能预警修复技术MUPR (Memory …

大数据开发流程解析

大数据开发是一个复杂且系统的过程,涉及需求分析、数据探查、指标管理、模型设计、ETL开发、数据验证、任务调度以及上线管理等多个阶段。本文将详细介绍每个阶段的内容,并提供相关示例和代码示例,帮助理解和实施大数据开发流程。 本文中的示…