决策树原理及应用

news2025/1/13 10:31:06

目录

一、决策树概述

1.1决策树的组成

1.2构建决策树

1.3决策树的剪枝

1.4决策树的优点和缺点

二、决策树在计算机视觉中的应用

三、基于决策树的图像分类实例


一、决策树概述

决策树是一种非常流行的机器学习算法,它用树状图的形式来表示决策过程。决策树可以用于分类任务和回归任务,其基本思想是将复杂的决策拆解成一系列更简单的决策。

1.1决策树的组成

决策树主要由节点和边组成:

  • 根节点:包含整个数据集。
  • 内部节点:表示一个特征或属性。
  • 叶节点(或终端节点):表示决策结果。

每一个内部节点代表一个测试(通常是某个特征的阈值),每一条边代表测试的一个结果,而每个叶节点代表一个预测分类或数值。

1.2构建决策树

决策树的构建通常基于递归分裂的方式:

  1. 选择最优特征:从当前数据集中选择最佳分裂特征。常用的方法包括信息增益(基于熵)、增益率和基尼不纯度。
  2. 分裂过程:基于选择的特征进行数据分裂,生成子节点。
  3. 递归构建:对分裂后的每个子数据集重复上述过程,直到满足停止条件,如节点数据量小于某个阈值、达到最大深度或节点的纯度已足够高。

1.3决策树的剪枝

为了防止过拟合,决策树在构建完成后常常需要进行剪枝。剪枝有两种基本类型:

  • 预剪枝:在决策树完全生成之前就停止其生长。
  • 后剪枝:先让树完全生长,然后去掉对最终预测准确度贡献不大的部分。

1.4决策树的优点和缺点

优点

  • 易于理解和解释,可以直观地展示决策过程。
  • 对于数据的准备要求不高,不需要进行数据规范化。
  • 能够同时处理数据型和类别型变量。

缺点

  • 容易过拟合,特别是当树的深度很大时。
  • 对于有些类型的问题,如异或问题,决策树的效果不是很好。
  • 对于连续性的字段切分不够理想,容易产生偏差。

二、决策树在计算机视觉中的应用

决策树在计算机视觉领域的应用广泛且多样,主要是因为其能够处理复杂的数据结构,同时提供易于解释的决策过程。以下是一些具体的应用场景:

  1. 图像分类

    • 决策树(及其集成版本,如随机森林和梯度提升树)经常被用于图像分类任务。通过训练模型识别和利用图像中的特征(如颜色、纹理、形状等),决策树可以有效地将图像分为不同的类别,例如区分不同类型的动物、植物或车辆。
  2. 物体检测与识别

    • 在物体检测任务中,决策树可以帮助确定图像中物体的位置和类别。例如,通过分析图像的特定区域和特征,决策树可以预测该区域是否包含某个特定的物体,并确定其边界框(bounding box)。
  3. 面部识别与分析

    • 决策树被用于面部识别系统中,帮助识别和验证个体身份。此外,它们也可以用于分析面部表情,判断个体的情绪状态。在这些应用中,决策树通过评估面部的各种特征(如眼睛、嘴巴的位置和大小)来进行分类。
  4. 图像分割

    • 决策树可以应用于图像分割,即将图像划分为多个区域或对象。例如,在医学成像中,决策树可以帮助识别和隔离不同的组织类型,对疾病的诊断提供支持。
  5. 动作识别

    • 在视频或实时监控中,决策树可以用于识别和分类不同的人体动作。通过分析连续帧之间的变化,决策树可以帮助系统理解人体动作的模式。
  6. 图像恢复和超分辨率

    • 在图像恢复应用中,决策树有助于从损坏或低分辨率的图像中恢复出更清晰的图像。这通常涉及到对缺失或损坏的像素进行预测和填充。

在实际应用中,决策树通常与其他算法相结合,如深度学习网络,以充分利用各自的优点,提高整体的准确性和鲁棒性。例如,可以先用深度学习模型从图像中提取高级特征,然后使用决策树进行高效的分类决策。这种方法结合了深度学习的特征学习能力和决策树的快速决策能力。

三、基于决策树的图像分类实例

这里我们将使用Python的scikit-learn库来实现决策树分类器,同时使用skimage库来处理图像数据。我们将使用非常流行的MNIST手写数字数据集来进行分类。

首先,需要确保已经安装了以下Python库:

  • numpy
  • matplotlib (用于图像显示)
  • sklearn (提供决策树算法和数据预处理工具)
  • skimage (图像处理)

现在,我们将编写一个程序来加载数据集,预处理图像,并使用决策树进行分类。程序的步骤如下:

  1. 加载MNIST数据集。
  2. 预处理图像数据(例如,归一化)。
  3. 划分数据为训练集和测试集。
  4. 使用决策树模型进行训练。
  5. 评估模型性能。

代码:

这段代码将完成基本的图像分类任务。可以根据需要调整决策树的参数,比如max_depth来控制树的深度,或者min_samples_split来控制节点分裂所需的最小样本数。这些调整可以帮助优化模型的表现,减少过拟合的风险。

from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
import numpy as np

def load_data():
    # 加载MNIST数据集
    mnist = fetch_openml('mnist_784', version=1)
    # 数据集包含70000张28x28的图像
    data = mnist['data']
    target = mnist['target']
    return data, target

def preprocess_data(data):
    # 将数据归一化到0-1
    data_normalized = data / 255.0
    return data_normalized

def train_decision_tree(X_train, y_train):
    # 创建决策树模型
    clf = DecisionTreeClassifier(random_state=42)
    # 训练模型
    clf.fit(X_train, y_train)
    return clf

def evaluate_model(clf, X_test, y_test):
    # 使用测试集评估模型
    y_pred = clf.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    print("Accuracy:", accuracy)

def main():
    # 加载和预处理数据
    data, target = load_data()
    data = preprocess_data(data)
    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=42)
    # 训练决策树模型
    clf = train_decision_tree(X_train, y_train)
    # 评估模型
    evaluate_model(clf, X_test, y_test)

if __name__ == "__main__":
    main()

为了更直观地理解决策树模型在MNIST数据集上的分类效果,我们可以添加一些可视化的元素,包括显示一些图像样本和它们的预测结果,以及决策树的可视化。以下是完整的Python代码,其中增加了图像样本的显示和决策树结构的可视化功能:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.metrics import accuracy_score

def load_data():
    # 加载MNIST数据集
    mnist = fetch_openml('mnist_784', version=1)
    # 数据集包含70000张28x28的图像
    # 转换为numpy数组确保后续处理的兼容性
    data = np.array(mnist['data'], dtype=np.float32)  # 确保数据类型为float32
    target = np.array(mnist['target'], dtype=np.int64)  # 将标签转换为整数
    return data, target

def preprocess_data(data):
    # 将数据归一化到0-1
    data_normalized = data / 255.0
    return data_normalized

def train_decision_tree(X_train, y_train):
    # 创建决策树模型
    clf = DecisionTreeClassifier(random_state=42)
    # 训练模型
    clf.fit(X_train, y_train)
    return clf

def evaluate_model(clf, X_test, y_test):
    # 使用测试集评估模型
    y_pred = clf.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    print("Accuracy:", accuracy)
    return y_pred

def plot_sample_images(X_test, y_test, y_pred):
    # 显示9张图像和它们的预测标签
    plt.figure(figsize=(10, 10))
    for i in range(9):
        plt.subplot(3, 3, i + 1)
        image = X_test[i].reshape(28, 28)  # 确保数据以正确的形状重塑
        plt.imshow(image, cmap='gray')
        plt.title(f"True: {y_test[i]}, Pred: {y_pred[i]}")
        plt.axis('off')
    plt.tight_layout()
    plt.show()

def plot_decision_tree(clf):
    # 可视化决策树(显示前4层)
    plt.figure(figsize=(20,10))
    plot_tree(clf, max_depth=4, filled=True, fontsize=10, feature_names=[f"pixel_{i}" for i in range(784)])
    plt.show()

def main():
    # 加载和预处理数据
    data, target = load_data()
    data = preprocess_data(data)
    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=42)
    # 训练决策树模型
    clf = train_decision_tree(X_train, y_train)
    # 评估模型
    y_pred = evaluate_model(clf, X_test, y_test)
    # 可视化样本图像及预测结果
    plot_sample_images(X_test, y_test, y_pred)
    # 可视化决策树
    plot_decision_tree(clf)

if __name__ == "__main__":
    main()

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

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

相关文章

HarmonyOS开发实例:【分布式邮件】

概述 基于TS扩展的声明式开发范式编程语言编写的一个分布式邮件系统,可以由一台设备拉起另一台设备,每次改动邮件内容,都会同步更新两台设备的信息。效果图如下: 搭建OpenHarmony开发环境 完成本篇Codelab我们首先要完成开发环境…

NLP自然语言处理_序章

开一个新篇章,立一个flag,用一段时间来学习一下NLP,涨涨见识。 准备以B站 机器学习算法到transformer神经网络模型应用视频作为入门,此分类专门用于记录学习过程中的知识点以备自用。 一、何为NLP自然语言处理? NLP…

【ARFoundation自学01】搭建AR框架+检测平面+点击克隆立方体到地面=自信入门!

介绍 AR 的功能其实是个大手机系统厂商和眼镜设备厂商开发的功能,并不是Unity的功能,毕竟Unity没有自己的手机设备!比如谷歌公司的安卓开发了ARcore,让所有安卓8.0版本以上的用户能够在手机上体验AR功能!苹果推出了AR…

局域网无法连接怎么办?

局域网连接是我们日常生活和工作中常用的方式之一,但有时我们可能会遇到局域网无法连接的问题。这给我们的工作和生活带来了很大的困扰。本文将介绍局域网无法连接的常见原因,并推荐一款名为【天联】的组网产品,它能够解决不同地区间的局域网…

Meta Llama 3 简介

文章目录 要点我们对 Llama 3 的目标最先进的性能模型架构训练数据扩大预训练规模指令微调与 Llama 3 一起建造系统级责任方法大规模部署 Llama 3Llama 3 的下一步是什么?立即尝试 Meta Llama 3 本文翻译自:https://ai.meta.com/blog/meta-llama-3/ 要点…

Android开发:应用百度智能云中的身份证识别OCR实现获取个人信息的功能

百度智能云: 百度智能云是百度提供的公有云平台,于2015年正式开放运营。该平台秉承“用科技力量推动社会创新”的愿景,致力于将百度在云计算、大数据、人工智能的技术能力向社会输出。 百度智能云为金融、城市、医疗、客服与营销、能源、制造…

jeecgflow之camunda工作流-并行网关

引言 书接上回,继续三国流程系列教程。 本文主要讲解并行网关。 并行网关允许流程中的多个任务同时执行,从而提高流程的执行效率。 并行网关会忽视序列流上的条件设置。 并行网关分为两部分。 Fork: 用于任务开始 Join:用于任务结束 体验文章demo演示站…

HarmonyOS-静态库(SDK)的创建和使用

文章目录 一、静态库(SDK)二、创建静态库1.新建静态库模块2. 开发静态库内容3. 编译静态库 三、使用静态库1. 配置项目依赖2. 在应用中使用静态库3. 注意事项 四、打包错误1. library引用本地har包错误 一、静态库(SDK) 在Harmon…

美团财务科技Java后端一面:面向对象、类加载过程、全限定类名相同的类是否可以同时被加载

更多大厂面试内容可见 -> http://11come.cn 美团财务科技Java后端一面:面向对象、类加载过程、全限定类名相同的类是否可以同时被加载 如何理解面向对象? 面向对象 是具有对象概念的编程范式,面向对象将程序实现分为了一个个独立的对象&…

Vue.js------Vue组件基础

能够理解Vue组件概念和作用能够掌握封装创建组件能力能够使用组件之间通信能够完成todo案例 一.Vue组件创建和使用 1.折叠面板-实现多个 创建一个文件夹demo 具体步骤请参考vue.js---vue基础 ⚫ 解决方案: 采用vue提供的单.vue文件-组件方式来封装一套然后复用 在component…

Hadoop的安装及配置

8.下面我们开始安装配置Hadoop 1)首先下载hadoop-2.7.2的jar包 并添加到我们的jtxy1的/root/目录下 2)yum install在线安装软件 yum install net-tools //支持ifconfig yum install vim //支持vim yum install glibc.i686 --java命令不好使 3&am…

人工智能论文GPT-3(2):2020.5 Language Models are Few-Shot Learners;微调;少样本Few-Shot (FS)

2 方法Approach 我们的基本预训练方法,包括模型、数据和训练,与GPT-2中描述的过程相似,只是模型规模、数据集规模和多样性,以及训练时长有所扩大,相对简单直接。 我们使用的上下文学习也与GPT-2相似,但在…

Web程序设计-实验03 JavaScript语言基础

题目 【实验主题】 素数问题求解。计算(判断) 1~100中哪些是素数、哪些是合数。 素数也称为质数,是只能被1及其自身整除的自然数。与素数相对应的是合数,合数可以被分解为若干个素数的乘积,这些素数称为这个合数的质…

即席查询笔记

文章目录 一、Kylin4.x1、Kylin概述1.1 定义1.2 Kylin 架构1.3 Kylin 特点1.4 Kylin4.0 升级 2、Kylin 环境搭建2.1 简介2.2 Spark 安装和部署2.3 Kylin 安装和部署2.4 Kylin 启动环境准备2.5 Kylin 启动和关闭 3、快速入门3.1 数据准备3.2 Kylin项目创建入门3.3 Hive 和 Kylin…

Qt Debug模式下应用程序输出界面乱码【已解决】

Qt Debug模式下应用程序输出乱码 一、问题描述二、解决方法三、相关测试 一、问题描述 源码为utf-8编码. Qt Creator在Debug模式下运行程序,下方应用程序输出界面显示乱码. 但正常运行无乱码: 二、解决方法 尝试修改文件编码、执行编码无果… 可参考…

架构师系列-搜索引擎ElasticSearch(十)- 索引别名及重建

索引别名 别名,有点类似数据库的视图,别名一般都会和一些过滤条件相结合,可以做到即使是同一个索引上,让不同人看到不同的数据。 别名的作用 在开发中,一般随着业务需求的迭代,较老的业务逻辑就要面临更新…

小型燃气站3D可视化:打造安全高效的燃气新时代

随着科技的不断进步,越来越多的行业开始融入3D可视化技术,燃气行业也不例外。 小型燃气站作为城市燃气供应的重要节点,其安全性和运行效率至关重要。传统的燃气站管理方式往往依赖于人工巡检和纸质记录,这种方式不仅效率低下&…

JVM 讲解 (主要类加载其以及流程和机制(双亲委派))

JVM有什么用? 说白了,就是我们编写 Java 代码,编译 Java 代码,目的不是让它在 Linux、Windows 或者 MacOS 上跑,而是在 JVM 上跑。(保证只要有JVM这个东西,就可以跨平台使用Java) 可以把JVM想象…

事务的传播行为介绍和事务失效

常用的就下图介绍的这两种,REQUIRED 支持当前事务,如果不存在,就新建一个,EQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务 同一个service中必须用代理对象调用,否则失效

ADOP 万兆电口光模块:SFP+转RJ45端口解决方案

🌵在数据中心的接入层中,大多数服务器网卡(NIC)和存储设备都采用10GBASE-T RJ45端口,而与之相连的TOR(机架顶部)交换机通常配备SFP端口,且二者无法直接相连。为了解决该问题&#xf…