✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
随机森林算法是一种集成学习方法,通过组合多个决策树来进行分类和回归。
算法的原理如下:
- 建立多个决策树:随机森林由多个决策树组成,每个决策树都是独立地从训练数据中随机采样得到的。这种随机采样可以通过自助法(bootstrap)或者随机子集法(random subspace)进行。
- 随机特征选择:在每个决策树的节点上,只考虑部分特征进行分裂。这样可以增加决策树之间的差异性,提高整体模型的准确性。常用的特征选择方法有全特征选择和随机特征选择。
- 决策树的构建:根据选定的特征进行划分,使得每个子节点上的样本尽量属于同一类别或具有相似的回归值。通常使用信息熵、基尼系数等指标来评估划分质量。重复这个过程直到达到预定的停止条件。
- 集成投票/平均:对于分类问题,随机森林通过投票机制来确定最终的预测结果。每个决策树对样本进行分类,最后选择得票最多的类别作为整个随机森林的预测结果。对于回归问题,随机森林通过平均每个决策树的预测值来得到最终的预测结果。
随机森林算法具有很好的鲁棒性和泛化能力,能够有效地处理高维数据和大规模数据集,并且对于特征的缺失和噪声有较好的容错性。
对于基于随机森林算法的时间序列预测,你可以按照以下步骤进行:
- 数据准备:收集并整理时间序列数据,确保数据包含时间戳和要预测的目标变量。将数据分为训练集和测试集。
- 特征工程:针对时间序列数据,可以提取一些常见的特征,如滞后特征(lag features)、移动平均值等。这些特征可以帮助模型捕捉时间序列的趋势和周期性。
- 随机森林模型训练:使用训练集数据,构建随机森林模型。随机森林是一种集成学习方法,由多个决策树组成。每个决策树都基于不同的数据子集进行训练,最后通过投票或平均预测结果来得出最终的预测结果。
- 模型评估:使用测试集数据,评估模型的预测性能。可以使用一些指标如均方根误差(RMSE)、平均绝对百分比误差(MAPE)等来评估预测结果与实际值之间的差异。
- 模型优化:根据评估结果,可以尝试调整模型参数、增加更多特征或者尝试其他算法来优化模型的性能。
需要注意的是,随机森林算法在处理时间序列数据时可能存在一些限制,如无法捕捉长期依赖关系和忽略时间序列中的自相关性。因此,在实际应用中,可能需要考虑其他更适合时间序列预测的算法,如ARIMA、LSTM等。
⛄ 代码
%% 清空环境变量warning off % 关闭报警信息close all % 关闭开启的图窗clear % 清空变量clc % 清空命令行%% 导入数据(时间序列的单列数据)result = xlsread('数据集.xlsx');%% 数据分析num_samples = length(result); % 样本个数 kim = 15; % 延时步长(kim个历史数据作为自变量)zim = 1; % 跨zim个时间点进行预测%% 构造数据集for i = 1: num_samples - kim - zim + 1 res(i, :) = [reshape(result(i: i + kim - 1), 1, kim), result(i + kim + zim - 1)];end%% 划分训练集和测试集temp = 1: 1: 922;P_train = res(temp(1: 700), 1: 15)';T_train = res(temp(1: 700), 16)';M = size(P_train, 2);P_test = res(temp(701: end), 1: 15)';T_test = res(temp(701: end), 16)';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 );%% 数据反归一化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);%% 绘图figureplot(1: M, T_train, 'r-', 1: M, T_sim1, 'b-', 'LineWidth', 1)legend('真实值', '预测值')xlabel('预测样本')ylabel('预测结果')string = {'训练集预测结果对比'; ['RMSE=' num2str(error1)]};title(string)xlim([1, M])gridfigureplot(1: N, T_test, 'r-', 1: N, T_sim2, 'b-', 'LineWidth', 1)legend('真实值', '预测值')xlabel('预测样本')ylabel('预测结果')string = {'测试集预测结果对比'; ['RMSE=' num2str(error2)]};title(string)xlim([1, N])grid%% 绘制误差曲线figureplot(1: trees, oobError(net), 'b-', 'LineWidth', 1)legend('误差曲线')xlabel('决策树数目')ylabel('误差')xlim([1, trees])grid%% 绘制特征重要性figurebar(importance)legend('重要性')xlabel('特征')ylabel('重要性')%% 相关指标计算% R2R1 = 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)])% MAEmae1 = sum(abs(T_sim1' - T_train)) ./ M ;mae2 = sum(abs(T_sim2' - T_test )) ./ N ;disp(['训练集数据的MAE为:', num2str(mae1)])disp(['测试集数据的MAE为:', num2str(mae2)])% MBEmbe1 = sum(T_sim1' - T_train) ./ M ;mbe2 = sum(T_sim2' - T_test ) ./ N ;disp(['训练集数据的MBE为:', num2str(mbe1)])disp(['测试集数据的MBE为:', num2str(mbe2)])%% 绘制散点图sz = 25;c = 'b';figurescatter(T_train, T_sim1, sz, c)hold onplot(xlim, ylim, '--k')xlabel('训练集真实值');ylabel('训练集预测值');xlim([min(T_train) max(T_train)])ylim([min(T_sim1) max(T_sim1)])title('训练集预测值 vs. 训练集真实值')figurescatter(T_test, T_sim2, sz, c)hold onplot(xlim, ylim, '--k')xlabel('测试集真实值');ylabel('测试集预测值');xlim([min(T_test) max(T_test)])ylim([min(T_sim2) max(T_sim2)])title('测试集预测值 vs. 测试集真实值')
⛄ 运行结果
⛄ 参考文献
[1] 彭璐.基于长短时记忆网络的时间序列预测与应用研究[J].[2023-07-22].
[2] 胡玮.基于改进邻域粗糙集和随机森林算法的糖尿病预测研究[D].首都经济贸易大学[2023-07-22].DOI:CNKI:CDMD:2.1018.136129.
[3] 朱品光.基于随机森林回归算法的堆石坝爆破块度预测研究[D].天津大学[2023-07-22].