使用Matlab建立随机森林
综述
除了神经网络模型以外,树模型及基于树的集成学习模型是较为常用的效果较好的预测模型。我们以下构建一个随机森林模型。
随机森林是一种集成学习方法,通过构建多个决策树并结合其预测结果来提高模型的准确性和稳定性。在MATLAB中,可以使用内置的TreeBagger函数来实现随机森林算法。以下是一个详细的示例,展示了如何在MATLAB中使用随机森林进行回归分析。
我们需要用到以下数据集,Pollution.xlsx。需要预测的是B列,即空气质量指数AQI。自变量是C~M列。
Step 1: 打开matlab,新建脚本,读入数据
在MATLAB 中,输入以下代码。(注意,要将数据和代码放在同一文件夹内)
Matlab中的当前路径也需要在这一路径,不然会报错。
Step 2: 划分训练集与测试集
在MATLAB 中,输人以下代码,划分训练集和测试机,并标注输入输出
将数据进行归一化处理。
Step 3: 划分训练集与测试集
在MATLAB 中,输人以下代码,设置随机森林的属性,并通过红框内的代码调用TreeBagger训练随机森林模型。由于这里要预测的因变量是一个连续型变量,所以在Method中,选择“回归(regression)”。如果要预测离散型变量,则要选择分类。
Step 4: 应用模型
在MATLAB 中,输人以下代码,将训练好的模型,应用在测试集上。
最后将数据反归一化,投射至原来的值上。
Step 5: 结果可视化
在MATLAB 中,输人以下代码,进行结果的绘制。
结果图如下所示
左图为每一个样本的预测值和真实值的差别;右图为每一个特征(自变量)的重要性,从图中可知,第5个自变量(Latitude,纬度)是最重要的,次重要的是第3个变量(Temperature,温度)。
Step 6: 计算模型指标
在MATLAB 中,输人以下代码,计算回归模型的各类指标。
结果如下所示,该模型效果一般,
%% 初始化数据
clc
clear
close all
%% 导入数据
data = xlsread('Pollution.csv', 'Pollution', 'B2:M101'); % 导入数据库
if isempty(data)
error('数据导入失败,请检查文件路径和表名');
end
% 生成随机索引
TE = randperm(100);
% 划分训练集和测试集
PN = data(TE(1:80), 2:12); % 训练集输入 (80x11)
TN = data(TE(1:80), 1); % 训练集输出 (80x1)
PM = data(TE(81:end), 2:12); % 测试集输入 (20x11)
TM = data(TE(81:end), 1); % 测试集输出 (20x1)
% 检查数据维度
disp('原始数据维度:');
disp(size(data));
disp('训练集输入 PN 维度:');
disp(size(PN));
disp('训练集输出 TN 维度:');
disp(size(TN));
disp('测试集输入 PM 维度:');
disp(size(PM));
disp('测试集输出 TM 维度:');
disp(size(TM));
% 手动计算归一化参数
xmin = min(PN, [], 1); % 每个特征的最小值
xmax = max(PN, [], 1); % 每个特征的最大值
xrange = xmax - xmin; % 每个特征的范围
gain = 1 ./ xrange; % 缩放因子
% 手动应用归一化参数
pn = (PN - xmin) .* gain; % 归一化训练集输入
pm = (PM - xmin) .* gain; % 归一化测试集输入
% 归一化输出
tn_min = min(TN);
tn_max = max(TN);
tn_range = tn_max - tn_min;
tn = (TN - tn_min) / tn_range; % 归一化训练集输出
% 检查归一化后的数据维度
disp('归一化后训练集输入 pn 维度:');
disp(size(pn));
disp('归一化后测试集输入 pm 维度:');
disp(size(pm));
disp('归一化后训练集输出 tn 维度:');
disp(size(tn));
% 检查归一化后的数据值
disp('归一化后训练集输入 pn 前5行:');
disp(pn(1:5, :));
disp('归一化后测试集输入 pm 前5行:');
disp(pm(1:5, :));
disp('归一化后训练集输出 tn 前5行:');
disp(tn(1:5, :));
%% 模型参数设置及训练模型
trees = 100; % 决策树数目
leaf = 5; % 最小叶子数
OOBPrediction = 'on'; % 打开误差图
OOBPredictorImportance = 'on'; % 计算特征重要性
Method = 'regression'; % 选择回归或分类
net = TreeBagger(trees, pn, tn, 'OOBPredictorImportance', OOBPredictorImportance, ...
'Method', Method, 'OOBPrediction', OOBPrediction, 'MinLeaf', leaf);
importance = net.OOBPermutedPredictorDeltaError; % 重要性
%% 仿真测试
pyuce = predict(net, pm);
%% 数据反归一化
Pyuce = pyuce * tn_range + tn_min;
% 检查反归一化后的数据值
disp('反归一化后预测输出 Pyuce 前5行:');
disp(Pyuce(1:5));
%% 绘图
figure % 图回图真实值与预测值对比图
plot(TM, 'bo-')
hold on
plot(Pyuce, 'r*-')
hold on
legend('真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
grid on
figure % 绘制特征重要性图
bar(importance)
legend('各因素重要性')
xlabel('特征')
ylabel('重要性')
%% 相关指标计算
error = Pyuce - TM;
[~, len] = size(TM);
R2 = 1 - sum((TM - Pyuce).^2) / sum((mean(TM) - TM).^2); % 相关性系数
MSE = mean(error.^2); %