matlab中随机森林算法的实现

基于MATLAB实现随机森林算法


一、核心实现代码

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

二、关键算法解析

1. 核心函数 TreeBagger
  • 参数说明

    matlab 复制代码
    TreeBagger(numTrees, X, Y, 'Method', 'classification', ...)
    • numTrees:决策树数量(推荐50-500)
    • Method:任务类型(classification/regression
    • MinLeafSize:最小叶子节点数(防止过拟合)
    • OOBPrediction:启用袋外误差计算
  • 输出对象属性

    matlab 复制代码
    model.OOBPermutedPredictorDeltaError  % 特征重要性评分
    model.PredictorNames                  % 特征名称
    model.ClassNames                      % 分类类别标签
2. 参数优化策略
matlab 复制代码
% 网格搜索调参示例(分类任务)
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中随机森林算法的实现 www.youwenfan.com/contentcsd/65107.html

三、性能评估指标

1. 分类任务评估
matlab 复制代码
% 混淆矩阵
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. 回归任务评估
matlab 复制代码
% 回归任务代码修改
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. 特征重要性可视化
matlab 复制代码
% 基尼重要性排序
imp = model.OOBPermutedPredictorDeltaError;
[~, idx] = sort(imp, 'descend');
figure;
barh(idx, imp(idx));
set(gca, 'YTickLabel', data.Properties.VariableNames(1:end-1));
title('特征重要性(基尼指数)');
2. 多分类任务扩展
matlab 复制代码
% 加载多分类数据集(如鸢尾花)
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. 并行计算加速
matlab 复制代码
% 启用并行计算
if isempty(gcp('nocreate'))
    parpool;  % 启动并行池
end
model = TreeBagger(200, X, Y, 'UseParallel', true);
  1. 缺失值处理
matlab 复制代码
% 自动处理缺失值
model = TreeBagger(100, X, Y, 'MissingData', 'on');
  1. 增量学习
matlab 复制代码
% 分阶段训练
model = TreeBagger(50, X_train1, Y_train1);
model = growTrees(model, X_train2, Y_train2);  % 新增训练数据

六、应用场景示例

1. 医疗诊断(分类)
matlab 复制代码
% 加载糖尿病数据集
load diabetes;
X = diabetes(:,1:8);
Y = diabetes(:,9);

% 训练与评估
model = TreeBagger(150, X, Y, 'Method', 'classification');
cv = crossval(model, 'KFold', 5);
cvLoss = kfoldLoss(cv);
disp(['5折交叉验证损失: ', num2str(cvLoss)]);
2. 金融风控(回归)
matlab 复制代码
% 加载贷款违约数据
data = readtable('loan_data.csv');
X = data(:,2:end-1);
Y = data.Default;

% 回归模型训练
model = TreeBagger(200, X, Y, 'Method', 'regression');
Y_pred = predict(model, X);
rmse = sqrt(mean((Y - Y_pred).^2));

七、常见问题解决

  1. 过拟合控制
    • 增加MinLeafSize参数
    • 使用OOBPrediction进行袋外验证
    • 限制树的最大深度:MaxNumSplits
  2. 类别不平衡处理
matlab 复制代码
% 加权随机森林
model = TreeBagger(100, X, Y, ...
    'Method', 'classification', ...
    'ClassNames', {'class1','class2'}, ...
    'Prior', 'uniform');  % 或 'empirical'
  1. 大规模数据处理:
    • 使用RF_MexStandalone预编译包加速
    • 分块训练:growTrees函数增量更新模型

八、完整工程模板

matlab 复制代码
%% 随机森林工程模板
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内置的TreeBagger函数与工程优化技巧,支持从数据预处理到模型部署的全流程。通过调整树的数量、特征子集大小等参数,可适应不同数据集的需求。对于超大规模数据,建议结合Hadoop/MAPReduce进行分布式计算。

相关推荐
让我们一起加油好吗1 小时前
【基础算法】初识搜索:递归型枚举与回溯剪枝
c++·算法·剪枝·回溯·洛谷·搜索
stbomei3 小时前
基于 MATLAB 的信号处理实战:滤波、傅里叶变换与频谱分析
算法·matlab·信号处理
2401_876221343 小时前
Reachability Query(Union-Find)
c++·算法
我找到地球的支点啦4 小时前
Matlab系列(005) 一 归一化
人工智能·机器学习·matlab·信息与通信
德先生&赛先生4 小时前
LeetCode-542. 01 矩阵
算法·leetcode·矩阵
HAH-HAH4 小时前
【洛谷】P2197【模板】Nim 游戏
算法·游戏
lichkingyang4 小时前
最近遇到的几个JVM问题
java·jvm·算法
yueyuebaobaoxinx5 小时前
MATLAB 与 Simulink 联合仿真:控制系统建模与动态性能优化
开发语言·matlab·性能优化
躲着人群6 小时前
次短路&&P2865 [USACO06NOV] Roadblocks G题解
c语言·数据结构·c++·算法·dijkstra·次短路