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

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');

    推荐阅读
  • 湖北车牌号城市代号(湖北各个城市的车牌代号)

    我们一起去了解并探讨一下这个问题吧!湖北车牌号城市代号湖北车牌代码:鄂A-鄂S。具体城市代号如下:A武汉市B黄石市C十堰市D荆州市E宜昌市F襄樊市G鄂州市H荆门市J黄冈市K孝感市L咸宁市M仙桃市N潜江市P神农架林区Q恩施土家族苗族自治州R天门市S随州市

  • 英特尔处理器性能排行(英特尔发布第12代酷睿HX处理器)

    于今年年初发布的第12代酷睿H系列处理器已拥有了令人惊叹的性能表现。现在,仅仅过去了4个月的时间,英特尔再次超越自我,重磅推出了第12代酷睿HX系列处理器。酷睿i9-12950HX领衔,7款处理器规格参数一览此次发布的第12代酷睿HX系列处理器共7款,包括两款酷睿i9,三款酷睿i7,两款酷睿i5。特别是,第12代酷睿HX系列处理器的登场,将移动PC的处理器提升至了16核心24线程的规格。

  • 白网纹草怎么养护(网纹草如何养护?)

    建议用腐叶土、园土、河沙相混合加入少许基肥。保持温度在15℃以上即可。保持插壤温度24~30℃之间。

  • 鬼谷八荒bug怎么反馈(鬼谷八荒疑难问题解答)

    鬼谷八荒bug怎么反馈?鬼谷八荒bug怎么反馈想必各位已经开始了洪荒界的冒险,让我万万没想到的是,刚进入洪荒界我连个武罗都打不过,前几天那几个叨逼叨游戏无聊的人过来打洪荒来,想起自己在2077中被赛博朋克疯子劝退的场景。好多忠于游戏的小伙伴可能不会选择使用修改器,风灵月影是一个修改器的作者,开启修改器,什么云烟星山、苍月明教、焚虹玄谷均是渣渣,但是不建议大家加入风灵月影教,不出半个小时就会索然无味。

  • 表达连想都不敢想的成语(表达连想都不敢想的成语有哪些)

    接下来我们就一起去研究一下吧!表达连想都不敢想的成语表达连想都不敢想的成语:安分守己、望尘莫及、瞠乎其后。安分守己,安于本分,谨守自己处世的规矩。指处世谨慎,规规矩矩。望尘莫及,意思是只望见前面骑马的人走过扬起的尘土而不能赶上。比喻远远落在后面。多用于表示对人钦佩的自谦语。瞠乎其后,在后面干瞪眼。形容差距大,赶不上别人。

  • 汽车大灯全系卤素(看完能救命用车需注意)

    雨雾天夜间行车,大部分装配了卤素大灯的车型,基本无办法将车前方的区域照亮,严重影响行车安全,只有一小部分卤素大灯的车辆,其大灯亮度是足够,汽车的配置中,减配对安全性影响最大的就是汽车前大灯。而最受欢迎的改装氙气大灯,价格3000元左右。4测试结果测试当晚,测试场地有轻雾,原车卤素大灯在这种天气下,照明效果是最糟糕的。

  • 关于条件格式的使用有哪几种规则(条件格式的这6种高级用法)

    选择该选项可以根据所选单元格区域中的具体值设置单元格格式,要设置何种单元格格式,还需要在下拉列表中进行选择。根据单元格数据相对于平均值的大小设置单元格格式如果需要根据所选单元格区域的平均值来设置条件格式,可以在对话框中的列表框中选择选项,如下图所示。步骤05:经过上步操作后,A2:A15单元格区域中属于星期六和星期天的日期将会以橙色底纹显示出来,效果如下图所示。

  • 豌豆凉粉的做法与配方(豌豆凉粉的制作方法与配方)

    豌豆凉粉的做法与配方食材:豌豆粉200g、凉水1400ml、陈醋2勺、味事达酱香鲜酱油(生抽)3勺、辣椒油(无盐)1勺、老干妈豆豉辣酱1勺、花椒油半勺、糖半勺、蒜2瓣、小葱烤熟花生仁随意、熟白芝麻随意、黄瓜100g。放温凉后盖盖放入冰箱冷藏。三勺酱油,两勺陈醋,老干妈豆豉辣酱一勺,辣椒油一勺(无咸味),花椒油半勺,糖半勺,蒜两瓣捣蒜蓉。全部调料拌匀浇到豌豆粉上,撒上花生芝麻小葱拌匀即可。

  • 天津东疆纪念公园要门票吗?(天津东疆湾景区门票)

    地标广场、阅海广场为两大区域,建有浮雕文化景墙,北大防波堤工程纪念碑,观景木栈道平台等,可近距离领略天津港和海滨风景。

  • 庆余年讲解豆瓣(不正经的庆余年)

    剧中,令人印象深刻的演员是吴刚老师饰演的鉴查院院长陈萍萍。醉仙居花魁司理理更是将陈萍萍描述为“公认的暗夜之王,万恶之源”。许多人应该是认为陈萍萍是女的,心理的预设、名字含义有着明显的反差。除了陈萍萍,剧中由陈道明所饰演的庆帝令人印象深刻。让范闲义无反顾的找幕后真凶,开始了他的京都惊心动魄的历程,也让他正式成为情怀的践行者。