評估並改善模型的預測性能

介紹

交叉驗證是一種模型評估方法,用於評估機器學習算法對尚未經過訓練的新數據集進行預測時的性能。通過對數據集進行分區並使用子集來訓練模型和其餘數據進行測試來完成的。由於交叉驗證並未使用所有數據來構建模型,因此它是防止訓練期間過度擬合的一種常用方法。

方法流程

每一輪交叉驗證都涉及將原始數據集隨機劃分爲訓練集和測試集。然後,訓練集用於訓練監督學習算法,測試集用於評估其性能。重複此過程幾次,並將均交叉驗證誤差( average cross-validation error)用作性能指標。

常見的交叉驗證技術包括:

k-fold:將數據劃分爲大小大致相等的k個隨機選擇的子集。一個子集用於驗證使用其餘子集訓練的模型。重複此過程k次,以便每個子集僅使用一次進行驗證。
Holdout:將數據精確地分成指定比例的兩個子集,以進行訓練和驗證。
Leaveout:使用k倍方法對數據進行分區,其中k等於數據中觀察的總數。也稱爲留一法交叉驗證。
Repeated random sub-sampling:在所有運行中對數據進行隨機分區和彙總結果的蒙特卡洛重複。
Stratify:對數據進行分區,以便訓練和測試集在響應或目標中具有大致相同的班級比例。
Resubstitution:不對數據進行分區;使用訓練數據進行驗證。通常會對性能產生過分樂觀的估計,如果有足夠的數據,則必須避免這樣做。
交叉驗證可能需要大量的計算,因爲訓練和驗證需要進行多次。由於每個分區集都是獨立的,因此可以並行執行此分析以加快處理過程。

基於MATLAB進行交叉驗證

語法

c = cvpartition(n,'KFold',k)
c = cvpartition(n,'HoldOut',p)
c = cvpartition(group,'KFold',k)
c = cvpartition(group,'KFold',k,'Stratify',stratifyOption)
c = cvpartition(group,'HoldOut',p)
c = cvpartition(group,'HoldOut',p,'Stratify',stratifyOption)
c = cvpartition(n,'LeaveOut')
c = cvpartition(n,'resubstitution')

基於MATLAB K-fold交叉驗證

k-fold crossValidation:將數據集A分爲訓練集(training set)B和測試集(test set)C,在樣本量不充足的情況下,爲了充分利用數據集對算法效果進行測試,將數據集A隨機分爲k個子樣本集,每次將其中一個子樣本集作爲測試集,剩下k-1個子樣本集作爲訓練集進行訓練。
在matlab中,可以利用:indices=crossvalind(‘Kfold’,N,M) 來實現隨機分包的操作,其中N爲樣本數,M爲隨機劃分子集數量k。

clear all
clc

load('fisheriris');
indices = crossvalind('Kfold',species,10);
cp = classperf(species);

for i = 1:10                                                        %交叉驗證k=1010個子集輪流作爲測試集
    test = (indices == i);                                          %獲得test集元素在數據集中對應的單元編號
    train = ~test;                                                  %train集元素的編號爲非test元素的編號
    class = classify(meas(test,:),meas(train,:),species(train,:));  %要驗證的算法
    classperf(cp,class,test);
end
cp.ErrorRate

模型誤差分析

當我們設計並訓練好模型之後,就需要在測試集上進行驗證。而當模型在測試集上的效果不佳後,我們就需要從模型在測試集上的誤差來源進行分析,進而調整模型。

模型選擇注意事項

不正確的模型選擇
如圖所示,將數據集分爲兩個部分,其中一部分是訓練集,另外一部分是測試集。當我們在訓練集上完成多個模型訓練,就在測試集上進行驗證並根據在測試集上的結果對模型進行調整,最終選擇在測試集上最好的模型作爲結果。

上述做法不正確的原因在於,我們發現模型在測試集上的結果並不理想,就會調整模型,使模型在測試集上的表現更好。但是,由於訓練集和測試集的數據分佈可能會存在“區別”,因此我們在測試集上進行調整的話,其實是把訓練集和測試集的“區別”進行調整。但是,當我們將模型放在線上,所接觸到的數據的分佈跟訓練集和測試集都有“區別”,這個時候,模型的整個效果就沒有在測試集上表現的那麼好。通常還會變差!

交叉驗證
爲了真正體現模型在驗證集上的性能,可以採用如下圖方法進行模型選擇。將訓練集分爲兩部分,一部分是訓練集(Training Set),一部分是驗證集(Validation Set)。在訓練集上訓練模型,並在驗證集上進行驗證。當我們確定哪一個模型最好之後,將所有數據集在訓練一遍。最後在public Testing Set上進行驗證,在public Testing Set上的結果可以反映模型真正的性能。並且不要由於public Testing Set上的效果不佳就去調整模型,因爲調整訓練集跟public Testing Set之間的區別,並不能真正調整跟線上數據的區別。

k折交叉驗證
在上圖中,將訓練集分爲兩部分後,對於單個模型只進行一次實驗驗證,可能會存在誤差。因此可以進行多個實驗,取平均值可能更好地進行評估,如下圖所示。

將所有訓練局等分爲k份,將其中一份作爲驗證集,其餘爲測試集,就可以形成k中訓練集和驗證集。對於單個模型,分別進行k次試驗,取平均值作爲最終的驗證效果。

參考
https://www.mathworks.com/help/stats/crossval.html
https://www.mathworks.com/help/stats/cvpartition.html
https://www.mathworks.com/help/bioinfo/ref/crossvalind.html
https://www.cnblogs.com/MrPan/p/9484033.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章