CART---回归树(基于MATLAB)

clc
clear all
% 导入数据

load('S_Data.mat')     % 预测S含量所用数据
n =12;   % n 是自变量的个数
m = 1;    % m 是因变量的个数

% 读取训练数据
train_num = 1600;  %训练样本数
train_Data = S_Data(1:train_num,:);
train_Input = S_Data(1:train_num,1:n);
train_Output = S_Data(1:train_num,n+1:end);

% 树的生成
leafs = logspace(1,3,10);
rng('default')
N = numel(leafs);
err = zeros(N,1);
for i=1:N
    t = fitrtree(train_Input,train_Output,'CrossVal','On',...
        'MinLeaf',leafs(i));
    err(i) = kfoldLoss(t);
end
 plot(leafs,err,'o-');
 xlabel('Min Leaf Size');
ylabel('cross-validated error');

tic;% 仿真计时开始
tree = fitrtree(train_Input,train_Output,'minleaf',130);
toc; % 仿真计时结束

 view(tree,'Mode','graph')

%训练样本预测
Cart_train_Output = predict(tree,train_Input);
% 训练数据误差
train_err = train_Output - Cart_train_Output;
n1 = length(Cart_train_Output);
train_RMSE = sqrt(sum((train_err).^2)/n1);

% 读取测试集
test_Output = S_Data(train_num+1:end,n+1:end);
test_Input = S_Data(train_num+1:end,1:n);
%使用测试样本进行验证
Cart_test_Output = predict(tree,test_Input);
% 测试数据误差
test_err = test_Output - Cart_test_Output;
n2 = length(Cart_test_Output);
test_RMSE = sqrt(sum((test_err).^2)/n2);

% 预测结果可视化
figure(4);  % 绘制图1
subplot(2,1,1);  % 图1包含2行1列个子图形,首先绘制子图1
plot(Cart_test_Output,':og');  % 用绿色的o绘制测试数据的预测输出值
hold on;
plot(test_Output','-*b');  % 用蓝色的*绘制测试数据的期望输出值
legend('预测输出','期望输出');  % 子图1的注释
title('回归树预测S含量结果','fontsize',12)  %子图1的标题
ylabel('S含量','fontsize',12);  % y轴
xlabel('样本','fontsize',12);  % x轴
subplot(2,1,2);  % 绘制子图2
plot(abs(test_Output - Cart_test_Output),'-*');  % 输出测试数据的预测误差
title('回归树预测S含量误差','fontsize',12)  %子图2的标题
ylabel('误差','fontsize',12);  % y轴
xlabel('样本','fontsize',12);  % x轴
ylim([0,0.01]);

猜你喜欢

转载自blog.csdn.net/xq_520/article/details/89284664