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

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

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

本文分为两部分,首先是将代码分段、详细讲解,方便大家理解;随后是完整代码,方便大家自行尝试。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、打开微信公众平台官网:http://mp.weixin.qq.com/右上角点击“立即注册”;选择帐号类型;2、填写邮箱,登录您的邮箱,查看激活邮件,填写邮箱验证码激活;3、信息登记,选择个人类型之后,填写身份证信息;4、填写帐号信息,包括公众号名称、功能介绍,选择运营地区;恭喜注册成功!

  • 土耳其女兵司令部遭袭(库尔德女兵遭土耳其侮辱)

    据悉,由于土耳其支持的武装分子拒绝接受俄土停火协议,因此叙利亚方面被迫展开了自卫行动,对入侵的土军部队进行反攻,据悉叙利亚正规军部队和库尔德武装密切配合,击退了土耳其支持的武装分子,并打死打伤了几十人,牢牢控制着停火线地区的阵地,与此同时,叙利亚军队也在不断向前线地区增兵,以防止土耳其阵营的部队继续发动入侵,据悉叙军大批坦克、装甲车和火炮正在不断赶来,这将大大增强当地的防御能力。

  • 抖音不让对方看和拉黑有什么区别(抖音不让对方看和拉黑的区别)

    抖音不让对方看和拉黑有什么区别?抖音不让对方看和拉黑有什么区别抖音不让他看只是不让对方看自己的主页作品等,限制的权限比较少,而拉黑限制的权限多,包括了不让他看限制,还无法给用户发消息,会自动取关用户等。抖音设置不给谁看,对方不会接到通知,一般是不会知道的。在聊天页面中点击对方的头像进入到对方抖音的个人页面,如果发现此时屏幕中显示有“关注”按钮,并且在对方的个人页。

  • 富士康model b尺寸(富士康ModelB官图发布)

    近日,鸿海集团发布了FoxtronModelB的视频,新车将于10月18日鸿海科技日正式亮相,首批量产车将在2023年投产,对于它的出现,又将有哪些亮点可言呢?内饰设计以及详细信息配置,目前还尚未进行公布,后续小编将会持续跟踪报道。动力方面,据悉,FoxtronModelB续航里程可达500公里,并且未来有望在中国以及德国和美国同步发售。

  • 谨配哪个字更有寓意女孩(和瑾字搭配的内涵女名)

    以下内容希望对你有帮助!谨配哪个字更有寓意女孩搭配单字:华、娴、佩、冉、谆、云、艳、娅、雪、霞、慧、梦、汶、爱、玙、玥、秀、红、纯、艾。瑾字单独用作名字就很好。瑾瑜、晨瑾、惜瑾、瑾怡、佳瑾、淑瑾、瑾雅、欣瑾、晓瑾、瑾惠、慧瑾、明瑾、瑾婉等等。

  • 逗比阿飞躺在三尾身上(变态的林仙儿谁都可以)

    林仙儿则是个变态,她本是穷人家孩子出身。林仙儿从前住的是破茅屋,吃的是糟糠饭,穿的是粗布烂衣,睡的是门板床。这一切都让林仙儿感到吃惊,恍惚觉得是做梦。通过一次次卖肉,林仙儿得到了金钱、权势、神兵利器、消息。如果林仙儿一点不挑食,读者也没话可说。阿飞深爱着林仙儿,是唯一对林仙儿真爱的人。可是林仙儿不但没有爱过他,还利用阿飞,甚至在阿飞面前跟别人亲热,想要杀了阿飞。

  • 水瓶女克哪个星座男(水瓶座女克什么星座)

    水瓶女克哪个星座男天秤座:相克指数:60%,天秤座的男生天生具有优雅高贵的气质,看似与之有一定差距;但是性格温和的天秤男偏爱古灵精怪的水瓶女;一向沉稳的天秤男,生活中比较压抑自我,一直寻找制衡点的天秤男,更容易被活泼开朗的水瓶女所吸引;虽然水瓶女独立自主,有自己的想法主意;从不依赖别人,这让天秤男毫无体现自己的地方;但是天秤男善解人意的脾性最容易包容这样任性的水瓶女了。这就是相克相爱的魅力所在。

  • 画皮1陈坤评价周迅(时隔8年画皮3将袭)

    导演陈嘉上也成为第五位晋身“两亿元导演俱乐部”的华人导演。2012年,陈国富监制、乌尔善执导的《画皮2》再度登陆全国影院,一举拿下了7.26亿票房的好成绩。当时这部剧由周迅、赵薇、陈坤主演。其实,前两部剧下来,周迅、赵薇、陈坤已经成了《画皮》系列的“铁三角”了,他们演绎的角色也是深入人心。而女主目前从官方网站上来看,暂时确定的是周迅。

  • 干木棉花煲汤是什么颜色(三月木棉红四月木棉熟)

    传说五指山有位黎族老英雄名叫吉贝,常常带领人民打败异族的侵犯。做法:汤锅加水足量,加入洗净的木棉花、薏苡仁、扁豆、生姜,大火烧开后转文火煮1小时,骨头焯水滤干后加入汤锅中继续煮1小时,食盐调味即可食用。食用禁忌木棉花性偏寒,因而身体素质弱、胃肠不好、体质虚寒的人群不可过多服用,老人、孕妇慎用,经常拉肚子的人慎食,正常人每周也不宜超过2次。

  • 网购冷知识你绝对不知道(我在网购路上真金白银踩过的雷)

    我在网购路上真金白银踩过的雷网购路漫漫,下手需谨慎遥望当年我才开始网购那会儿,踩过的雷简直不要太多哦,双十一也狠狠上过几次当,买回来全都是在现实中看到我绝对不会花钱的款式,那是相当失败[尬笑]后面逐渐在网购上打开局面也是因为我认。