决策树
实现ID3决策树,并在鸢尾花卉Iris数据集上进行5折交叉验证。并观测训练所得到的决策树在训练集和测试集的准确率,从而判断该决策树是否存在过拟合。在此基础上实现预剪枝和后剪枝,并比较预剪枝树与后剪枝树在训练集和测试集上的准确率。
(我刚搞了一下,在这没办法上传我的iris.data数据集有需要的网上下载一个就好啦~网上搜索就有)
实现过程:
首先使用importdata将.data文件导入到Matlab的workspace中,然后用regexp函数将A分割成单独的一个个值并保存到S中。再用str2num函数把字符串转换为数值并保存到矩阵a中。为了方便起见,把三类鸢尾花的名字在矩阵中存储时替换为1,2,3。为了后面计算信息熵时使用,自定义函数“count”来统计每个属性中每一类的个数,一共三类,其数量分别保存在变量cout1,count2,count3中。
function [ count ] = classcount( a )
%统计每个属性中每一类的个数,一共三类
count1=0;
count2=0;
count3=0;
[m,n]=size(a);
for i=1:m
if a(i,n)==1
count1=count1+1;
else
if a(i,n)==2
count2=count2+1;
else
count3=count3+1;
end
end
end
count=[count1,count2,count3];
end
自定义函数“ID3”用来计算将样本划分出的每组的信息熵,并返回结果I。其中用到了公式Ent(D)=-∑pk*log(pk),Ent的值越小,样本集合D的纯度越高。
function [ I ] = ID3( data )
%计算划分出来的每组数据的信息熵
count=classcount(data);
[m,n]=size(data);
p=count./m;
I=0;
for i=1:3
if p(1,i)>0
I=-p(1,i)*log(p(1,i))+I;
end
end
end
自定义函数“split”按维度dim(属性,4个属性共4维)和节点point进行划分,分为二叉sub1、sub2。利用二叉树来处理后续问题。
function [ sub1,sub2 ] = split(data ,dim,point)
%按属性dim和划分点point进行划分
sub1=[ ];
sub2=[ ];
[m,n]=size(data);
for i=1:m
if(data(i,dim)<=point)
sub1=[sub1;data(i,1:dim-1),data(i,dim+1:n)];
%sub1=[sub1;data(i,:)];
else
sub2=[sub2;data(i,1:dim-1),data(i,dim+1:n)];
%sub2=[sub2;data(i,:)];
end
end