<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文分為兩部分,首先是對程式碼進行分段、詳細講解,方便大家理解;隨後是完整程式碼,方便大家自行嘗試。另外,關於基於MATLAB的神經網路(ANN)程式碼與詳細解釋,我們將在後期部落格中介紹。
首先,我們需要對RF對應的葉子節點數與樹的數量加以擇優選取。
%% Number of Leaves and Trees Optimization for RFOptimizationNum=1:5 RFLeaf=[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 on end xlabel('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
比較合適。
由於機器學習往往需要多次執行,我們就在此先定義迴圈。
%% Cycle Preparation RFScheduleBar=waitbar(0,'Random Forest is Solving...'); RFRMSEMatrix=[]; RFrAllMatrix=[]; RFRunNumSet=10; for RFCycleRun=1:RFRunNumSet
其中,RFRMSEMatrix
與RFrAllMatrix
分別用來存放每一次執行的RMSE、r結果,RFRunNumSet
是迴圈次數,也就是RF執行的次數。
接下來,我們需要將資料劃分為訓練集與測試集。這裡要注意:RF其實一般並不需要劃分訓練集與測試集,因為其可以採用袋外誤差(Out of Bag Error,OOB Error)來衡量自身的效能。但是因為我是做了多種機器學習方法的對比,需要固定訓練集與測試集,因此就還進行了資料劃分的步驟。
%% Training Set and Test Set Division RandomNumber=(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; end TrainYield(all(TrainYield==0,2),:)=[]; TrainVARI(all(TrainVARI==0,2),:)=[];
其中,TrainYield
是訓練集的因變數,TrainVARI
是訓練集的自變數;TestYield
是測試集的因變數,TestVARI
是測試集的自變數。
因為我這裡是做估產迴歸的,因此變數名稱就帶上了Yield
,大家理解即可。
這部分程式碼其實比較簡單。
%% RF nTree=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
是預測結果的置信區間。
在這裡,我們用RMSE與r衡量模型精度。
%% Accuracy of RF RFRMSE=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<400 disp(RFRMSE); break; end disp(RFCycleRun); str=['Random Forest is Solving...',num2str(100*RFCycleRun/RFRunNumSet),'%']; waitbar(RFCycleRun/RFRunNumSet,RFScheduleBar,str); end close(RFScheduleBar);
在這裡,我定義了當RMSE滿足<400
這個條件時,模型將自動停止;否則將一直執行到本文1.2部分中我們指定的次數。其中,模型每一次執行都會將RMSE與r結果記錄到對應的矩陣中。
接下來,我們結合RF演演算法的一個功能,對所有的輸入變數進行分析,去獲取每一個自變數對因變數的解釋程度。
%% Variable Importance Contrast VariableImportanceX={}; 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 % end for i=1:size(Input,2) eval(['VariableImportanceX{1,XNum}=''',i,''';']); XNum=XNum+1; end figure('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軸中每一個變數的名稱顯示為一個正方形,如下圖紅色圈內。這裡比較複雜,因此如果大家這一部分沒有搞明白或者是一直報錯,在本文下方直接留言就好~
接下來,就可以將合適的模型儲存。
%% RF Model Storage RFModelSavePath='G:CropYield 2_CodeAndMap 0_SavedModel'; save(sprintf('%sRF0410.mat',RFModelSavePath),'nLeaf','nTree',... 'RandomNumber','RFModel','RFPredictConfidenceInterval','RFPredictYield','RFr','RFRMSE',... 'TestVARI','TestYield','TrainVARI','TrainYield');
其中,RFModelSavePath
是儲存路徑,save
後的內容是需要儲存的變數名稱。
完整程式碼如下:
%% Number of Leaves and Trees Optimization for RFOptimizationNum=1:5 RFLeaf=[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 on end xlabel('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 Preparation RFScheduleBar=waitbar(0,'Random Forest is Solving...'); RFRMSEMatrix=[]; RFrAllMatrix=[]; RFRunNumSet=50000; for RFCycleRun=1:RFRunNumSet %% Training Set and Test Set Division RandomNumber=(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; end TrainYield(all(TrainYield==0,2),:)=[]; TrainVARI(all(TrainVARI==0,2),:)=[]; %% RF nTree=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 RF RFRMSE=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<1000 disp(RFRMSE); break; end disp(RFCycleRun); str=['Random Forest is Solving...',num2str(100*RFCycleRun/RFRunNumSet),'%']; waitbar(RFCycleRun/RFRunNumSet,RFScheduleBar,str); end close(RFScheduleBar); %% Variable Importance Contrast VariableImportanceX={}; 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 % end for i=1:size(Input,2) eval(['VariableImportanceX{1,XNum}=''',i,''';']); XNum=XNum+1; end figure('Name','Variable Importance Contrast'); VariableImportanceX=categorical(VariableImportanceX); bar(VariableImportanceX,RFModel.OOBPermutedPredictorDeltaError) xtickangle(45); set(gca, 'XDir','normal') xlabel('Factor'); ylabel('Importance'); %% RF Model Storage RFModelSavePath='G:CropYield 2_CodeAndMap 0_SavedModel'; save(sprintf('%sRF0410.mat',RFModelSavePath),'nLeaf','nTree',... 'RandomNumber','RFModel','RFPredictConfidenceInterval','RFPredictYield','RFr','RFRMSE',... 'TestVARI','TestYield','TrainVARI','TrainYield');
至此,大功告成。
到此這篇關於Matlab利用隨機森林(RF)演演算法實現迴歸預測詳解的文章就介紹到這了,更多相關Matlab迴歸預測內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45