%% 基于随机森林的多变量回归区间预测
%% 清空环境变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc % 清空命令行
%% 导入数据
res =xlsread('data.xlsx','sheet1','A2:H104');
%% 数据分析
num_size = 0.7; % 训练集占数据集比例
outdim = 1; % 最后一列为输出
num_samples = size(res, 1); % 样本个数
res = res(randperm(num_samples), :); % 打乱数据集(不希望打乱时,注释该行)
num_train_s = round(num_size * num_samples); % 训练集样本个数
f_ = size(res, 2) - outdim; % 输入特征维度
%% 划分训练集和测试集
P_train = res(1: num_train_s, 1: f_)';
T_train = res(1: num_train_s, f_ + 1: end)';
M = size(P_train, 2);
P_test = res(num_train_s + 1: end, 1: f_)';
T_test = res(num_train_s + 1: end, f_ + 1: end)';
N = size(P_test, 2);
%% 数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);
%% 转置以适应模型
p_train = p_train'; p_test = p_test';
t_train = t_train'; t_test = t_test';
%% 模型创建
trees = 100; % 决策树数目
leaf = 5; % 最小叶子数
OOBPrediction = 'on'; % 打开误差图
OOBPredictorImportance = 'on'; % 计算特征重要性
Method = 'regression'; % 分类还是回归
net = TreeBagger(trees, p_train, t_train, 'OOBPredictorImportance', OOBPredictorImportance,...
'Method', Method, 'OOBPrediction', OOBPrediction, 'minleaf', leaf);
importance = net.OOBPermutedPredictorDeltaError; % 重要性
%% 仿真测试
t_sim1 = predict(net, p_train);
t_sim2 = predict(net, p_test);
l_sim1 = quantilePredict(net, p_train, 'Quantile',[0.05,0.95]);
l_sim2 = quantilePredict(net, p_test ,'Quantile',[0.05,0.95]);
%% 数据反归一化
L_sim1 = mapminmax('reverse', l_sim1, ps_output);
L_sim2 = mapminmax('reverse', l_sim2, ps_output);
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);
%% 均方根误差
error1 = sqrt(sum((T_sim1' - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2' - T_test ).^2) ./ N);
%% 绘图
%% 绘制误差曲线
figure
plot(1 : trees, oobError(net), 'b-', 'LineWidth', 1)
legend('误差曲线')
xlabel('森林大小')
ylabel('误差')
set(gca,'FontSize',12)
set(gca,'LineWidth',1);
grid on
drawnow
xlim([1, trees])
%% 绘制特征重要性
figure
bar(importance)
legend('重要性')
xlabel('特征')
ylabel('重要性')
set(gca,'FontSize',12)
set(gca,'LineWidth',1);
grid on
drawnow
figure
fill([1 : M, M : -1 : 1], [L_sim1(:, 1); flipud(L_sim1(:, 2))], ...
'r', 'FaceColor', [250 192 0]./255, 'EdgeColor', 'none')
hold on
plot(1 : M, T_train, 'k-', 1 : M, T_sim1, 'r-', 'LineWidth', 1)
legend('90%的置信区间', '真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'训练集预测结果对比'; ['RMSE = ' num2str(error1)]};
title(string)
xlim([1, M])
grid
figure
fill([1 : N, N : -1 : 1], [L_sim2(:, 1); flipud(L_sim2(:, 2))], ...
'r', 'FaceColor', [250 192 0]./255, 'EdgeColor', 'none')
hold on
plot(1 : N, T_test, 'k-', 1 : N, T_sim2, 'r-', 'LineWidth', 1)
legend('90%的置信区间', '真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'测试集预测结果对比'; ['RMSE = ' num2str(error2)]};
title(string)
xlim([1, N])
grid
%% 相关指标计算
% R2
R1 = 1 - norm(T_train - T_sim1')^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test - T_sim2')^2 / norm(T_test - mean(T_test ))^2;
disp(['训练集数据的R2为:', num2str(R1)])
disp(['测试集数据的R2为:', num2str(R2)])
% MAE
mae1 = sum(abs(T_sim1' - T_train)) ./ M ;
mae2 = sum(abs(T_sim2' - T_test )) ./ N ;
disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['测试集数据的MAE为:', num2str(mae2)])
%% 平均绝对百分比误差MAPE
MAPE1 = mean(abs((T_train - T_sim1')./T_train));
MAPE2 = mean(abs((T_test - T_sim2')./T_test));
disp(['训练集数据的MAPE为:', num2str(MAPE1)])
disp(['测试集数据的MAPE为:', num2str(MAPE2)])
% MBE
mbe1 = sum(T_sim1' - T_train) ./ M ;
mbe2 = sum(T_sim2' - T_test ) ./ N ;
disp(['训练集数据的MBE为:', num2str(mbe1)])
disp(['测试集数据的MBE为:', num2str(mbe2)])
%均方误差 MSE
mse1 = sum((T_sim1' - T_train).^2)./M;
mse2 = sum((T_sim2' - T_test).^2)./N;
disp(['训练集数据的MSE为:', num2str(mse1)])
disp(['测试集数据的MSE为:', num2str(mse2)])
%% 指标计算(区间覆盖率和区间平均宽度百分比)
L_sim1 = L_sim1'; T_train = T_train';
L_sim2 = L_sim2'; T_test = T_test' ;
picp1 = PICP (L_sim1, T_train);
pimw1 = PIMWP(L_sim1, T_train);
disp(['训练集的区间覆盖率为:', num2str(picp1), '。区间平均宽度百分比为:', num2str(pimw1)])
picp2 = PICP (L_sim2, T_test);
pimw2 = PIMWP(L_sim2, T_test);
disp(['测试集的区间覆盖率为:', num2str(picp2), '。区间平均宽度百分比为:', num2str(pimw2)])
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于分位数随机森林回归区间预测,QRF回归区间预测预测(Matlab完整源码和数据) 基于分位数随机森林回归区间预测,QRF回归区间预测预测(Matlab完整源码和数据) 基于分位数随机森林回归区间预测,QRF回归区间预测预测(Matlab完整源码和数据) 多输入单输出,运行环境matlab2018及以上。
资源推荐
资源详情
资源评论
收起资源包目录
QRFR.zip (4个子文件)
QRFR.m 5KB
PICP.m 362B
data.xlsx 15KB
PIMWP.m 285B
共 4 条
- 1
资源评论
前程算法屋
- 粉丝: 4268
- 资源: 712
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功