实验三:决策树C4.5生成算法_编写代码, 使用 c4.5 算法为天气与打球的关系构造决策树,并将决策树可视化-程序员宅基地

技术标签: matlab  算法  机器学习  决策树  

  • 一、实验目的

        通过决策树的相关知识,使用C4.5生成算法对给出的数据集构建决策树模型。所给数集为14个关于天气情况的数据,需要根据所给的数据作出是否外出打球分类判断。每个数据有4个属性,分别为:Outlook, Temperature, Humidity和 Windy等。最后一列每种天气样本下,是否外出打球的分类。实验过程所使用的编程软件为MATLAB仿真软件,利用MATLAB实现算法及分类。

  • 二、实验内容

        用表1数据集运用C4.5算法生成决策树。

  • 三、实验数据

   表1每一行代表一种天气样本,共有14个样本;一共6列,其中第6列为类别标志属性,共有2类,分别标记为‘Yes’、‘No’对于两种不同分类结果;类别‘Yes’共有9个样本,类别‘No’共有5个样本。

  由于数据集中每个样本的数据都是完整的,没有空缺值,所以没有对该数据集进行必要的数据清洗工作。

表1.    原始数据

Outlook

Temperature

Humidity

Windy

Play? 

D1   

Sunny      

Hot   

High       

Weak     

No

D2   

Sunny      

Hot    

High       

Strong   

No

D3   

Overcast   

Hot    

High       

Weak     

Yes

D4   

Rain       

Mild   

High       

Weak     

Yes

D5   

Rain       

Cool   

Normal     

Weak     

Yes

D6   

Rain       

Cool   

Normal     

Strong   

No

D7   

Overcast   

Cool   

Normal     

Strong   

Yes

D8   

Sunny      

Mild   

High       

Weak     

No

D9   

Sunny      

Cool   

Normal     

Weak     

Yes

D10  

Rain       

Mild   

Normal     

Weak     

Yes

D11  

Sunny      

Mild   

Normal     

Strong   

Yes

D12  

Overcast   

Mild   

High     

  Strong   

Yes

D13  

Overcast   

Hot    

Normal     

Weak     

Yes

D14  

Rain       

Mild   

High       

Strong   

No

表2.预处理后数据

Outlook

Temperature

Humidity

Windy

Play? 

D1   

0

2

0

0

0

D2   

0

2

0

1

0

D3   

1

2

0

0

1

D4   

2

1

0

0

1

D5   

2

0

1

0

1

D6   

2

0

1

1

0

D7   

1

0

1

1

1

D8   

0

1

0

0

0

D9   

0

0

1

0

1

D10  

2

1

1

0

1

D11  

0

1

1

1

1

D12  

1

1

0

1

1

D13  

1

2

1

0

1

D14  

2

1

0

1

0

  • 四、实验步骤

(1)决策树分类算法的介绍:

        在没有相关领域知识的情况下,从海量数据中生成分类器的一种特别有效的方法即是生成一棵决策树(decisiontree)。决策树表示方法是应用最为广泛的逻辑方法之一,它能从一组既没有次序又没有规则的实例中挖掘出使用决策树表示形式的分类规则。决策树分类算法主要利用自顶向下的递归方式,在决策树的内部结点进行属性值之间的比较,并且依据不同的属性值判断从当前结点向下的分支,在决策树的叶子结点得出结论。事实上,从决策树的根结点到每一个叶子结点的一条路径即对应着一条合取规则,整棵决策树即对应着一组析取表达式规则。

        基于决策树的分类算法的一个最大的优点即是其在学习过程中不要求使用者了解相关问题所涉及的专业知识(这同时也是其最大的缺点),只要训练结果能用属性﹣结论式表示出来,即能够使用这一算法来学习。

        决策树是应用非常广泛的分类方法,其算法通常可分为两个阶段,前一阶段称为决策树生成算法;后一阶段称为决策树修剪算法。在此,主要介绍两种决策树生成算法:ID3算法和C4.5算法。

        ID3算法原理:

        决策树中任何一个非叶子结点对应着一个非类别属性,树枝代表这个属性的值。一个叶子结点表示从该决策树的根结点到叶子结点之间的路径对应的记录所属的类别属性值。任何一个非叶子结点都将与属性中具有最大信息量的非类别属性相关联。使用信息增益来选择可以最好地将样本进行分类的属性。

        计算信息增益过程如下:

        1.我们假设一个这样的数据样本集S,其中数据样本集S包含了s个数据样本,假设类别属性具有m个不同的值(判断指标):Ci(i=1,2,3,…,m),Si是Ci中的样本数,对于一个样本集总的信息熵为:


        其中,Pi表示任意样本属于Ci的概率,也可以用si/s 进行估计。我们假设一个属性A具有k个不同的值 {a1,a2,…,ak}, 利用属性A将数据样本S划分为k个子集{S1,S2,…,Sk},其中Sj包含了集合S中属性A取aj值的样本。若是选择了属性A为测试属性,则这些子集就是从集合S的节点生长出来的新的叶子节点。设Sij是子集Sj中类别为Ci的样本数,则根据属性A划分样本的信息熵值为:


最后,我们利用属性A划分样本集S后得到的信息熵增益为:

C4.5算法原理:C4.5算法是由ID3算法演变而来的,使用了信息增益比例的概念。

信息增益比例概念是在信息增益概念的基础上发展起来的,任何一个属性的信息增益比例可以使用以下的公式给出:

GainRatio(A)=(Gain(A))/(SplitI(A))

其中,

(2)C4.5算法的流程图

(3)由ID3算法改为C4.5算法,主要在SelectFeature.m文件里修改增加如下代码用于计算信息熵和计算信息增益增益比:

SplitI=0;

SplitI = SplitI- prob *log2(prob);%计算信息熵

GainRatio=CurGain/SplitI;%计算增益比例

各部分的代码与注释如下所示:

  • ①main_Tree.m
clc;
clear;
load Data

CreatTree(Data);
% 用C4.5算法构建决策树,输入预处理后的数据
  • ②CreatTree.m

function CreatTree(data)
% %% 用C4.5算法构建决策树,输入预处理后的数据
n = size(data, 2); % 取出data的总列数

disp('original data:');

disp(data); % 输出预处理后的表格数据

ClassList = data(:, n);  % 取出数据最后一列,该列为类别标签

ClassCount = length(unique(ClassList));  % 类别标签个数

if ClassCount == 1   % 若只有一个标签,说明当前已达到叶子节点,结束
    
    disp('final data: ');
    
    disp(data);
    
    disp('The current classification is over');
    
    return;
    
end

BestFeature = SelectFeature(data);  % 选取使熵增益最大的属性?????

disp(['BestFeature : ', num2str(BestFeature)]); % 输出该属性各标签的信息

LabelList = unique(data(: , BestFeature)); % 对该属性的标签进行排列

NumLabel = length(LabelList); % 统计标签类别有多少个

for i = 1 : NumLabel  % 以该属性的每个标签为父节点生成子树
    
    Subset = SplitData(data, BestFeature, i);  % 得到该标签下的数据子集
    
    CreatTree(Subset);  % 递归调用,生成子树
    
end
end


③SelectFesture.m

function [BestFeature] =SelectFeature(data)
%% 选取数据集中使得熵增益最大的属性

[m , n] = size(data);%取出行数和列数

BaseEntropy = CalEntropy(data);  % 计算数据的初始熵

NumFeture = n - 1; % 倒数第二列

BestGain = 0;

for i = 1: NumFeture  % 遍历所有属性,得到熵增益最大的属性;
    
    LabelList = unique(data(: , i)); % 排序每一列标记
    
    NumLabel = length(LabelList); % 每个属性的标签个数
    %初始化
    CurEntropy = 0;
    SplitI=0;
    
    for j = 1 : NumLabel % 计算每一个属性的每一个标签的熵
        
        prob = length(find(data(: , i) == LabelList(j) )) / m;  % 该标签在该属性中出现的概率,93第九行
        
        CurEntropy = CurEntropy + prob * CalEntropy(SplitData(data, i, j));%计算该标签的熵,93 
        
        SplitI = SplitI- prob *log2(prob);% 计算信息熵
        
    end
    
    CurGain = BaseEntropy - CurEntropy; % 熵增益
    
    GainRatio=CurGain/SplitI;%信息增益比例
    
    if  GainRatio > BestGain % 取最高的信息增益比例
        
        BestGain = GainRatio;
        
        BestFeature = i;
        
    end
    
end
        
end

  • ④SplitData.m
function [Subset] = SplitData(data, feature, label)
%%  将数据集按照某个属性的某个标签分割得到子集,

%输入参数feature为属性,label为该属性的标签。


m = size(data, 1); % 取出行数

Subset = data;

Subset(: , feature) = []; % 将Subset中属于第feature个的所有标签取空

LabelList = unique(data(:, feature)); % 对数据集的第feature列的标签排列

k = 0;

for i = 1 : m %分割各类的标签
    
    if data(i , feature) ~= LabelList(label)
        
        Subset(i - k , :) = [];
        
        k = k + 1;
        
    end
    
end



end

  • ⑤CalEntropy.m
    function [Entropy ] =  CalEntropy(data)
    %% 计算当前数据集的熵
            [m , n] = size(data); % 取出数据集行数和列数
            
            LabelList = unique(data(:, n)); % 对数据集的最后一列排序
            
            NumLabel = length(LabelList); % 统计出标签的类别有几个
            
            Entropy = 0;
            
            for i = 1: NumLabel
                
                prob =  length(find(data(: , n) == LabelList(i) )) / m;
                
                Entropy = Entropy - prob * log2(prob); % 计算出初始熵
                
            end
            
    end
    
    

  • 五、实验结果:

  • 利用C4.5算法生成决策树如下图所示:

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

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签