機器學習_學習筆記系列(13):交叉驗證(Cross-Validation)和MSE、MAE、R2

到目前為止我們讓機器學習和驗證的方式都一樣,都是按照特定比例,然後隨機抽取一些資料當作我們的測試集,而剩下的就是我們的訓練集。然而我們可以發現一些問題,假設我們今天想要讓機器學習分辨貓跟狗,但是我們今天很不幸的,剛好隨機抽樣,拿去訓練的都是狗的圖片,拿去測試的都是貓的圖片,我們就會看到我們的錯誤率會非常大。假想一下,你這輩子只看過狗,有一天一隻貓出現在你家,你會覺得他是貓嗎?

所以針對這樣的問題,我們偉大的科學家想出了很多方式來驗證我們的資料。其中最主要的幾種交叉驗證法(Cross-Validation)有

(1)Holdout Cross-Validation

(2) leave-one-out cross-validation

(3) k-fold cross-validation

而在介紹這些驗證法以前,我們要先來介紹計算模型錯誤率的一些指標。

Mean Square Error (MSE)

Mean Absolute Error (MAE)

R squared (R2)

由上述我們可以看到三種衡量模型的指標,MSE是計算模型預測值和實際值相差的平方總合除以資料數量、MAE是計算計算模型預測值和實際值相差的絕對值總合除以資料數量,R2則是1減掉模型預測值和實際值相差的平方總合除以實際值平均和實際值相差的平方總合。所以我們可以知道說MAE和MSE越接近0越好,而R2越接近1代表模型預測效果更好。

交叉驗證(Cross-Validation)

介紹完了三種評斷模型好壞的指標,我們現在就要進入重頭戲,Cross-Validation

(一) Holdout Cross-Validation

對於此種驗證方式,和我們在前個章節所用的驗證方法一樣,就是所有的資料集裡面,隨機抽取特定比例的資料作為訓練集,而剩下的部分就作為我們的測試集。但是此種方法的問題在文章一開頭也提到,如果我們今天運氣很不好,剛好訓練集挑選的資料都是狗,測試集都是貓,那我們訓練出來的模型就會很有問題。所以在這種情況下,我們需要確保,我們給機器的資料夠大也夠多元,不會說我今天要訓練分辨貓和狗的模型,我只有99張狗的照片,1張貓的圖片。

(二) Leave-One-Out Cross-Validation

在這種驗證方法當中,我們只會從資料中選1筆當作測試集,其他的資料就用來訓練我們的模型,而驗證方式,就是從第一筆開始當測試集,其他拿去訓練模型。在第二輪,我們換拿第二筆當測試集,其他一樣拿來當訓練集。第三輪則拿第三筆當測試集….,以這樣的方式,讓資料中的每筆的資料都當過測試集。雖然這樣的方式可以讓我們了解哪筆資料明顯造成我們模型的偏差,但是這樣一筆一筆驗證的方式非常的消耗計算資源和時間。

(三) k-Fold Cross-Validation

此驗證方式其實概念上來說和LOOCV很像,只是我們取測試集的方式,是先把所以有資料分成k等份,之後輪流把其中1份當作測試集,然後剩下的k-1份當作訓練集,這樣的方法,雖然準確度不如LOOCV,但是在效能和效率上會比LOOCV好很多。

而在這裡我們今天要看的例子是分析台北2020年一整年的日照時數變化,而我們用的資料來源為中華民國交通部中央氣象局觀測資料查詢系統[1],選取的觀測地點,為台北市地區的台北觀測站,資料為2020/01/01到2021/12/31總共365天的資料,檔案形式為CSV檔。

打開CSV檔後我們可以看到裡面有超級多欄位,像是氣壓、溫度、相對溼度、風速等等,而對於日照時數分析,我們選取的資料欄位,也就是我們的輸入資料有,測站氣壓、氣溫、露點溫度、相對濕度、風速,最後加上一個時間,總共六個欄位。輸出資料為日照時數。

拿到資料後我們先做資料前處理,讀取12個月的csv檔,並把不要的欄位去掉。

接著我們以時間為X軸,其他六個欄位的資料為Y軸,把這些資料視覺化

看到這個分布,相信大家應該都有點sense,夏天的時候,溫度會比較高,氣壓會比較低,然後日照時間會比較高,關於風速的部分可以看到秋冬的時候比較高。

接著我們對這7欄資料做normalize

接著就是我們這裡用多項式回歸,這裡我們用的是二次特徵轉換,所以原本

變成

而接下來我們要對我們就把他丟入我們的演算法進行運算,以下為其輸出結果

Holdout Cross-Validation

The training set: MSE: 0.2040409361166814 / MAE: 0.35095795701583643 / R²: 0.7938960699094876

The testing set: MSE: 0.24977436956471863 / MAE: 0.4031362736507285 / R²: 0.7397630506034342

Leave One Out Cross-Validation

P.S. 因為驗證集只有一筆資料,所以計算R2的時候,分母部分平均值減實際值會等於0,會使每次測試集R2都是無限大

我們以X軸為資料筆數z的排列順序

K-Fold Cross-Validation

我們這裡把他分成10堆

X軸一樣為資料份數的排列順序

由上面的趨勢圖,我們可以看到對於訓練集,不管使用LOOCV會K-Fold什麼方法,MSE和MAE值都很接近,但是對於測試集的部分,我們就可以明顯看出,這些資料中哪些是造成偏差的。

Python Sample Code:

Github:

Reference:

[1]

***本系列完全沒有開任何營利***

作者:劉智皓

linkedin: CHIH-HAO LIU

--

--

劉智皓 (Chih-Hao Liu)

熱愛AI Model/Research、5G 3GPP/ETSI/O-RAN Spec、Linux Programming,是一個什麼都想學的工作狂。喜歡popping、旅遊和吃壽司~ 🤗