算数优化算法AOA优化随机森林RF的树数和最小叶子数,建立多输入单输出的拟合预测建模。 程序内注释详细,可学习性强,直接替换数据可用。 程序语言为matlab。 直接运行可以出拟合预测图,优化迭代图,特征变量重要性排序图,可以打印R方,MSE,RMSE,MAPE等多种评价指标,便于分析。
最近搞了个超有意思的项目,用算数优化算法AOA来优化随机森林RF的树数和最小叶子数,成功建立了多输入单输出的拟合预测建模。今天就来和大家好好唠唠这个过程,代码部分也会详细分享,保证大家看了就能上手!
算法思路简单说
AOA算法呢,就是通过不断地迭代优化,找到最优的参数组合。就像在茫茫大海里找宝藏,它一点点摸索,最终把RF的树数和最小叶子数调整到最合适的状态,让模型的预测能力大大提升。
Matlab代码展示
% 加载数据 data = readtable('your_data.csv'); % 这里把你的数据文件名替换成实际的 X = table2array(data(:,1:end-1)); % 输入特征 y = table2array(data(:,end)); % 输出变量 % 初始化随机森林 numTrees = 50; % 初始树数 minLeafSize = 5; % 初始最小叶子数 rf = TreeBagger(numTrees, X, y, 'MinLeafSize', minLeafSize); % 定义AOA参数 maxIter = 100; % 最大迭代次数 popSize = 50; % 种群大小 % 初始化种群 lowerBound = [10 1]; % 树数和最小叶子数的下限 upperBound = [200 50]; % 树数和最小叶子数的上限 pop = initializega(popSize, @(x) fitnessFunction(x, X, y), lowerBound, upperBound); % AOA迭代优化 for iter = 1:maxIter [newPop, fitness] = arithmticOptimizationAlgorithm(pop, @(x) fitnessFunction(x, X, y), lowerBound, upperBound); [bestFitness, bestIndex] = min(fitness); bestSolution = newPop(bestIndex, :); numTrees = round(bestSolution(1)); minLeafSize = round(bestSolution(2)); rf = TreeBagger(numTrees, X, y, 'MinLeafSize', minLeafSize); pop = newPop; fprintf('Iteration %d: Best Fitness = %.6f, Num Trees = %d, Min Leaf Size = %d\n', iter, bestFitness, numTrees, minLeafSize); end % 训练优化后的随机森林 bestRf = TreeBagger(numTrees, X, y, 'MinLeafSize', minLeafSize); % 预测 yPred = predict(bestRf, X); % 评价指标计算 rSquare = rsquare(y, yPred); mse = mean((y - yPred).^2); rmse = sqrt(mse); mape = mean(abs((y - yPred)./y)) * 100; % 打印评价指标 fprintf('R - Square: %.6f\n', rSquare); fprintf('MSE: %.6f\n', mse); fprintf('RMSE: %.6f\n', rmse); fprintf('MAPE: %.6f\n', mape); % 绘制拟合预测图 figure; plot(y, 'b', 'DisplayName = ''Actual'''); hold on; plot(yPred, 'r--', 'DisplayName = ''Predicted'''); xlabel('Samples'); ylabel('Output'); title('Fitting and Prediction'); legend; % 绘制优化迭代图 figure; plot(1:maxIter, fitness, 'b'); xlabel('Iteration'); ylabel('Fitness'); title('AOA Optimization Iteration'); % 绘制特征变量重要性排序图 figure; varImpPlot(bestRf); title('Feature Variable Importance');代码分析来一波
- 数据加载:
matlab
data = readtable('your_data.csv'); % 这里把你的数据文件名替换成实际的
X = table2array(data(:,1:end-1)); % 输入特征
y = table2array(data(:,end)); % 输出变量
这部分很简单,就是读取你的数据文件,把输入特征和输出变量分别提取出来,方便后续处理。
- 随机森林初始化:
matlab
numTrees = 50; % 初始树数
minLeafSize = 5; % 初始最小叶子数
rf = TreeBagger(numTrees, X, y, 'MinLeafSize', minLeafSize);
这里设置了随机森林的初始树数和最小叶子数,并创建了一个随机森林对象rf。
- AOA参数设置和种群初始化:
matlab
maxIter = 100; % 最大迭代次数
popSize = 50; % 种群大小
lowerBound = [10 1]; % 树数和最小叶子数的下限
upperBound = [200 50]; % 树数和最小叶子数的上限
pop = initializega(popSize, @(x) fitnessFunction(x, X, y), lowerBound, upperBound);
定义了AOA的最大迭代次数、种群大小,以及树数和最小叶子数的取值范围,然后初始化了种群pop。这里的fitnessFunction是自定义的适应度函数,用来评估每个个体(即一组树数和最小叶子数的组合)的优劣。
- AOA迭代优化:
matlab
for iter = 1:maxIter
[newPop, fitness] = arithmticOptimizationAlgorithm(pop, @(x) fitnessFunction(x, X, y), lowerBound, upperBound);
[bestFitness, bestIndex] = min(fitness);
bestSolution = newPop(bestIndex, :);
numTrees = round(bestSolution(1));
minLeafSize = round(bestSolution(2));
rf = TreeBagger(numTrees, X, y, 'MinLeafSize', minLeafSize);
pop = newPop;
fprintf('Iteration %d: Best Fitness = %.6f, Num Trees = %d, Min Leaf Size = %d\n', iter, bestFitness, numTrees, minLeafSize);
end
在每次迭代中,通过arithmticOptimizationAlgorithm函数更新种群,找到最优的个体(即最优的树数和最小叶子数组合),然后根据这个最优组合重新训练随机森林rf。
- 训练和预测:
matlab
bestRf = TreeBagger(numTrees, X, y, 'MinLeafSize', minLeafSize);
yPred = predict(bestRf, X);
用优化后的参数训练最终的随机森林bestRf,并进行预测得到yPred。
- 评价指标计算和绘图:
matlab
rSquare = rsquare(y, yPred);
mse = mean((y - yPred).^2);
rmse = sqrt(mse);
mape = mean(abs((y - yPred)./y)) * 100;
fprintf('R - Square: %.6f\n', rSquare);
fprintf('MSE: %.6f\n', mse);
fprintf('RMSE: %.6f\n', rmse);
fprintf('MAPE: %.6f\n', mape);
figure;
plot(y, 'b', 'DisplayName = ''Actual''');
hold on;
plot(yPred, 'r--', 'DisplayName = ''Predicted''');
xlabel('Samples');
ylabel('Output');
title('Fitting and Prediction');
legend;
figure;
plot(1:maxIter, fitness, 'b');
xlabel('Iteration');
ylabel('Fitness');
title('AOA Optimization Iteration');
figure;
varImpPlot(bestRf);
title('Feature Variable Importance');
计算了常用的评价指标如R方、均方误差、均方根误差和平均绝对百分比误差,并绘制了拟合预测图、优化迭代图和特征变量重要性排序图,方便直观地分析模型性能。
这个代码通过AOA算法对随机森林的参数进行优化,最终得到了一个性能不错的拟合预测模型,而且代码注释详细,很容易理解和修改哦!大家赶紧试试吧!
算数优化算法AOA优化随机森林RF的树数和最小叶子数,建立多输入单输出的拟合预测建模。 程序内注释详细,可学习性强,直接替换数据可用。 程序语言为matlab。 直接运行可以出拟合预测图,优化迭代图,特征变量重要性排序图,可以打印R方,MSE,RMSE,MAPE等多种评价指标,便于分析。