当前位置:   article > 正文

随机森林 matlab_随机森林matlab例子

随机森林matlab例子

Ref: 官方 matlab   已有牛人

在前人的基础上进行学习,然后针对具体应用。 很容易掌握 随机森林法

基本概念

Random Forest(随机森林)是Bagging的扩展变体,它在以决策树 为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机特征选择

因此可以概括RF包括四个部分:

1、随机选择样本(放回抽样);

2、随机选择特征属性;

3、构建决策树;

4、随机森林投票(平均) 因此防止过拟合能力更强,降低方差。

图来源: 影响随机森林模型的参数

1 确定参数: leaf 和tree的数量

这一块直接使用他人代码,然后根据自己需求修改 。

input:输入的工艺参数 m*n , n个特征。

output:输出结果  m*1

  1. for RFOptimizationNum=1:5
  2. RFLeaf=[5,10,20,50,100,200,500];
  3. col='rgbcmyk';
  4. figure('Name','RF Leaves and Trees');
  5. for i=1:length(RFLeaf)
  6. RFModel=TreeBagger(2000,Input,Output,'Method','R','OOBPrediction','On','MinLeafSize',RFLeaf(i));
  7. plot(oobError(RFModel),col(i));
  8. hold on
  9. end
  10. xlabel('Number of Grown Trees');
  11. ylabel('Mean Squared Error') ;
  12. LeafTreelgd=legend({'5' '10' '20' '50' '100' '200' '500'},'Location','NorthEast');
  13. title(LeafTreelgd,'Number of Leaves');
  14. hold off;
  15. % xlabel 'Number of Grown Trees'
  16. % ylabel 'Mean Squared Error'
  17. disp(RFOptimizationNum);
  18. end
  19. %RFLeaf=50; NumTrees=400

RFOptimizationNum是为了多次循环,防止最优结果受到随机干扰。

RFLeaf定义初始的叶子节点个数,这里设置了从5500,从5到500这个范围内找到最优叶子节点个数。

InputOutput分别是输入(自变量)与输出(因变量)

如果训练还要调参,看这个

 叶子5(mse最小),树350(稳定了)

2 模型训练

 采用上面的参数进行训练

这里涉及里的一个随机分配数据集的问题,我的程序中数据已经归一化到【0,1】,所以获得随机样本后,有一个找训练集,然后删除随机样本的模块。就是赋值=-2,标记为随机的样本,循环外将测试集的行删除了。这里还可有其他方法,深度学习里有矩阵删除。后期补充。

TrainYield是训练集的因变量,TrainVARI是训练集的自变量;TestYield是测试集的因变量,TestVARI是测试集的自变量。 

变量名参照大牛的程序,所以没改。

  1. %% Training Set and Test Set Division
  2. RandomNumber=(randperm(length(Output),floor(length(Output)*0.2)))';
  3. TrainYield=Output;
  4. TestYield=zeros(length(RandomNumber),1);
  5. TrainVARI=Input;
  6. TestVARI=zeros(length(RandomNumber),size(TrainVARI,2));
  7. for i=1:length(RandomNumber)
  8. m=RandomNumber(i,1);
  9. TestYield(i,1)=TrainYield(m,1);
  10. TestVARI(i,:)=TrainVARI(m,:);
  11. TrainYield(m,1)=-2;
  12. TrainVARI(m,:)=-2;
  13. end
  14. TrainYield(all(TrainYield==-2,2),:)=[];
  15. TrainVARI(all(TrainVARI==-2,2),:)=[];
  16. %% RF
  17. nTree=350;%200;%350;
  18. nLeaf=5;% 前面获得的
  19. RFModel=TreeBagger(nTree,TrainVARI,TrainYield,...
  20. 'Method','regression','OOBPredictorImportance','on', 'MinLeafSize',nLeaf);
  21. [RFPredictYield,RFPredictConfidenceInterval]=predict(RFModel,TestVARI);
  22. % PredictBC107=cellfun(@str2num,PredictBC107(1:end));
  23. %% Accuracy of RF
  24. RFRMSE=sqrt(sum(sum((RFPredictYield-TestYield).^2))/size(TestYield,1));
  25. RFrMatrix=corrcoef(RFPredictYield,TestYield);
  26. RFr=RFrMatrix(1,2);
  27. RFRMSEMatrix=[RFRMSEMatrix,RFRMSE];
  28. RFrAllMatrix=[RFrAllMatrix,RFr];
  29. % if RFRMSE<1000
  30. disp(RFRMSE);
  31. % break;
  32. % end
  33. % disp(RFCycleRun);
  34. % str=['Random Forest is Solving...',num2str(100*RFCycleRun/RFRunNumSet),'%'];
  35. % waitbar(RFCycleRun/RFRunNumSet,RFScheduleBar,str);
  36. % end
  37. close(RFScheduleBar);
  38. RFRMSE
  39. % % rmse=0.20
  40. [mae,rmse,r2,mape] = EvlMetrix(TestYield,RFPredictYield)

   nTreenLeaf就是 确定的最优树个数与最优叶子节点个数,RFModel就是训练的模型,RFPredictYield是预测结果,RFPredictConfidenceInterval是预测结果的置信区间。

3 模型结果对比

   用随机测试集来测试性能

  1. [RFPredictYield,RFPredictConfidenceInterval]=predict(RFModel,TestVARI);
  2. [mae,rmse,r2,mape] = EvlMetrix(TestYield,RFPredictYield)
  3. figure
  4. plot(TestYield,'b-d')
  5. hold on
  6. plot(RFPredictYield,'r-d')
  7. hold off
  8. legend('GroundTruth','Prediction')
  9. xlabel('Sample Number')
  10. ylabel('target Value')

4 评价函数

评价指标介绍 看大牛的

 评价指标的函数 MAE, RMSE, R2,MAPE 等具体计算方法如下,我进行了封装, Yreal,Ypred分别是真值和预测值。

平均绝对误差

  均方根误差

平均绝对误差(Mean Absolute Error)

. 

 平均绝对百分比误差(Mean Absolute Percentage Error)

 我用R2和mae进行性能比较

具体函数如下:

  1. function [mae,rmse,r2,mape] = EvlMetrix(YReal,YPred)
  2. % caculate the index of machine learning
  3. % Detailed explanation goes here
  4. rmse = sqrt(mean((YPred-YReal).^2));
  5. r2 = 1 - (sum((YPred - YReal).^2) / sum((YReal - mean(YReal)).^2));
  6. mae = mean(abs(YReal - YPred));
  7. mape = mean(abs((YReal - YPred)./YReal));
  8. end

5 关联指标评价

我的参数太少,没用

  1. figure
  2. bar(RFModel.OOBPermutedVarDeltaError)
  3. xlabel 'Feature Number'
  4. ylabel 'Out-of-Bag Feature Importance'

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/94496
推荐阅读
相关标签
  

闽ICP备14008679号