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

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

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

本文分为两部分,首先是将代码分段、详细讲解,方便大家理解;随后是完整代码,方便大家自行尝试。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');

    推荐阅读
  • 主持人余声节目时间(青梅竹马的婚姻幻灭了)

    在2019年的时候,余声大婚了,才知道安徽卫视主持一姐,嫁给了富商。这时候,已经结婚的粉丝,也表达了自己的看法。余声婚后很快顺利怀孕,孕期开心记录了幸福的日常。有很多网友发文爆料,余声的老公魏鹏和配音师唐虎,还有一个叫吴爽的人。目前为止,主持人余声还没有发声,视频更新停留在前几天。唐虎是安徽卫视长期合作的配音师,和余声也是好朋友,有时候还会跨界担当主持人的工作。

  • 学习的文案(关于学习的句子)

    学习的文案学习从来无捷径,循序渐进登高楼。一个成功者所知道的,除了勤奋,便是谦逊。学习必须与实干相结合。应当随时学习,学习一切;应该集中全力,以求知道得更多,知道一切。我在科学方面所作出的任何成绩,都只是由于长期思索忍耐和勤奋而获得的。在学习上不肯钻研的人是不会提出问题的;在事业上缺乏突破力的人是不会有所创新的。读书之法,在循序而渐进,熟读而精思。学习本无底,前进莫彷徨。

  • 猫咪一直拉稀怎么改善(猫咪拉稀怎么解决)

    严重时,建议送医接受治疗。所以一旦发现猫咪患上了肠胃炎就需要尽快地送医治疗。解决办法:猫咪有寄生虫建议立马驱虫,接着每3个月驱虫一次,直到彻底杜绝寄生虫为止。猫咪驱虫后一般会有呕吐等应激反应,可以喂点宠物益生菌调理一下。然后给猫咪喂点宠物益生菌,益生菌可以改善肠道菌群环境,增强肠道的蠕动功能,进一步改善消化不良的情况。

  • 2022中山市东升高级中学录取分数线 2022中山市东升高级中学录取分数线是多少

    2022中山市东升高级中学录取分数线第一批普通高中普通生B类计划按总分B由高到低投档,对应考查科目为物理、化学、地理和生物;A类计划按总分A由高到低投档,对应考查科目为历史、道德与法治、地理和生物;综合素质评价要求C等级或以上。

  • 被误判入狱出狱后疯狂报复(蹲了六年监狱仍不悔改)

    保定易县的宗某今年35岁,因为盗窃已经蹲了六年监狱。■男子盗窃的部分物品凌晨3点居民家中频被窃2015年12月份起,保定市易县县城内连续接到群众报警称自家失窃。经过现场突审,35岁的宗某很快交代了准备实施盗窃的犯罪事实。六年的铁窗生活没有让宗某反省,反而在2015年4月出狱后再次重操旧业。截至被抓,已累计作案46起。目前,宗某已被易县警方刑事拘留,案件正在进一步处理中。

  • 煮海石花不加醋可以吗(煮海石花不加醋好吃吗)

    以下内容大家不妨参考一二希望能帮到您!通常情况下海石花煮的时候是需要加一定量的白醋的,因为只有这样海石花才会析出胶质,做成海石花,否则就会导致海石花不凝固,并且还会带有一定的腥味,吃起来口感不是很好。

  • 迎春灯笼怎么挂好看(过年的时候家里摆上一盆宫灯百合)

    今天小花同样将它介绍给大家,它就是宫灯百合。宫灯百合的植株有一米多高,它的枝干和叶子与我们常见的富贵竹有点相似。懂得布置的朋友可以在宫灯百合旁边放一盏灯,在灯灯光的映衬下,整个植株红红火火特别有过年的气氛。宫灯百合不但可以土壤种植,也可以水培。其次要保证它适宜的生长温度,宫灯百合最喜欢的生长温度是在25度左右,所以在寒冷的冬天里,我们就必须要将它放在温暖的室内。

  • 重阳登高的民间故事(重阳登高故事介绍)

    一场瘟疫夺走了青年桓景的父母,他自己也因病差点丧命。病好之后,恒景就去拜师学艺,想要打败瘟魔,后来恒景经过不断的努力,终于找到了一位仙人,仙人被他的精神所感动,教给了他一身武艺。在九月初九的前一天让恒景回到家乡,并且还送给了他一包茱萸叶,一盅菊花酒。还有一种说法是登高其实是源于古人对山岳的崇拜。所以许多人都对大自然怀着一份敬畏之心。

  • 2022汉阳区小学入学条件及入学登记平台一览

    小学一年级新生须年满6周岁,即2016年8月31日(含)前出生。所需材料1、“户籍和住房一致”需要准备哪些证件呢?注意事项如户口、房产证等相关资料信息发生变更,以5月25日前资料信息为准。

  • 糖醋排骨怎么做法(糖醋排骨的做法介绍)

    糖醋排骨怎么做法食材:肋排500克,香葱1棵,生姜1块,大蒜2瓣,淀粉适量,食用油500克,酱油1/2大匙,香醋1大匙,精盐1/2小匙,白糖(黄糖)1大匙,叉烧酱1大匙。小排500克焯水后,煮三十分钟,肉汤可以煮面条,需要保留。用一汤匙料酒,一汤匙生抽,半汤匙老抽,二汤匙香醋腌制20分钟。捞出洗净控水备用,炸至金黄,油别放多,可以省油,只要翻身得勤就好了。半碗肉汤大火烧开,调入半茶匙盐提味。临出锅撒葱花芝麻,少许味精。