一、 随機森林理論
随機森林(RF)是一種基于統計學習理論的組合分類智能算法,由Breiman在2001年提出,其原理是利用Bootstrap重抽樣方法從原始資料中抽取多個樣本,建構所有Bootstrap樣本的決策樹,并對所有決策樹的預測結果進行組合,并投票選出最終結果.
1 Bootstrap重抽樣方法
随機森林屬于機器學習的一個重要分支-內建學習,所使用的Bootstrap重抽樣方法也是內建學習衆多抽樣方法之一.Bagging名稱來源于Bootstrap aggregating,即為引導聚集算法又稱裝袋算法,最初由Leo Breiman在1996年提出.Bagging是一種用于訓練資料的建立技術,是在原始資料集上通過重複随機有放回抽樣,選擇出N個資料集并分别訓練N個分類器,其訓練資料中允許存在重複資料,但N個資料集都是具有相同分布的獨立随機向量.是以,某些資料可能會在模型訓練中多次使用,而其他資料可能永遠不會被使用.這些沒有被抽取的資料,約占三分之一,被稱為袋外資料(OOB),由于其沒有參與訓練集模型的拟合,是以常常被用來檢測模型泛化能力.
2 決策樹
随機森林算法以決策樹作為基礎學習器,基于許多決策樹的生成及其組合以産生最終輸出,其輸出類别由個别樹輸出類别的衆數決定.決策樹是一種基本的分類與回歸辦法,基于樹結構來決策.當決策樹用于分類時被稱為分類樹,用于回歸時被稱為回歸樹.決策樹由節點和有向邊組成,類似于枝杈和樹枝.節點有兩種類型,内部節點(枝杈)和葉節點(枝梢),其中内部節點表示一個特征,葉節點表示一個類(即決策結果).每個内部節點包含一部分樣本集合,會從這些樣本集合中随機選擇出的特征進行特征測試并根據測試結果将樣本劃分到子節點中,最終一步步被劃分到葉節點中.根節點包含樣本全集,從根節點到每個葉節點的路徑對應了每一個判定測試序列.其結構像樹一樣,是以被稱為決策樹,其學習本質是從訓練集中歸納出一組分類規則.
3 随機森林算法
随機森林中“森林”就是決策樹的內建,而“随機”是指資料采樣的随機和從所有特征中選擇部分特征來建立模型的随機.随機森林算法過程有幾個階段:首先,從給定的原始訓練集中随機選擇樣本,為每個樣本建立一個決策樹,并得到每個決策樹的分類結果.接下來對每個分類結果進行投票表決決定最終結果(圖1).随機森林集合了多個決策樹,比單個決策樹有更好的選擇結果,它通過對結果求平均值來降低過拟合,是以不宜出現過拟合現象,且預測準确度較高.
總的來說,它具有以下優點:
(1)通過反複二分資料進行分類或回歸,是以同等精度下計算量比其他機器學習方法(如神經網絡或支援向量機)要低很多.
(2)可以處理數千個輸入變量,且無需删除變量.
(3)具有估計缺失資料的有效方法,并在大量資料缺失時保持準确性.
(4)對噪聲、異常值和過度訓練不敏感,預測精度高誤差小.
(5)運作時會生成泛化誤差的内部無偏估計,并給出了分類中每個變量的重要性估計值.
(6)可以學習複雜的模式,同時考慮到解釋變量和因變量之間的任何非線性複雜關系,并給出有關變量與分類之間的關系資訊.
(7)可以儲存建立的模型,以便将來用于其他資料.
二、部分源代碼
clc;
clear all;
%% 劃分資料集
pwd=‘随機森林蘋果病害識别’;
currentPath = pwd; % 獲得目前的工作目錄
fprintf(‘加載資料…’);
t = tic;imdsImage = imageDatastore(fullfile(pwd,‘資料’),‘IncludeSubfolders’,true,‘LabelSource’,‘foldernames’); % 載入所有圖檔集合
[imdsTrain,imdsTest] = splitEachLabel(imdsImage, 0.8,‘randomized’);%每個類都按比例随機拆分資料集,訓練集和測試集8:2,
fprintf(‘完成 %.02f 秒\n’, toc(t));
countEachLabel(imdsTrain)
%% 特征提取:顔色特征、紋理特征和形狀特征
for i=1:length(imdsTrain.Files)
RGB_Train{i}=readimage(imdsTrain,i);
zyc_train{i}=Extract_features(RGB_Train{i});
end
for i=1:length(imdsTest.Files)
RGB_Test{i}=readimage(imdsTest,i);
zyc_test{i}=Extract_features(RGB_Test{i});
end%% KNN訓練
X=zyc_train’;
X1=zyc_test’;
for i=1:280
X_train(i,:)=X{i,:};
endfor i=1:72
X_test(i,:)=X1{i,:};
endY_train=imdsTrain.Labels;
Y_test=imdsTest.Labels;
Mdl = fitcknn(X_train,Y_train,‘NumNeighbors’,5)
Y_predict=predict(Mdl,X_test);
accuracy = sum(Y_predict == Y_test)/numel(Y_test)
confusionchart(Y_predict ,Y_test)