基于MATLAB实现随机森林算法
代码块
%% 随机森林算法实现(分类任务)
function random_forest_demo()
% 1. 数据加载与预处理
data = readtable('data.csv'); % 加载CSV数据
X = data(:, 1:end-1); % 特征矩阵
Y = data(:, end); % 标签向量
% 数据标准化
[X_scaled, ps_input] = mapminmax(X', 0, 1);
X_scaled = X_scaled';
% 2. 数据集划分
cv = cvpartition(Y, 'HoldOut', 0.3);
X_train = X_scaled(cv.training,:);
Y_train = Y(cv.training);
X_test = X_scaled(cv.test,:);
Y_test = Y(cv.test);
% 3. 模型训练(分类任务)
numTrees = 200; % 决策树数量
minLeaf = 5; % 最小叶子节点数
model = TreeBagger(numTrees, X_train, Y_train, ...
'Method', 'classification', ...
'MinLeafSize', minLeaf, ...
'OOBPrediction', 'on'); % 启用袋外预测
% 4. 模型评估
Y_pred = predict(model, X_test);
accuracy = sum(strcmp(Y_pred, Y_test)) / numel(Y_test);
fprintf('分类准确率: %.2f%%
', accuracy*100);
% 5. 特征重要性分析
importance = model.OOBPermutedPredictorDeltaError;
figure;
barh(importance);
set(gca, 'YTickLabel', data.Properties.VariableNames(1:end-1));
title('特征重要性排序');
% 6. 预测新数据
new_sample = [0.2,0.5,0.7,0.1]; % 示例新数据
new_sample_scaled = mapminmax('apply', new_sample', ps_input);
prediction = predict(model, new_sample_scaled);
disp(['新数据预测类别: ', char(prediction)]);
end
复制成功
二、关键算法解析
TreeBagger(numTrees, X, Y, 'Method', 'classification', ...)
复制成功
model.OOBPermutedPredictorDeltaError % 特征重要性评分
model.PredictorNames % 特征名称
model.ClassNames % 分类类别标签
复制成功
代码块
% 网格搜索调参示例(分类任务)
bestAcc = 0;
for nt = [50,100,200]
for ml = [3,5,7]
model = TreeBagger(nt, X_train, Y_train, ...
'MinLeafSize', ml, 'OOBPrediction', 'on');
Y_pred = predict(model, X_test);
acc = sum(strcmp(Y_pred, Y_test))/numel(Y_test);
if acc > bestAcc
bestAcc = acc;
bestParams = struct('NumTrees', nt, 'MinLeaf', ml);
end
end
end
disp(['最佳参数: ', num2str(bestParams.NumTrees), '树, 最小叶子: ', num2str(bestParams.MinLeaf)]);
复制成功
参考仿真代码 matlab中随机森林算法的实现 youwenfan.com/contentbia/65107.html
代码块
% 混淆矩阵
confMat = confusionmat(Y_test, Y_pred);
disp('分类报告:');
disp(classificationReport(confMat));
% ROC曲线
[~,~,~,AUC] = perfcurve(Y_test, str2double(Y_pred), 'positiveClass');
figure;
plot([0,1],[0,1],'r--');
hold on;
plot(rocData(:,1), rocData(:,2));
xlabel('假阳性率'); ylabel('真阳性率');
title(['AUC = ', num2str(AUC)]);
复制成功
2. 回归任务评估
代码块
% 回归任务代码修改
model = TreeBagger(numTrees, X_train, Y_train, 'Method', 'regression');
% 评估指标
rmse = sqrt(mean((Y_test - predict(model, X_test)).^2));
r2 = 1 - sum((Y_test - predict(model, X_test)).^2)/var(Y_test);
fprintf('回归性能: RMSE=%.2f, R²=%.2f
', rmse, r2);
复制成功
1. 特征重要性可视化
代码块
% 基尼重要性排序
imp = model.OOBPermutedPredictorDeltaError;
[~, idx] = sort(imp, 'descend');
figure;
barh(idx, imp(idx));
set(gca, 'YTickLabel', data.Properties.VariableNames(1:end-1));
title('特征重要性(基尼指数)');
复制成功
2. 多分类任务扩展
代码块
% 加载多分类数据集(如鸢尾花)
load fisheriris
X = meas;
Y = species;
% 训练模型
model = TreeBagger(100, X, Y, 'Method', 'classification');
% 预测新样本
new_sample = [5.1,3.5,1.4,0.2];
predicted_class = predict(model, new_sample);
disp(['预测类别: ', char(predicted_class)]);
复制成功
1.并行计算加速:
代码块
% 启用并行计算
if isempty(gcp('nocreate'))
parpool; % 启动并行池
end
model = TreeBagger(200, X, Y, 'UseParallel', true);
复制成功
2.缺失值处理:
代码块
% 自动处理缺失值
model = TreeBagger(100, X, Y, 'MissingData', 'on');
复制成功
3.增量学习:
代码块
% 分阶段训练
model = TreeBagger(50, X_train1, Y_train1);
model = growTrees(model, X_train2, Y_train2); % 新增训练数据
复制成功
代码块
%% 随机森林工程模板
function main_rf()
% 数据输入
[X, Y] = load_dataset('dataset.mat');
% 数据预处理
[X_scaled, ps] = preprocess_data(X);
% 模型训练
model = train_rf(X_scaled, Y);
% 模型评估
evaluate_model(model, X_scaled, Y);
% 模型保存
save_model(model, 'random_forest_model.mat');
end
复制成功
该实现方案整合了MATLAB内置的函数与工程优化技巧,支持从数据预处理到模型部署的全流程。通过调整树的数量、特征子集大小等参数,可适应不同数据集的需求。对于超大规模数据,建议结合Hadoop/MAPReduce进行分布式计算。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删