数据挖掘实验(四)Matlab实现CART算法【生成分类树/回归树】_分类回归决策树cart的研究与实现matlab_nefu-ljw的博客-程序员宅基地

技术标签: matlab  从零开始学Matlab  数据挖掘/机器学习  决策树  cart分类回归树  数据挖掘  

本文代码均已在 MATLAB R2019b 测试通过,如有错误,欢迎指正。

这次实验只要会调用Matlab现成的函数就行了,不用自己写CART算法。

(一)CART生成算法的基本原理

CART是分类与回归树的简称,最终结果是二叉树,可以用于分类,也可以用于回归问题。分类树的输出是样本的类别, 回归树的输出是一个实数。
自上而下从根开始建立节点,在每个节点处要选择一个最好的属性来分裂,使得子节点中的训练集尽量的纯。
分类问题,可以选择GINI作为纯度指标;
回归问题,可以使用最小二乘偏差(LSD)或最小绝对偏差(LAD)。

(二)问题描述

T餐饮企业作为大型的连锁企业,生产的产品种类比较多,另外涉及的分店所处的位置也不同、数目比较多。对于企业的高层来讲,了解周末和非周末销量是否有大的区别,以及天气、促销活动等因素是否能够影响门店的销量,对采取合理的营销策略,提高企业利润非常重要。因此,为了让决策者准确地了解和销量有关的一系列影响因素,需要构建模型来分析天气、是否周末和是否有促销等活动对其销量的影响。各属性的取值如下:

有三个条件属性,分别为:
属性1:天气属性,取值:好(多云、晴、多云转晴等适宜外出的天气)—1;坏(下雨等不适宜外出的天气)—0
属性2:是否周末,是—1;否—0
属性3:是否有促销,有—1;无—0

决策属性:产品的销售数量,以销售数量的均值为分界点,大于均值销量为高—1;小于均值销量为低—0

数据表如下:
在这里插入图片描述

(三)利用Matlab实现CART算法

clear;clc;

data=[
0	1	1	1
0	1	1	1
0	1	1	1
0	0	1	1
0	1	1	1
0	0	1	1
0	1	0	1
1	1	1	1
1	1	0	1
1	1	1	1
1	1	1	1
1	1	1	1
1	1	1	1
0	1	1	2
1	0	1	1
1	0	1	1
1	0	1	1
1	0	1	1
1	0	0	1
0	0	0	2
0	0	1	2
0	0	1	2
0	0	1	2
0	0	0	2
0	1	0	2
1	0	1	2
1	0	1	2
0	0	0	2
0	0	0	2
1	0	0	2
0	1	0	2
1	0	1	2
1	0	0	2
1	0	0	2
];

[n,m]=size(data); % n行m列
select_rand=randperm(n); % 对行的顺序产生一个随机排列
A=data(select_rand,:);  % 按产生的随机排列生成新数据集

fprintf("当前生成的新数据集:"); A

X=A(:,1:m-1);  % 条件属性
Y=A(:,m);    % 决策属性

% t1=fitrtree(X,Y); %生成回归的决策树,叶节点为实数
t1=fitctree(X,Y); % 生成分类的决策树,叶节点为类标号(整数)

%% 显示决策树
view(t1);
view(t1,'mode','graph'); 

%% 剪枝决策树
t2=prune(t,'level',1); % 根据level的取值,决定剪枝的层数,level=1表示剪枝最底一层
% 经测试,回归树是剪枝最低一层,但分类树是剪枝所有叶子

view(t2); % 显示剪枝后的树
view(t2,'mode','graph'); % 显示剪枝之后的树

%% 将数据集分成训练集和测试集两个集合,用训练集训练生成决策树,并用测试集来测试树的分类性能。
x=ceil(n/3); % 计算数据集的规模是3的多少倍数
A1=A(1:2*x,:); % 2/3用于训练决策树
A2=A(2*x+1:n,:); % 1/3用于测试决策树
test_data=A2(:,1:m-1); % 将测试数据中的条件属性提取出来

X1=A1(:,1:m-1);
Y1=A1(:,m);
t3=fitctree(X1,Y1); % 生成分类树
view(t3);
view(t3,'mode','graph'); % 查看树

Y_predict=predict(t3,test_data); % 根据训练集生成的分类树预测测试集上每个样本的类标号
[n2,m2]=size(A2); % 求测试集规模,即样本数量
accu=(n2-length(find(A2(:,m2)~=Y_predict(:,1))))/n2; % 求预测精度,length(find(A2(:,m2)~=yfit(:,1)))即预测错的个数 
fprintf("预测精度:%f\n",accu);

运行结果:

当前生成的新数据集:
A =

     0     0     1     2
     1     0     1     1
     1     1     1     1
     0     1     0     2
     1     0     0     1
     1     0     0     2
     1     0     0     2
     1     1     1     1
     0     1     1     1
     0     1     0     2
     1     1     1     1
     1     0     1     2
     0     1     1     1
     1     0     1     2
     0     1     1     1
     1     0     1     2
     0     0     0     2
     1     0     1     1
     1     1     0     1
     0     1     1     1
     1     0     1     1
     0     0     1     1
     0     0     1     1
     0     1     0     1
     1     1     1     1
     0     0     1     2
     0     0     0     2
     0     0     1     2
     0     1     1     2
     0     0     0     2
     1     0     0     2
     1     1     1     1
     0     0     0     2
     1     0     1     1


分类的决策树
1  if x2<0.5 then node 2 elseif x2>=0.5 then node 3 else 1
2  if x3<0.5 then node 4 elseif x3>=0.5 then node 5 else 2
3  class = 1
4  class = 2
5  if x1<0.5 then node 6 elseif x1>=0.5 then node 7 else 1
6  class = 2
7  class = 1


分类的决策树
1  if x2<0.5 then node 2 elseif x2>=0.5 then node 3 else 1
2  class = 2
3  class = 1


分类的决策树
1  if x2<0.5 then node 2 elseif x2>=0.5 then node 3 else 1
2  if x3<0.5 then node 4 elseif x3>=0.5 then node 5 else 2
3  class = 1
4  class = 2
5  class = 1

预测精度:0.700000

对应的三个决策树的图:

t1决策树:
在这里插入图片描述
t2决策树(t1剪枝一层):
在这里插入图片描述
t3决策树:
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ljw_study_in_CSDN/article/details/109589755

智能推荐

JAVA基本数据类型及其对应的包装类_java基本数据类型包装类-程序员宅基地

一、JAVA中的八种基本类型1、数字类型(6种) ①byte: 占的位数:byte数据类型占八位; 最小值为:-128(-2^7); 最大值为:127(2^7-1); 默认值为:0; 作用:byte数据类型主要用于在大型数组中节约空间,用来代替整型,因为byte类型只占八位,占用的空间只有int型的1/4;②short: 占..._java基本数据类型包装类

ORA-02292违反完整约束和ORA-02297无法禁用约束条件 cascade禁用主键-程序员宅基地

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29863023/viewspace-1352988/ORACLE 中delete时出现ORA-02292:违反完整约束条件 错误该表中存在主键或外键,可以先禁用。于是用: alter table hx_tb.tabs modify constraint FK_fk1 disable; ...

泛光+高斯模糊-程序员宅基地

一: 泛光明亮的光源和区域经常很难向观察者表达出来,因为监视器的亮度范围是有限的。一种区分明亮光源的方式是使它们在监视器上发出光芒,光源的的光芒向四周发散。这样观察者就会产生光源或亮区的确是强光区。光晕效果可以使用一个后处理特效泛光来实现。泛光使所有明亮区域产生光晕效果。泛光可以极大提升场景中的光照效果,并提供了极大的效果提升,尽管做到这一切只需一点改变。常见的一个误解是HDR..._使用高斯模糊四周泛色

android开发如何快速定位bug_程序员如何快速的高效的解决各种bug和报错?-程序员宅基地

第一件事情是学会二分查找。我看过很多刚入门的程序员,要么是自学编程的,没有系统地学过算法,连二分查找都不知道;要么是本科念完,算法都还给老师了,总之就没有这样一种基础意识。看他们定位问题,从第一行代码开始加断点或者是打印上下文信息,我会有一种强烈的冲动:还是让我来吧。如果你有一段代码,例如说一个函数,或者多个互相调用的函数,最终结果不是你想要的,你不要从头开始找哪里出错了。你应该找一个中间点,从那..._android解bug如何提高效率

指定联合身份验证服务(AD FS)名称_联合身份验证服务名称-程序员宅基地

如果已安装 Web 服务器角色,则 Active Directory Federation Services (AD FS) 2.0 中的联合身份验证服务名称的来源为 Internet 信息服务 (IIS) 中默认网站的安全套接字层 (SSL) 证书。 实际名称文本由证书的“使用者”字段或“使用者备用名称”字段(如果需要)决定。 例如,如果您想要让联合身份验证服务位于 sts1.contoso.c_联合身份验证服务名称

遗传算法(GA)求解容量受限的车辆路径(CVRP)问题MATLAB代码_求解cvrp问题matlab程序-程序员宅基地

遗传算法(GA)求解容量受限的车辆路径(CVRP)问题MATLAB代码_求解cvrp问题matlab程序

随便推点

PG yum安装以及目录结构_yum 安装的pg在哪个目录-程序员宅基地

# Install the repository RPM:yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm# Install PostgreSQL:yum install postgresql12-server# Optionally initialize the database and enable automati_yum 安装的pg在哪个目录

面向对象-多线程(同步函数的锁this与静态同步函数的锁class)-程序员宅基地

同步函数使用的是哪一个锁呢?函数需要被对象调用,那么函数都有一个所属对象引用,就是this。。所以同步函数使用的锁是this。代码:class Demo implements Runnable{ private int t=200; Object obj = new Object(); boolean flag = true; public void run () { if(flag...

InvalidDefinitionException: No serializer found for class java.lang.Object and no properties discove-程序员宅基地

使用springcloudgateway 搭建项目后,写个test验证返回响应,响应结果报如下错误:{ "timestamp": "2022-04-08T14:21:45.160+0000", "path": "/tech/health/check", "status": 500, "error": "Internal Server Error", "message": "Type definition error: [simple type, class ._invaliddefinitionex

Web安全测试之跨站请求伪造(CSRF)篇-程序员宅基地

跨站请求伪造(即CSRF)被Web安全界称为诸多漏洞中“沉睡的巨人”,其威胁程度由此“美誉”便可见一斑。本文将简单介绍该漏洞,并详细说明造成这种漏洞的原因所在,以及针对该漏洞的黑盒测试与灰盒子测试具体方法和示例,最后提提了一些防范该攻击的建议,希望本文对读者的安全测试能够有所启发。一、CSRF概述我们首先来了解一下什么是跨站请求伪造(CSRF)?跨站请求伪造是一种挟制终端用户在当前

bzoj3329: Xorequ-程序员宅基地

首先画下柿子x^(2x+x)=2x假如x能够把括号里的x消掉,那么2x+x是不能在进位的,而2x是x<<1啊,所以满足条件的x没有相邻两位同时是1遂数位DP解决,对于第二个问矩乘加速第n次1LL<<i没打LL见祖宗#include<cstdio>#include<iostream>#include<cstr...