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

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 pltplt.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_alphasclfs = []
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.mzph.cn/bicheng/28518.shtml

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

相关文章

Qt 实战(4)信号与槽 | 4.2、自定义信号与槽

文章目录 一、自定义信号与槽1、自定义信号2、自定义槽3、连接信号与槽4、总结 前言: 在Qt框架中,信号(signals)和槽(slots)机制是对象间通信的核心。这种机制允许对象在特定事件发生时发出信号&#xff0c…

【GD32】 TIMER通用定时器学习+PWM输出占空比控制LED

扩展:对PWM波形的输出进行捕获 目录 一、简介二、具体功能描述1、时钟源的选择:2、预分频器:3、计数模式:向上计数模式:向下计数模式:中央对齐模式: 4、捕获/比较通道 输入捕获模式 输出比…

仙侠手游【天道情缘】修复版服务端+GM后台+详细教程

下载地址:仙侠手游【天道情缘】修复版服务端GM后台详细教程

【电子信息工程专业课】学习记录

数字信号处理 离散时间信号与系统 周期延拓 一个连续时间信号经过理想采样后,其频谱将沿着频率轴以采样频率Ωs 2π / T 为间隔而重复。 混频 各周期的延拓分量产生频谱交替的现象 奈奎斯特采样定理 fs > 2fh Z变换 收敛域:使任意给定序列x(n)的Z变…

ROS机器人小车建模仿真与SLAM

文章目录 一、URDF二、创建小车模型1.创建功能包2.导入依赖3.创建urdf,launch文件:4.可视化 三、添加雷达1.xacro文件2.集成和修改launch3.添加摄像头和雷达 三.GAZEBO仿真四、orbslam2kitti1.下载2.安装编译ORB_SLAM23.运行Kitee数据集 一、URDF ​ URDF&#xff…

传输层——TCP

在学习计算机网络的过程中,我们知道OSI七层协议模型,但是在实际开发应 用中我们发现OSI七层协议模型并不适合实施,因为OSI上三层通常都是由开 发人员统一完成的,这三层之间在实现过程中没有一个明确的界限,所以我 们更…

爬虫相关面试题

一,如何抓取一个网站? 1,去百度和谷歌搜一下这个网站有没有分享要爬取数据的API 2, 看看电脑网页有没有所需要的数据,写代码测试调查好不好拿,如果好拿直接开始爬取 3,看看有没有电脑能打开的手机网页&a…

Vue前端发起promise请求,若请求2分钟之内能完成就直接完成,若两分钟之后还未完成就直接路由跳转到其他页面

在Vue中,你可以使用JavaScript的Promise和setTimeout来实现这个需求。这里是一个基本的实现思路: 创建一个Promise,该Promise内部发起你的API请求(假设你使用的是axios)。同时设置一个setTimeout来在2分钟后执行一个操…

面向对象初级的内存分布图

1.一个对象的内存图 2.二个对象的内存图 3.二个引用指向同一个对象 4.this的内存布局图 创建了一个Student类的对象s1,因为有new,所有在堆区开辟了一些内存空间,比如把这些内存空间的地址值叫001 形参name是竹小玲, 也就是对象s调用method方法的地址值, this表示方法调用者的地…

怎么不使用springboot Helper或Spring Initializr来创建spring项目

1. 创建项目目录结构 首先,创建项目的基本目录结构。一个典型的 Maven 项目结构如下: my-spring-project ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── example │ │ │ └…

前端 CSS 经典:好用的 CSS 选择器

1. focus-within 当前选中元素及当前选中元素的后代元素有没有聚焦。 .focus:focus-within {background: #fff; } 2. has span 的兄弟元素 input 有自定义属性 data-required 的设置样式 .label span:has( input[data-required])::after {content: *,color: red } 3. fir…

Shell 学习笔记 - 导读 + 变量定义

初识 Shell 本章学习目标 了解什么是 Shell了解 Shell 的版本及用途掌握 Shell 变量的用法 导读( 了解 \color{cyan}{了解} 了解) 现在的人们使用的操作系统(Windows、Android、iOS 等)都带有图形化界面,简单直观&…

赶紧收藏!2024 年最常见 20道并发编程面试题(十)

上一篇地址:赶紧收藏!2024 年最常见 20道并发编程面试题(九)-CSDN博客 十九、什么是不可变对象?为什么它们在并发编程中很有用? 不可变对象(Immutable Object)是指一旦创建后&…

网络安全 - DDoS 攻击原理 + 实验

DDoS 攻击 什么是 DDoS 进攻 D D o S \color{cyan}{DDoS} DDoS(Distributed Denial of Service,分布式拒绝服务)攻击是一种通过多个计算机系统同时向目标系统发送大量请求,消耗其资源,使其无法正常服务的攻击方式。DD…

三、树和割集

文章目录 1、树1.1 树的定义1.2 树的性质1.3 极小连通图1.4 树的中心1.5 生成树1.5.1 最小生成树 2、 割点和桥THE END 1、树 1.1 树的定义 \qquad 定义: 一个连通的无圈的图称为树。 \qquad 只有一个顶点的树叫做平凡树。 \qquad 树中度为1的节点称为叶子结点。…

蒙特卡洛估计举例

计算期望 E q ( x 1 ∣ x 0 ) [ log ⁡ p θ ( x 0 ∣ x 1 ) ] \mathbb{E}_{q(x_1|x_0)}[\log p_\theta(x_0|x_1)] Eq(x1​∣x0​)​[logpθ​(x0​∣x1​)] 需要知道分布 q ( x 1 ∣ x 0 ) q(x_1|x_0) q(x1​∣x0​) 和函数 log ⁡ p θ ( x 0 ∣ x 1 ) \log p_\theta(x_0|…

IPNV6

特征——升级点: 1、全球单播地址 ----IPV4地址下的公有地址 V6下没 nat 2、可聚合性 (IANA组织对全球的地址进行合理分配) 3、多宿主——一个物理接口可以同时拥有多个不同网段的IPV6地址;但不同接口不能在同一网段 4、自动配置 1&#xff…

举例说明 如何判断Spark作业的瓶颈

首先看哪个Job执行时间长: 例如下图中明显Job 2时间执行最长,这个对rdd作业是直观有效的。 对于sql作业可能不准确,sql需要关注stage的详情耗时。 然后看执行时间长的Job中哪个stage执行时间长: 明显stage 7和stage 13执行时间长&…

Kafka内外网分流配置listeners和advertised.listeners

问题背景: Kafka部署在内网,内网Java服务会使用Kafka收发消息,另外,Java服务会与其他第三方系统使用kafka实现数据同步,也就是外网也会发送消息到kafka,外网IP做了端口映射到了内网,advertised…

经验分享,如何去除文本中的空格

有时候我们需要去掉一窜文本中的空格,这里分享一个好用的免费网站,可实现在线去除 网址:http://www.txttool.com/t/?idMzM4 使用截图: