opencv进阶19-基于opencv 决策树cv::ml::DTrees 实现demo示例

opencv 中创建决策树

cv::ml::DTrees类表示单个决策树或决策树集合,它是RTrees和
Boost的基类。

CART是二叉树,可用于分类或回归。对于分类,每个叶子节点都
标有类标签,多个叶子节点可能具有相同的标签。对于回归,每个叶
子节点都被分配了常数,因此近似函数是分段常数。

  1. 创建空决策树
    cv::ml::DTrees::create函数可使用指定的参数创建空决策树,
    之后使用cv::ml::StatModel::train函数训练该决策树模型;或者使用Algorithm::load (filename)从文件中加载决策树模型。

  2. 模型的基本设置
    以下是构建决策树模型的必要参数,绝大部分参数有默认值

  • MaxDepth:树的最大可能深度

根节点的深度为零,训练算法在深度小于MaxDepth时尝试切分节
点。如果满足其他终止标准,或者树被修剪,则实际深度可以更小。默认值为INT_MAX。

设置或获取参数MaxDepth的方法如下:

在这里插入图片描述

  • MinSampleCount:节点中的最小样本数

如果节点中的样本数小于MinSampleCount,则不会切分该节点。
默认值为10。

设置或获取参数MinSampleCount的方法如下:

在这里插入图片描述

  • RegressionAccuracy:回归树的终止标准

如果节点中的估计值与该节点中的样本值之间的所有绝对差值小
于该参数,则该节点不会被进一步切分。默认值为0.01f。

设置或获取参数RegressionAccuracy的方法如下:

在这里插入图片描述

  • MaxCategories:表示特征属性为类形式时最大类的数量

算法会将分类变量的可能值聚类到K≤MaxCategories群集中,以
便找到次优切分。如果训练过程尝试进行切分的离散变量需要超过
MaxCategories值,则寻找精确的最佳子集可能需要很长时间。许多决策树引擎(包括OpenCV的实现)在这种情况下将尝试通过把所有样本聚类到MaxCategories集群中来寻找次优切分,其中,某些类别会被合并在一起。

对于具有N>MaxCategories可能值的分类变量,聚类仅应用于n>2类的分类问题。在回归和只有2类分类的情况下,不采用聚类也可以有效地找到最优切分,因此在n≤2时不使用该参数。默认值为10。

设置或获取参数MaxCategories的方法如下:

在这里插入图片描述

  • CVFolds:使用k折叠交叉验证剪枝时的交叉验证折数

如果CVFolds>1,则算法使用k折叠交叉验证程序修剪构建的决策
树,其中,k=CVFolds,默认值为10。

设置或获取参数CVFolds的方法如下:

在这里插入图片描述

  • Use1SERule:应用1SE规则剪枝标志位

如果标志位为true,剪枝将应用1SE规则,这将使树更紧凑,更能
抵抗训练数据噪声,但准确度稍差。默认值为true。

设置或获取参数Use1SERule的方法如下:

在这里插入图片描述

  • TruncatePrunedTree:截断剪枝树标志位,默认值为true

如果标志位为true,则从树中物理移除已修剪的分枝,否则它们
会被保留,并且可以从原始未修剪(或修剪得不那么大)的树中获得结果。

设置或获取参数truncatePrunedTree的方法如下:

在这里插入图片描述

  • priors:先验类概率Mat数组,默认值为空矩阵Priors=Mat()。

该参数可用于将决策树偏好调整到某个类。例如,想要检测一些
罕见的异常,即在训练集中正常比异常多很多,此时只需将每个案例都视为正常,即可实现非常好的分类性能。为了避免这种情况,可以指定先验,人为地增加异常概率(高达0.5,甚至更高),因此错误分类的异常权重变得更大,这样决策树就能做出适当地调整,以更好地检测异常样本。

还可以将此参数视为预测类别的权重,以确定为错误分类提供的
相对权重。也就是说,如果第一类别的权重是1,第二类别的权重是10,则预测第二类别的每个错误等同于在预测第一类别时犯10个错误。

设置或获取参数Priors的方法如下:

在这里插入图片描述

  • UseSurrogates:是否构建代理切分标志位

如果为true,那么将建立代理切分。代理切分指的是,如果当前
样本缺少某些特征的值,那么该样本就无法继续沿着树向下切分,也就无法到达叶子节点,即没有预测输出。在这种情况下,可以利用当前节点下面的所有子节点中的叶子节点来预测输出的平均值,作为这个样本的预测输出,故称之为代理切分。当代理切分标志位为true时,允许使用缺少的数据。此外,如果需要计算特征(属性)的重要性,则需要将代理切分标志位设置为true

设置或获取参数UseSurrogates的方法如下:

在这里插入图片描述

训练决策树

与KNN一样,决策树也是使用cv::ml::StatModel::train函数(简
称train函数)来训练模型的。

train函数:

在这里插入图片描述
函数参数:

  • samples:训练集。
  • layout:指定训练集的样本排列方式。具体如下:
    • ROW_SAMPLE:每个训练样本占一行的训练集。
    • COL_SAMPLE:每个训练样本占一列的训练集。
  • responses与训练集样本排列顺序对应的标签向量。

树从根节点开始递归构建,所有训练数据(特征向量和响应)用
于切分根节点。在每个节点中,基于某些标准找到最佳决策规则(最佳“主要”切分)。

如前文所述,在训练中基尼系数表示的“不纯度”用于分类,均方误差之和用于回归。如有必要,找到代理切分。

它们类似于训练数据的主要切分结果。使用左子节点和右子节点之间的主要和替代切分(就像在预测过程中完成的那样)来划分所有数据。该过程以递归方式切分左右节点。当出现以下任意一种情况时,每个节点的递归过程都可能会停止。

  • 构造的树分支的深度已达到指定的最大值。
  • 当统计上没有进一步切分节点时,节点中的训练样本数小于指
    定的阈值。
  • 节点中的所有样本属于同一类,或者在回归的情况下,变化太
    小。
  • 与随机选择相比,最佳找到的切分没有任何明显的改善。
    在构建决策树时,如有必要,可以使用交叉验证程序对其进行修剪。通常,此过程仅适用于独立决策树。如果构建的树过小,则应使用自己的方案防止过拟合。

使用决策树预测

训练好的决策树模型不仅可以根据输入样本特征向量获得响应,
还可以利用决策树计算变量的重要性。

  1. 预测过程
    了解OpenCV中决策树模型的预测过程,有助于我们理解决策树的
    原理并更好地应用它。决策树的预测过程从根节点开始,从每个非叶
    子节点开始,过程向左(选择左子节点作为下一个观察节点)或向右
    移动,基于某个变量的值,该变量的索引存储在被观察节点中。连续
    变量与分类变量的预测过程如下。

连续变量。将变量值与存储在节点中的阈值进行比较。如果该值
小于阈值,则过程向左移动,否则向右移动。例如,如果重量小于1千克,则程序向左移动,否则向右移动。

分类变量。测试离散变量值,从变量可以采用的有限值集合中查
看它是否属于某个值的子集(也存储在节点中)。如果是,则向左移动,否则向右移动。例如,如果颜色为绿色或红色,请转到左侧,否则转到右侧。

在 每 个 节 点 中 , 都 使 用 了 ( variable_index ( 阈 值 ) ,
decision_rule(子集))这样一对实体。这样一对实体被称为一个切分(在variable_index上的切分)。一旦到达叶子节点,分配给该节点的值将用作预测输出。

有时,输入向量的某些特征缺失会导致预测过程卡在某个节点
中。为了避免这种情况,决策树使用代理切分。也就是说,除最佳的“主要”切分外,每个树节点也可以被分成具有几乎相同结果的一个或多个其他变量。

决策树模型与其他机器学习模型一样,测试可以分为一次测试一
个(多个)样本或者一次性测试整个数据集上的误差。

1)一次测试一个或多个样本

使用标准的cv::ml::StatModel::predict函数(简称predict函
数)预测所提供样本的响应。

predict函数:

在这里插入图片描述

函数参数:

  • samples:输入样本,浮点型矩阵。
  • results:可选的输出结果矩阵。
  • flags : 可 选 标 志 , 取 决 于 模 型 。 参 阅
    cv::ml::StatModel::Flags函数。

2)一次性测试整个数据集上的误差

使用标准的cv::ml::StatModel::calcError函数(简称calcError
函数)可以测试整个数据集上的误差。该函数使用predict函数来计算错误。对于回归模型,误差计算使用均方误差MSE;对于分类模型,计算错误分类样本的百分比(0%~100%)。

calcError函数:

在这里插入图片描述

函数参数:

  • data:可以是TrainData类型的训练数据或者测试数据。
  • test:如果为true,则在数据的测试子集上计算误差,否则在
    数据的训练子集上计算误差。注意,如果加载了一个完全不同的数据集 来 评 估 已 经 训 练 过 的 模 型 , 则 不 需 要 使 用
    TrainData::setTrainTestSplitRatio方法设置切分测试子集,此时无论test=true还是test=false,都将计算整个新数据集的误差。
  • resp:可选的输出响应。
  1. 计算变量的重要性
    决策树不仅可用于预测,还可用于各种数据分析。前文曾介绍
    过,选择最佳切分属性是决策树的关键。因此决策树具有计算每个样本属性(特征)的重要性的能力,在OpenCV中称之为计算变量重要性。例如,当使用邮件信息中出现的一组单词作为特征向量的垃圾邮件过滤器时,变量重要性评级可用于确定最“垃圾邮件指示”单词,从而有助于保持字典大小合理。

应用示例

import cv2
import numpy as np# 创建一个决策树分类器
decision_tree = cv2.ml.DTrees_create()# 创建一些训练数据
train_data = np.array([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0], [10.0, 12.0], [11.0, 13.0]], dtype=np.float32)
responses = np.array([0, 0, 0, 1, 1], dtype=np.int32)# 进行PCA降维
num_components = 1
pca = cv2.PCACompute(train_data, mean=None, maxComponents=num_components)# 使用PCA进行降维
train_data_reduced = cv2.PCAProject(train_data, pca[0])# 创建一个决策树分类器
decision_tree = cv2.ml.DTrees_create()# 设置决策树参数
params = dict(maxDepth=2)
decision_tree.setCVFolds(1)  # 设置交叉验证折数# 将降维后的训练数据与类别标签整合为训练集
train_data_with_labels = cv2.ml.TrainData_create(samples=train_data_reduced,layout=cv2.ml.ROW_SAMPLE,responses=responses)# 训练决策树分类器
decision_tree.train(train_data_with_labels)# 创建一个测试样本并进行降维
test_sample = np.array([[2.5, 3.5]], dtype=np.float32)
test_sample_reduced = cv2.PCAProject(test_sample, pca[0])# 使用决策树进行预测
result = decision_tree.predict(test_sample_reduced)
print("Predicted class:", result[1][0][0])

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

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

相关文章

【Acwing291】蒙德里安的梦想(状态压缩dp)详细讲解

题目描述 题目分析 显而易见的重要事实 首先,需要明白一个很重要的事实: 所有的摆放方案数所有横着摆放且合理的方案数 这是因为,横着的确定之后,竖着的一定会被唯一确定,举一个例子: ------唯一确定-…

RabbitMQ---订阅模型-Fanout

1、 订阅模型-Fanout Fanout,也称为广播。 流程图: 在广播模式下,消息发送流程是这样的: 1) 可以有多个消费者 2) 每个消费者有自己的queue(队列) 3) 每个队列都要绑定…

Windows 10【压缩卷】操作报错【无法将卷压缩到超出任何不可移动的文件所在的点】的解决方法

目录 一、背景 二、原因 三、解决方法 3.1 Windows自带的碎片清理工具 3.1.1 操作步骤 3.1.2 操作结果 3.2 MyDefrag工具清理磁盘碎片 3.2.1 操作步骤 3.2.2 操作结果 3.3 Windows自带的事件查看器 3.3.1 操作步骤 3.3.2 操作结果 3.4 关闭虚拟内存并删除虚拟内存…

离谱事件解决方法2 无法定位程序输入点XXX于动态链接库XXX.dll

事情经过: 本人一只acmer,使用sublime编写代码,但是前两天在打开cpp类型的文件的时候显示报错如下: 这里的dll文件就是动态链接库,它并不是一个可执行文件,里面存放的是程序的函数实现过程(公用…

django+MySQL计算机毕设之图片推荐系统(报告+源码)

图片推荐系统是在的数据存储主要通过MySQL。用户在使用应用时产生的数据通过Python语言传递给数据库。通过此方式促进图片推荐信息流动和数据传输效率,提供一个内容丰富、功能多样、易于操作的平台。述了数据库的设计,系统的详细设计部分主要论述了几个主…

Ubuntu释放VMware虚拟磁盘未使用空间

By: Ailson Jack Date: 2023.08.26 个人博客:http://www.only2fire.com/ 本文在我博客的地址是:http://www.only2fire.com/archives/152.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。…

面试之快速学习计算机网络-http

1. HTTP常见状态码 2. 3开头重定向,4开头客户端错误,5开头服务端错误 2. HTTP 报文 1. start-line:请求行,可以为以下两者之一: 请求行: GET /hello-world2.html HTTP/1.1状态行:HTTP/1.1 200…

YOLOv8教程系列:三、K折交叉验证——让你的每一份标注数据都物尽其用(yolov8目标检测+k折交叉验证法)

YOLOv8教程系列:三、K折交叉验证——让你的每一份标注数据都物尽其用(yolov8目标检测k折交叉验证法) 0.引言 k折交叉验证(K-Fold Cross-Validation)是一种在机器学习中常用的模型评估技术,用于估计模型的性…

JavaScript(笔记)

目录 Hello World JavaScript 的变量 JavaScript 动态类型 隐式类型转换 JavaScript 数组 JavaScript 函数 JavaScript 中变量的作用域 对象 DOM 选中页面元素 事件 获取 / 修改元素内容 获取 / 修改元素属性 获取 / 修改 表单元素属性 获取 / 修改样式属性 新…

Java版B/S架构 智慧工地源码,PC、移动、数据可视化智慧大屏端源码

智慧工地是什么?智慧工地主要围绕绿色施工、安全管控、劳务管理、智能管理、集成总控等方面,帮助工地解决运营、管理方面各个难点痛点。在互联网的加持下促进项目现场管理的创新与发展,实现工程管理人员与工程施工现场的整合,构建…

[机缘参悟-102] :IT人 - 管理的本质?管理人与从事技术的本质区别?人性、冰山模型、需求层次模型

感悟: 管理的本质是:学习各种管理理论、方法、技能,克服自身的人性缺点、预防他人人性的恶点、利用他人的人性特点拿到结果,从而完成组织、管理者的上司、管理者自身、管理者下属的目标。管理中的问题,80%以上都人性问…

rtmp直播

技术要求:nginxnginx-rtmpffmpegVLC 跟着大佬走的: 传送门 准备工作: 首先需要一台公网ip的服务器 这是使用天翼云的弹性云主机:免费试用1个月 天翼云官网 点击关机,更多里面选择重置密码, 默认用户名为…

根据案例写PLC程序-红绿灯控制

案例: 1、南北方向红灯点亮30s后熄灭; 2、在点亮南北方向红灯的同时点亮东西方向绿灯,并在点亮25s后,以0.5s熄灭0.5s点亮的时间闪烁3次后熄灭; 3、在东西方向绿灯熄灭后,东西方向黄灯点亮2s后熄灭&#xff…

数据库的增量备份与差异备份

在当今数字时代,数据已经成为公司的主要资产。为了维护这些珍贵的数据,公司通常会采取各种数据保护措施,其中增量备份是一种很有效的方法。本文将详细介绍什么是数据库的增量备份,以及如何帮助企业更有效地维护数据。  我们需要…

HTML+CSS 查漏补缺

目录 1,HTML1,尺寸的百分比1,普通元素2,绝对(固定)定位元素3,常见百分比 2,form 表单元素1,form2,button3,label4,outline5&#xff0…

Multisim软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Multisim软件是一款电路仿真和设计软件,由美国国家仪器公司(National Instruments)开发。它提供了一个交互式的图形界面,使用户能够轻松地构建和仿真电路。以下是Multisim软件的详…

《扩散模型 从原理到实战》Hugging Face (一)

文章目录 前言第一章 扩散模型简介1.1 扩散模型的原理1.1.1 生成模型1.1.2 扩散过程 前言 Hugging Face最近出版了第一本中文书籍《扩散模型 从原理到实战》,其中内容关于扩散模型(Diffusion Model),和AIGC相关的内容较多&#x…

2023企业网盘产品排行榜揭晓:选择最适合你的企业网盘工具

企业网盘产品已成为企业文件管理协作的主要选择之一,无论是在文件管理方面,还是团队协作上,企业网盘都表现优秀。为了帮助企业选到心怡的企业网盘产品,我们综合了不同的产品测评网站意见,整理了2023企业网盘产品排行榜…

【游戏开发教程】Unity Cinemachine快速上手,详细案例讲解(虚拟相机系统 | 新发出品 | 良心教程)

文章目录 一、前言二、插件下载三、案例1:第三人称自由视角,Free Look character场景1、场景演示2、组件参数2.1、CinemachineBrain:核心2.2、CinemachineFreeLook:第三人称自由视角相机2.2.1、设置Follow:跟随2.2.2、…

phpstorm动态调试

首先在phpstudy搭建好网站,在管理拓展开启xdebug拓展 查看php.ini配置已经更改 需要增添修改一下设置 [Xdebug] zend_extensionD:/phpstudy_pro/Extensions/php/php5.6.9nts/ext/php_xdebug.dll xdebug.collect_params1 xdebug.collect_return1 xdebug.auto_trace…