高考考试网
当前位置: 首页 高考资讯

matlab回归分析案例(基于MATLAB的随机森林RF回归与变量重要性影响程度排序代码)

时间:2023-07-30 作者: 小编 阅读量: 3 栏目名: 高考资讯

本文分为两部分,首先是将代码分段、详细讲解,方便大家理解;随后是完整代码,方便大家自行尝试。1分解代码1.1最优叶子节点数与树数确定首先,我们需要对RF对应的叶子节点数与树的数量加以择优选取。其中,模型每一次运行都会将RMSE与r结果记录到对应的矩阵中。

本文分为两部分,首先是将代码分段、详细讲解,方便大家理解;随后是完整代码,方便大家自行尝试。另外,关于基于MATLAB的神经网络(ANN)代码与详细解释,大家可以查看这一篇博客:https://blog.csdn.net/zhebushibiaoshifu/article/details/115029033。

1 分解代码1.1 最优叶子节点数与树数确定

首先,我们需要对RF对应的叶子节点数与树的数量加以择优选取。

%% Number of Leaves and Trees Optimizationfor RFOptimizationNum=1:5RFLeaf=[5,10,20,50,100,200,500];col='rgbcmyk';figure('Name','RF Leaves and Trees');for i=1:length(RFLeaf)RFModel=TreeBagger(2000,Input,Output,'Method','R','OOBPrediction','On','MinLeafSize',RFLeaf(i));plot(oobError(RFModel),col(i));hold onendxlabel('Number of Grown Trees');ylabel('Mean Squared Error') ;LeafTreelgd=legend({'5' '10' '20' '50' '100' '200' '500'},'Location','NorthEast');title(LeafTreelgd,'Number of Leaves');hold off;disp(RFOptimizationNum);end

其中,RFOptimizationNum是为了多次循环,防止最优结果受到随机干扰;大家如果不需要,可以将这句话删除。

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

Input与Output分别是我的输入(自变量)与输出(因变量),大家自己设置即可。

运行后得到下图:

首先,我们看到MSE最低的线是红色的,也就是5左右的叶子节点数比较合适;再看各个线段大概到100左右就不再下降,那么树的个数就是100比较合适。

1.2 循环准备

由于机器学习往往需要多次执行,我们就在此先定义循环。

%% Cycle PreparationRFScheduleBar=waitbar(0,'Random Forest is Solving...');RFRMSEMatrix=[];RFrAllMatrix=[];RFRunNumSet=10;for RFCycleRun=1:RFRunNumSet

其中,RFRMSEMatrix与RFrAllMatrix分别用来存放每一次运行的RMSE、r结果,RFRunNumSet是循环次数,也就是RF运行的次数。

1.3 数据划分

接下来,我们需要将数据划分为训练集与测试集。这里要注意:RF其实一般并不需要划分训练集与测试集,因为其可以采用袋外误差(Out of Bag Error,OOB Error)来衡量自身的性能。但是因为我是做了多种机器学习方法的对比,需要固定训练集与测试集,因此就还进行了数据划分的步骤。

%% Training Set and Test Set DivisionRandomNumber=(randperm(length(Output),floor(length(Output)*0.2)))';TrainYield=Output;TestYield=zeros(length(RandomNumber),1);TrainVARI=Input;TestVARI=zeros(length(RandomNumber),size(TrainVARI,2));for i=1:length(RandomNumber)m=RandomNumber(i,1);TestYield(i,1)=TrainYield(m,1);TestVARI(i,:)=TrainVARI(m,:);TrainYield(m,1)=0;TrainVARI(m,:)=0;endTrainYield(all(TrainYield==0,2),:)=[];TrainVARI(all(TrainVARI==0,2),:)=[];

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

因为我这里是做估产回归的,因此变量名称就带上了“Yield”,大家理解即可。

1.4 随机森林实现

这部分代码其实比较简单。

%% RFnTree=100;nLeaf=5;RFModel=TreeBagger(nTree,TrainVARI,TrainYield,...'Method','regression','OOBPredictorImportance','on', 'MinLeafSize',nLeaf);[RFPredictYield,RFPredictConfidenceInterval]=predict(RFModel,TestVARI);

其中,nTree、nLeaf就是1.1部分中我们确定的最优树个数与最优叶子节点个数,RFModel就是我们所训练的模型,RFPredictYield是预测结果,RFPredictConfidenceInterval是预测结果的置信区间。

1.5 精度衡量

在这里,我们用RMSE与r衡量模型精度。

%% Accuracy of RFRFRMSE=sqrt(sum(sum((RFPredictYield-TestYield).^2))/size(TestYield,1));RFrMatrix=corrcoef(RFPredictYield,TestYield);RFr=RFrMatrix(1,2);RFRMSEMatrix=[RFRMSEMatrix,RFRMSE];RFrAllMatrix=[RFrAllMatrix,RFr];if RFRMSE<400disp(RFRMSE);break;enddisp(RFCycleRun);str=['Random Forest is Solving...',num2str(100*RFCycleRun/RFRunNumSet),'%'];waitbar(RFCycleRun/RFRunNumSet,RFScheduleBar,str);endclose(RFScheduleBar);

在这里,我定义了当RMSE满足<400这个条件时,模型将自动停止;否则将一直执行到1.2中我们指定的次数。其中,模型每一次运行都会将RMSE与r结果记录到对应的矩阵中。

1.6 变量重要程度排序

接下来,我们结合RF算法的一个功能,对所有的输入变量进行分析,去获取每一个自变量对因变量的解释程度。

%% Variable Importance ContrastVariableImportanceX={};XNum=1;% for TifFileNum=1:length(TifFileNames)%if ~(strcmp(TifFileNames(TifFileNum).name(4:end-4),'MaizeArea') | ...%strcmp(TifFileNames(TifFileNum).name(4:end-4),'MaizeYield'))%eval(['VariableImportanceX{1,XNum}=''',TifFileNames(TifFileNum).name(4:end-4),''';']);%XNum=XNum 1;%end% endfor i=1:size(Input,2)eval(['VariableImportanceX{1,XNum}=''',i,''';']);XNum=XNum 1;endfigure('Name','Variable Importance Contrast');VariableImportanceX=categorical(VariableImportanceX);bar(VariableImportanceX,RFModel.OOBPermutedPredictorDeltaError)xtickangle(45);set(gca, 'XDir','normal')xlabel('Factor');ylabel('Importance');

这里代码就不再具体解释了,大家会得到一幅图,是每一个自变量对因变量的重要程度,数值越大,重要性越大。

其中,我注释掉的这段是依据我当时的数据情况来的,大家就不用了~

更新:这里请大家注意,上述代码中我注释掉的内容,是依据每一幅图像的名称对重要性排序的X轴(也就是VariableImportanceX)加以注释(我当时做的是依据遥感图像估产,因此每一个输入变量的名称其实就是对应的图像的名称),所以使得得到的变量重要性柱状图的X轴会显示每一个变量的名称。大家用自己的数据来跑的时候,可以自己设置一个变量名称的字段元胞然后放到VariableImportanceX,然后开始figure绘图;如果在输入数据的特征个数(也就是列数)比较少的时候,也可以用我上述代码中间的这个for i=1:size(Input,2)循环——这是一个偷懒的办法,也就是将重要性排序图的X轴中每一个变量的名称显示为一个正方形,如下图红色圈内。这里比较复杂,因此如果大家这一部分没有搞明白或者是一直报错,在本文下方直接留言就好~

1.7 保存模型

接下来,就可以将合适的模型保存。

%% RF Model StorageRFModelSavePath='G:\CropYield\02_CodeAndMap\00_SavedModel\';save(sprintf('%sRF0410.mat',RFModelSavePath),'nLeaf','nTree',...'RandomNumber','RFModel','RFPredictConfidenceInterval','RFPredictYield','RFr','RFRMSE',...'TestVARI','TestYield','TrainVARI','TrainYield');

其中,RFModelSavePath是保存路径,save后的内容是需要保存的变量名称。

2 完整代码

完整代码如下:

%% Number of Leaves and Trees Optimizationfor RFOptimizationNum=1:5RFLeaf=[5,10,20,50,100,200,500];col='rgbcmyk';figure('Name','RF Leaves and Trees');for i=1:length(RFLeaf)RFModel=TreeBagger(2000,Input,Output,'Method','R','OOBPrediction','On','MinLeafSize',RFLeaf(i));plot(oobError(RFModel),col(i));hold onendxlabel('Number of Grown Trees');ylabel('Mean Squared Error') ;LeafTreelgd=legend({'5' '10' '20' '50' '100' '200' '500'},'Location','NorthEast');title(LeafTreelgd,'Number of Leaves');hold off;disp(RFOptimizationNum);end%% Notification% Set breakpoints here.%% Cycle PreparationRFScheduleBar=waitbar(0,'Random Forest is Solving...');RFRMSEMatrix=[];RFrAllMatrix=[];RFRunNumSet=50000;for RFCycleRun=1:RFRunNumSet%% Training Set and Test Set DivisionRandomNumber=(randperm(length(Output),floor(length(Output)*0.2)))';TrainYield=Output;TestYield=zeros(length(RandomNumber),1);TrainVARI=Input;TestVARI=zeros(length(RandomNumber),size(TrainVARI,2));for i=1:length(RandomNumber)m=RandomNumber(i,1);TestYield(i,1)=TrainYield(m,1);TestVARI(i,:)=TrainVARI(m,:);TrainYield(m,1)=0;TrainVARI(m,:)=0;endTrainYield(all(TrainYield==0,2),:)=[];TrainVARI(all(TrainVARI==0,2),:)=[];%% RFnTree=100;nLeaf=5;RFModel=TreeBagger(nTree,TrainVARI,TrainYield,...'Method','regression','OOBPredictorImportance','on', 'MinLeafSize',nLeaf);[RFPredictYield,RFPredictConfidenceInterval]=predict(RFModel,TestVARI);% PredictBC107=cellfun(@str2num,PredictBC107(1:end));%% Accuracy of RFRFRMSE=sqrt(sum(sum((RFPredictYield-TestYield).^2))/size(TestYield,1));RFrMatrix=corrcoef(RFPredictYield,TestYield);RFr=RFrMatrix(1,2);RFRMSEMatrix=[RFRMSEMatrix,RFRMSE];RFrAllMatrix=[RFrAllMatrix,RFr];if RFRMSE<1000disp(RFRMSE);break;enddisp(RFCycleRun);str=['Random Forest is Solving...',num2str(100*RFCycleRun/RFRunNumSet),'%'];waitbar(RFCycleRun/RFRunNumSet,RFScheduleBar,str);endclose(RFScheduleBar);%% Variable Importance ContrastVariableImportanceX={};XNum=1;% for TifFileNum=1:length(TifFileNames)%if ~(strcmp(TifFileNames(TifFileNum).name(4:end-4),'MaizeArea') | ...%strcmp(TifFileNames(TifFileNum).name(4:end-4),'MaizeYield'))%eval(['VariableImportanceX{1,XNum}=''',TifFileNames(TifFileNum).name(4:end-4),''';']);%XNum=XNum 1;%end% endfor i=1:size(Input,2)eval(['VariableImportanceX{1,XNum}=''',i,''';']);XNum=XNum 1;endfigure('Name','Variable Importance Contrast');VariableImportanceX=categorical(VariableImportanceX);bar(VariableImportanceX,RFModel.OOBPermutedPredictorDeltaError)xtickangle(45);set(gca, 'XDir','normal')xlabel('Factor');ylabel('Importance');%% RF Model StorageRFModelSavePath='G:\CropYield\02_CodeAndMap\00_SavedModel\';save(sprintf('%sRF0410.mat',RFModelSavePath),'nLeaf','nTree',...'RandomNumber','RFModel','RFPredictConfidenceInterval','RFPredictYield','RFr','RFRMSE',...'TestVARI','TestYield','TrainVARI','TrainYield');

    推荐阅读
  • 双色鸡蛋饼的制作方法(双色鸡蛋饼做法)

    下面希望有你要的答案,我们一起来看看吧!双色鸡蛋饼的制作方法材料:西葫芦1个、胡萝卜三分之一根、鸡蛋2个、面粉180克、豆油适量、盐2克。把西葫芦和胡萝卜,用插板打成丝。加一小勺盐拌匀,腌制5分钟。平底锅加少许豆油,然后放一勺拌好的菜胡,摊平,2面煎成金黄色,就可以锅了。

  • 女性内分泌失调怎么处理(女性内分泌失调)

    妇科疾病内分泌发生变化,影响最明显的莫过于月经。还会出现乳腺增生、乳腺癌等问题。放松情绪当你承受压力时,就会感到不舒服,这并不奇怪,慢性压力可导致压力激素皮质醇水平长期升高,这会降低激素的分泌,从而致使内分泌失调。生活作息规律多参加各种运动,增强体质。应该多吃一些新鲜果蔬、多吃高蛋白类食物,多喝水,或者多吃一些滋补品,有助于调理内分泌、提高免疫力,改善体质。

  • 你是我的唯一歌词(你是我的唯一歌曲简介)

    你是我的唯一歌词?《你是我的唯一》歌词如下:很想给你写封信,下面我们就来聊聊关于你是我的唯一歌词?接下来我们就一起去了解一下吧!

  • 如何唤醒孩子的内驱力(你需要做好这几点)

    如何唤醒孩子的内驱力鼓励孩子多方面探索世界,扩展认知的宽度和高度,从而发现兴趣点并找到自己内心真正的愿望、价值或使命。更深层次的引导是,让孩子体会到攻克难题,钻研探索的乐趣,唤醒自我提升的内驱力。最后,当孩子走进这扇求知之门的时候,我们不能忽视“环境诱因”对孩子的影响。这里的“诱因”便是指能够激发、满足孩子继续探究、认知和专注的态度、情绪、情境、物质环境以及活动等等。

  • 鹅蛋能和猪肉一起吃吗(鹅蛋能和猪肉一起吃可以吗)

    但是鹅蛋和猪肉里面都含有丰富的蛋白质,一起食用时需要控制好食用的量,食用过多人体无法完全消化,会导致消化不良。母猪肉可以吃,但是其营养价值和口感都不如其他猪肉,而且母猪肉还容易滋生细菌,因此在吃母猪肉的时候建议熟制食用。虽然理论上可以吃母猪肉,但是还是要少吃,因为母猪肉内含有的免疫球蛋白会引起贫血的症状。

  • 钛空金和钛古金颜色对比(带你领略钨金的魅力)

    钨条的熔点3500℃左右。钨矿主要分布在中国和俄罗斯。钨金首饰主要产自中国。因此被时尚界公认为"可以和钻石相媲美"的金属材质。白钨金钨金首饰具有:超高的硬度、光泽度和质感,但色泽乌黑发亮,不能达到部分消费者的理想银白色。白钨金是配合消费者审美观的产物。钨金的概念比较容易让人混淆,许多人也因此而受不法分子的蒙骗造成财产损失。

  • 合果芋枯了怎么办 合果芋叶尖干枯

    因为合果芋的习性,冬天需要好好照顾合果芋,如果没有条件将其放入温室中培养,那么也最好将其置于阳光充足,气温相对来说要高一点的室内环境,并及时浇水,相信干枯发黄的合果芋会在细心的照料下恢复过来的。

  • 办公室财位放什么好(办公室财位可以放什么)

    财位宜放绿色植物财位最好就是摆放一些绿色的植物,就那些叶子比较大的或者橡胶树之类的更加合适;但是大家注意的是,这些植物都是应该用泥土去种植,不能用水去培植的,像那些水仙花之类的就不合适摆放在财位另外财位上是不适合摆放有刺的植物,像仙人掌之类的就不要放了,否则就会有反效果,现在小编就来说说关于办公室财位放什么好?另外财位上是不适合摆放有刺的植物,像仙人掌之类的就不要放了,否则就会有反效果。

  • 哭穷式教育毁掉孩子(教育的另一种畸形生长)

    关于“穷养儿子富养女”的这一观点,一直热度不下。他爸妈知道他有女朋友后,每个月会多给他几百块钱。No.3两年后,他终于工作了,挣了第一笔钱。No.6他想买皮衣,预算只有1000。最后,他从淘宝二手买了件Timberland,袖口都磨毛边了。No.8后来我们分手了,各种原因综合在一起。我这么做了,我们最后一次见面,我把他寄存在我这里的东西还给他,并提出了这个要求。显然不够,可对我已经是意外之财了。分开后,我的支付宝收到了4千块。

  • 360网盾怎么关闭(360网盾打开方式)

    360防火墙V5S增强版,正面的长条形指示灯,上电为红灯闪烁,成功连接网络为绿灯常亮。360防火墙V5S增强版背面,4根外置高性能全向增益天线,左右两侧都设计有散热栏栅,底部为接口区。360防火墙V5S增强版是360基于多年的网络安全技术研究优势,将防火墙功能加入到智能路由器硬件中的一款网络产品。