VS2017+OpenCV4.5.5 决策树-评估是否发放贷款

news2024/9/25 15:26:09

决策树是一种非参数的监督学习方法,主要用于分类和回归。

决策树结构

在这里插入图片描述
决策树在逻辑上以树的形式存在,包含根节点、内部结点和叶节点。

  • 根节点:包含数据集中的所有数据的集合
  • 内部节点:每个内部节点为一个判断条件,并且包含数据集中满足从根节点到该节点所有条件的数据的集合。根据内部结点的判断条件测试结果,内部节点对应的数据的集合别分到两个或多个子节点中。
  • 叶节点:叶节点为最终的类别,被包含在该叶节点的数据属于该类别。

决策树学习的 3 个步骤

特征选择

在构建决策树的过程中,选择最佳(既能够快速分类,又能使决策树的深度最小)的分叉特征属性是关键所在。这种“最佳性”可以用非纯度进行衡量。如果一个数据集合中只有一种分类结果,则该集合最纯,即一致性好;反之,有许多分类,则不纯,即一致性不好。
一般的原则是,希望通过不断划分节点,使得一个分支节点包含的数据尽可能的属于同一个类别,即“纯度“越来越高。
常用的准则有:熵,基尼指数和分类误差, 公式分别为:

E n t r o p y = E ( D ) = − ∑ j = 1 J p j log ⁡ 2 p j Entropy = E(D) = -\sum_{j=1}^Jp_j\log_2p_j Entropy=E(D)=j=1Jpjlog2pj
G i n i I n d e x = G i n i ( D ) = ∑ j = 1 J p j ( 1 − p j ) = ∑ j = 1 J p j − ∑ j = 1 J p j 2 = 1 − ∑ j = 1 J p j 2 Gini Index = Gini(D) = \sum_{j=1}^Jp_j(1-p_j) = \sum_{j=1}^Jp_j - \sum_{j=1}^Jp_j^2 = 1 - \sum_{j=1}^Jp_j^2 GiniIndex=Gini(D)=j=1Jpj(1pj)=j=1Jpjj=1Jpj2=1j=1Jpj2

C l a s s i f i c a t i o n E r r o e = 1 − max ⁡ { p j } Classification Erroe = 1- \max{\{p_j\}} ClassificationErroe=1max{pj}

上述,所有公式中,值越大表示越不纯;式中, D D D表示样本数据的分类及和。设该集合共有 J J J中分类, p j p_j pj表示第 j j j种分类的样本率:
p j = N j N p_j = \frac{N_j}{N} pj=NNj
式中, N N N N j N_j Nj分辨表示集合 D D D中样本数据的总数和第 j j j个分类的样本数量。

决策树生成

选择好特征后,就从根节点触发,对节点计算所有特征的信息增益,选择信息增益最大的特征作为节点特征,根据该特征的不同取值建立子节点;对每个子节点使用相同的方式生成新的子节点,直到信息增益很小或者没有特征可以选择为止。

决策树剪枝

剪枝的主要目的是对抗「过拟合」,通过主动去掉部分分支来降低过拟合的风险。

决策树算法

ID3 算法
ID3 是最早提出的决策树算法,他就是利用信息增益来选择特征的。

C4.5 算法
他是 ID3 的改进版,他不是直接使用信息增益,而是引入“信息增益比”指标作为特征的选择依据。

CART(Classification and Regression Tree)
这种算法即可以用于分类,也可以用于回归问题。CART 算法使用了基尼系数取代了信息熵模型。

测试用例-评估是否发放贷款

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/ml/ml.hpp>

using namespace std;
using namespace cv;
using namespace cv::ml;

static const char* var_desc[] = 
{
	"Age (young=Y, middle=M, old=O)",
	"Salary? (Low=L, medium=M, high=H)",
	"Own_House? (false=N, true=Y)",
	"Own_Car? (false=N, true=Y)",
	"Credit_Rating (fair=F, good=G, excellent=E",
	0
};

int main(int argc, char *argv[])
{
	//训练样本:年龄,薪水,房子,车,信贷情况
	float trainData[19][5] = { 
	{'Y','L','N','N','F'},
	{'Y','L','Y','N','G'},
	{'Y','M','Y','N','G'},
	{'Y','M','Y','Y','G'},
	{'Y','H','Y','Y','G'},
	{'Y','M','N','Y','G'},
	{'M','L','Y','Y','E'},
	{'M','H','Y','Y','G'},
	{'M','L','N','Y','G'},
	{'M','M','Y','Y','F'},
	{'M','H','Y','Y','E'},
	{'M','L','N','N','G'},
	{'O','L','N','N','G'},
	{'O','L','Y','Y','E'},
	{'O','L','Y','N','E'},
	{'O','M','N','Y','G'},
	{'O','L','N','N','E'},
	{'O','H','N','Y','F'},
	{'O','H','Y','Y','E'},
	};
	Mat trainDataMat(19, 5, CV_32FC1, trainData);
	//cout << trainDataMat << endl;
	//训练样本的响应值,1代表G  -1代表B    
	float labels[19] = { 'N' ,'N' ,'Y','Y','Y','N','Y','Y','N' ,'N','Y','N' ,'N' ,'Y','Y','N' ,'N' ,'N' ,'Y' };
	Mat labelsMat(19, 1, CV_32FC1, labels);
	//cout << labelsMat << endl;

	//建立模型
	Ptr<DTrees> model = DTrees::create();
	//树的最大可能深度
	model->setMaxDepth(8);
	//节点最小样本数量
	model->setMinSampleCount(2);
	//是否建立替代分裂点
	model->setUseSurrogates(false);
	//交叉验证次数
	model->setCVFolds(0);
	//是否严格修剪
	model->setUse1SERule(false);
	//分支是否完全移除
	model->setTruncatePrunedTree(false);
	//创建TrainData并进行训练
	Ptr<TrainData> tData = TrainData::create(trainDataMat, ROW_SAMPLE, labelsMat);
	model->train(tData);

	//保存决策树为xml文件
	const std::string save_file{ "decision_tree_model.xml" }; // .xml, .yaml, .jsons
	model->save(save_file);

	float myData[5] = { 'M','H','Y','N','F'};//测试样本
	Mat myDataMat(5, 1, CV_32FC1, myData);
	//利用训练好的分类器进行测试样本预测
	cv::Mat rMat;
	double r = model->predict(myDataMat, rMat, false);
	std::cout << "result: " << (char)r <<endl;

	//测试加载保存的决策树进行预测
	Ptr<DTrees> dtree = DTrees::load("decision_tree_model.xml");
	r = dtree->predict(myDataMat, rMat, false);
	std::cout << "result: " << (char)r << endl;

	return 0;
}

结果:

result: N
result: N

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

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

相关文章

mysql详解之innoDB

索引 Mysql由索引组织&#xff0c;所以索引是mysql多重要概念之一。 聚簇索引 InnoDB和MyISAm一样都是采用B树结构&#xff0c;但不同点在于InnoDB是聚簇索引&#xff08;或聚集索引&#xff09;&#xff0c;将数据行直接放在叶子节点后面。 这里可能存在一个误区&#xff1…

【C语言】编程初学者入门训练(14)

文章目录131. kiki学结构体和指针132. kiki定义电子日历类133. 圣诞树134. 超级圣诞树131. kiki学结构体和指针 问题描述&#xff1a;KiKi学习了结构体和指针&#xff0c;他了解了结构体类型可以定义包含多个不同类型成员&#xff0c;而指针本质是内存地址&#xff0c;是引用数…

【人脸检测】Yolov5Face:优秀的one-stage人脸检测算法

论文题目&#xff1a;《YOLO5Face: Why Reinventing a Face Detector》 论文地址&#xff1a;https://arxiv.org/pdf/2105.12931.pdf 代码地址&#xff1a;https://github.com/deepcam-cn/yolov5-face 1.简介 近年来&#xff0c;CNN在人脸检测方面已经得到广泛的应用。但是许多…

【C++的OpenCV】第一课-opencv的间接和安装(Linux环境下)

第一课-目录一、基本介绍1.1 官网1.2 git源码1.3 介绍二、OpenCV的相关部署工作2.1 Linux平台下部署OpenCV一、基本介绍 1.1 官网 opencv官网 注意&#xff1a;官网为英文版本&#xff0c;可以使用浏览器自带的翻译插件进行翻译&#xff0c;真心不推荐大家去看别人翻译的&am…

过滤器和监听器

1、过滤器Filter 作用是防止SQL注入、参数过滤、防止页面攻击、空参数矫正、Token校验、Session验证、点击率统计等等&#xff1b; 使用Filter的步骤 新建类&#xff0c;实现Filter抽象类&#xff1b;重写init、doFilter、destroy方法&#xff1b;在SpringBoot入口中添加注解…

演示Ansible中的角色使用方法(ansible roles)

文章目录一、ansible 角色简介二、roles目录结构三、role存放的路径&#xff1a;配置文件ansible.cfg中定义四、创建目录结构五、playbook中使用rolesplaybook变量会覆盖roles中的定义变量六、控制任务执行顺序七、ansible—galaxy命令工具八、安装选择的角色1.从网上下载&…

使用vue3,vite,less,flask,python从零开始学习硅谷外卖(41-82集)

第41集&#xff1a;这里遇到个大坑&#xff0c;因为这种项目有很多页面&#xff0c;有时候有的页面忘了保存就会出错&#xff0c;还很难排查&#xff0c;浪费了我快半天的时间。可以把vscode的代码自动保存打开&#xff0c;以后就不会踩坑了。 第42集&#xff1a;没啥好说的。 …

判断字符串中的字符的类型isdecimal();isalpha();isdigit();isalnum()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 判断字符串中的字符的类型 isdecimal()&#xff1b;isalpha()&#xff1b;isdigit()&#xff1b;isalnum() [太阳]选择题 对于代码中isdecimal()和isalnum()输出的结果是? s "ABc123&…

亿级高并发电商项目-- 实战篇 --万达商城项目 十一(编写商品搜索功能、操作商品同步到ES、安装RabbitMQ与Erlang,配置监听队列与消息队列)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…

Sandboxie-沙箱软件-Plus版本(Qt)-主框架程序-SandMan.exe-创建语言文件-tr-Qt-语言国际化

文章目录1.功能介绍2.Qt语言国际化3.设置软件的语言版本4.作者答疑1.功能介绍 沙箱软件的增强版本采用Qt架构开发&#xff0c;核心模块与经典版本相同&#xff0c;本文主要介绍SandMan.exe这个主程序代码。在main.cpp这个入口函数里&#xff0c;有主窗口入口&#xff0c;如下所…

2.5|iot冯|方元-嵌入式linux系统开发入门|2.13+2.18

一、 Linux 指令操作题&#xff08;共5题&#xff08;共 20 分&#xff0c;每小题 4分&#xff09;与系统工作、系统状态、工作目录、文件、目录、打包压缩与搜索等主题相关。1.文件1.1文件属性1.2文件类型属性字段的第1个字符表示文件类型&#xff0c;后9个字符中&#xff0c;…

【物联网】智慧农业病虫害精准辨识竞赛思路及代码分享

来源&#xff1a;投稿 作者&#xff1a;LSC 编辑&#xff1a;学姐 比赛官网: https://www.dataglobal.cn/cmpt/signUpInfo200.html 任务描述 请参赛者设计智慧农业病虫害检测系统&#xff0c;给出一体化问题解决方案&#xff0c;鼓励参赛选手结合某一果园/农作物实际情况建立…

使用 URLSearchParams 解析和管理URL query参数

介绍 首先 URLSearchParams是一个构造函数&#xff0c;会生成一个URLSearchParams对象&#xff0c;参数类型&#xff1a; 不传 &#xff5c; string &#xff5c; object &#xff5c; URLSearchParams&#xff0c; 并且遇到特殊字符它会自动帮我们encode 和 decode const ur…

Java模块化概述

3 模块化 3.1 模块化概述 Java语言随着这些年的发展已经成为了一]影响深远的编程语言&#xff0c;无数平台,系统都采用Java语言编写。但是&#xff0c;伴随着发展&#xff0c;Java也越来越庞大&#xff0c;逐渐发展成为-门“臃肿” 的语言。而且&#xff0c;无论是运行个大型的…

Vulnhub 渗透练习(五)—— lazysysadmin1

环境搭建 下载链接 vmware 打开靶机&#xff0c;nat 网络适配&#xff0c;攻击机同样。 信息收集 一个一个的看过去&#xff0c;这边就不贴图了。 漏洞挖掘 用 kail 的 wpscan 扫一下 wordpress&#xff0c;没发现漏洞。 ┌──(geng㉿geng)-[~] └─$ wpscan --url http…

【Linux06-基础IO】4.5万字的基础IO讲解

前言 本期分享基础IO的知识&#xff0c;主要有&#xff1a; 复习C语言文件操作文件相关的系统调用文件描述符fd理解Linux下一切皆文件缓冲区文件系统软硬链接动静态库的理解和制作动静态编译 博主水平有限&#xff0c;不足之处望请斧正&#xff01; C语言文件操作 #再谈文件…

SQLSERVER2019安装步骤过程

第一步官网下载SQLSERVER软件包 目前官网只能下载最新版本2022版本。 通过迅雷下载网址 SQL Server 2019 Enterprise (x64) - DVD (Chinese-Simplified)企业版 ed2k://|file|cn_sql_server_2019_enterprise_x64_dvd_2bfe815a.iso|1632086016|58C258FF0F1D006DD3C1F5F17AF3E…

ELK_Elasticsearch环境搭建

目录 一、Windows安装elasticsearch 1、安装JDK 2、下载和解压 3、配置文件 4、启动 5、检查ES是否启动成功 6、浏览器访问 二、 Windows安装Kibana 一、Windows安装elasticsearch 1、安装JDK 安装JDK&#xff0c;至少1.8.0_73以上版本&#xff0c;验证&#xff1a;j…

dbForge Source Control for SQL Server 2.5.X Crack

SQL Server功能概述 的 dbForge 源代码管理 dbForge Source Control for SQL Server 是一个可视化的 SSMS 插件&#xff0c;具有简单易用的界面&#xff0c;可帮助您轻松跟踪 SQL Server 数据库对象中的更改内容、更改时间和原因。该工具使您能够将数据库连接到多个版本控制系统…

【Python学习笔记】40.Python3 SMTP发送邮件

前言 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则&#xff0c;由它来控制信件的中转方式。 Python3 SMTP发送邮件 python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了…