决策树代码分享MATLAB

有关于决策树的基本知识其他博主已经讲的很清楚了,在此我分享我的决策树代码。

%%
%%清理工作区
clear
clc
%%
%%导入数据及数据预处理,数据格式为数据个体*属性
load data.mat;
m=500;%%1:m为训练集,m+1:end为训练集
n=2;%%第n列为结果,n+1:end为属性
%%
%%训练集
p_train=data(1:m,n+1:end);
t_train=data(1:m,n);
%%
%%测试集
p_test=data(m+1:end,n+1:end);
t_test=data(m+1:end,n);
%%
%%构建分类树
ctree=classificationTree.fit(p_train,t_train);
%%
%%显示树结构
view(ctree);
view(ctree,'mode','graph');
%%
%%仿真测试,对测试集进行预测
t_sim=predict(ctree,p_train);
%%
%%预测结果分析
count_B_sim=length(find(t_sim==1));
count_M_sim=length(find(t_sim==0));
count_B=length(find(t_test==1));
count_M=length(find(t_test==0));
sum=length(t_test);
rate=(abs(count_B-count_B_sim)+abs(count_M-count_M_sim))/sum;
disp('错误率为');
disp(rate);
%%
%%叶子节点含有最小样本对决策树性能的影响,选取误差最小的样本最小数
leafs=logspace(1:2:10);%%修改参数可提高所选取的最小叶子数样本的精确值
N=numel(leafs);
err=zeros(N,1);
for n=1:N
t=classificationTree.fit(p_train,t_train,'crossval','minleaf',leafs(n));
err(n)=kfoldLoss(t);
end
plot(leafs,err);
xlabel('叶子节点含最小样本数');
ylabel('交叉验证误差');
title('叶子节点含最小样本数对决策树性能的影响');
%%
%%构建优化后的决策树
optimal_tree=classificationTree.fit(p_train,t_train,'minleaf',13);
view(optimal_tree,'mode','graph');
%%
%%计算误差优化前决策树的误差
resub_defiault=resubLoss(ctree);
loss_defiault=kflodLoss(crossval(ctree));
disp('优化前交叉误差');
disp(resub_defiault);
disp(loss_defiault);
%%
%%计算优化后决策树的误差
resub_optimal=resubLoss(optimal_tree);
loss_optimal=kflodLoss(crossval(optimal_tree));
disp('优化后交叉误差');
disp(resub_optimal);
disp(loss_optimal);
%%
%%减枝
[~,~,~,best_level]=cvLoss(ctree,'subtrees','all','treesize','min');
cptree=prune(ctree,'Level',best_level);
view(cptree,'mode','graph');
%%
%%计算剪枝后的交叉误差
resub_cp=resubLoss(cptree);
loss_cp=kflodLoss(crossval(cptree));
disp('剪枝后交叉误差');
disp(resub_cp);
disp(loss_cp);
%%
%选择交叉误差最下的一种优化方法


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