【学习机器学习】实验——决策树

决策树

      • 前言
      • 一、实验目的
      • 二、实验内容
        • 1、导入数据
        • 2、将数据分为训练集与测试集
        • 3、采用训练集建立决策树
      • 三、实验结果
        • 1、Cart算法绘制决策树
      • 后记

前言

五一假期跳过了一次实验课,结果这周五上实验课老师竟然直接跳过了决策树的实验,虽然说我也不能算是白写了,毕竟算是锻炼自己,不过总还是有点难受的~哼。
恕我懒得再去调整格式了,下面的内容直接是实验报告的原封内容。

一、实验目的

编程实现两种决策树算法,即ID3算法(以信息增益为特征)和Cart算法(以基尼指数为特征),使用Matlab自带函数。

二、实验内容

1、导入数据

数据我使用了matlab自带的iris数据集(今后的大部分数据也将来源于此),使用语句:load fisherirish;
即可得到meas和species两个数据,分别是属性和标签。
【学习机器学习】实验——决策树_第1张图片
【学习机器学习】实验——决策树_第2张图片

2、将数据分为训练集与测试集

我们使用上一次实验内容中实现的p次k折交叉验证函数来划分训练集与测试集,但是在调用函数之前,我们需要先把属性与标签合并为一个矩阵。
由于只能将同类别数据合并在同一个矩阵中,因此我们需要把species中的标签值按类别修改为1、2、3,得到下面这样的types矩阵:
【学习机器学习】实验——决策树_第3张图片
我写了一个函数来完成这个操作,实际上你可以更简单点,直接1:50,50:100,100:150分别为1、2、3即可

function [types]=tag2num(data1)
%将种类名标签,转换为数字,方便与属性合并后传入k折函数
types=[];
data1=categorical(data1);   % 先将cell转换为categorical数组
species=unique(data1);    % 取出类别

for i=1:length(data1)
    for j=1:length(species)
    if data1(i)==species(j)
        types(end+1)=j; % 按照类别给样本标号
    end
    end
end
types=types';   % 转置

然后,我们就可以将types和meas合并为iris矩阵,并且调用k折交叉验证函数了:

iris=[meas,types];     %把属性与标签合并
[Train_kcross,Test_kcross]=kcrossvalidation(iris);  %k折分组

3、采用训练集建立决策树

由于新版matlab中没有了依据ID3算法构建决策树的函数,因此我们只用Cart算法的决策树函数fitctree实现。
我们从2中通过k折交叉验证得到的Train和Test集合中分别选取一组作为我们建立决策树用的训练集合测试集:

Train_x=Train_kcross(:,1:4,1,1);   % 将第一组训练样本拆开
Train_y=Train_kcross(:,5,1,1);  	% x是属性组,y是标记值
Train_y_tag=num2tag(Train_y);  	% 把标签值改为标签名,方便作图结果
Test_x=Test_kcross(:,1:4,1,1);    % 将第一组测试样本拆开
Test_y=Test_kcross(:,5,1,1);   	% x是属性组,y是标记值
Test_y_tag=num2tag(Test_y);    % 把标签值改为标签名,方便作图结果

其中,num2tag是一个可选操作,我只是为了让画出来的决策树更为直观而已,函数定义如下:

function [y_tag]=num2tag(num_array)
% 该函数的作用是将标记值转回标记名,用以作图
y_tag={};

for i=1:length(num_array)
    if num_array(i)==1
        y_tag{end+1}='setosa';
    end
    if num_array(i)==2
        y_tag{end+1}='versicolor';
    end
    if num_array(i)==3
        y_tag{end+1}='virginica';
    end
end
y_tag=y_tag';

然后将Train_x和Train_y作为构建参数传入fictree函数,构建决策树:

tree=fitctree(Train_x,Train_y_tag,'PredictorNames',{'SepalLength','SepalWidth','PetalLength','PetalWidth'});
view(tree,'Mode','Graph');  %生成决策树并绘制

三、实验结果

1、Cart算法绘制决策树

【学习机器学习】实验——决策树_第4张图片

后记

实际上根据其他班同学发给我的实验内容来看,还应该有id3算法完成决策树构建的内容,虽然matlab自带函数不再提供,但是我也参照一些博客写了一系列可以实现该功能的函数。另外还有一个有关剪枝的实验内容,然而matlab的prune方法单纯只是减去某一层的结点,与我们想要的预剪枝、后剪枝效果不太一样,我也没有做,算了,懒得做了诶

你可能感兴趣的:(学习机器学习,决策树,机器学习,算法,matlab)