R語言自學日記(15) -評估模型表現
Evaluate Model Performance with Loss Function
前言
還記得我們在AR(p)模型裡面學到的評估模型優劣的方式,也就是AIC或是BIC準則,這些準則的概念是,透過最小化模型預測出來的結果與實際結果之間的誤差,來選擇最佳的模型。
上圖是一個簡單的迴歸模型,藍色的線是我們預測出來的結果,紅色的點是實際的資料分布,而綠色的線我們稱之為誤差,可想而知,一個好的模型應該具有最少的誤差,也因此我們創建了一個方式來衡量這些誤差的總值,我們稱作損失函數(Loss Function)
歐幾里得距離與統計距離 (Euclidean Distance and Statistical Distance)
在開始講損失函數之前,我們要先談距離的觀念,在誤差的衡量上有很多時候都是以預測點跟實際資料點之間的最小距離來做衡量的,頂多有些模型因為樣本、變數數量等因素會加上懲罰項。而最小距離的概念是甚麼?我們這邊要介紹兩個概念:歐幾里得距離與統計距離。
歐幾里得距離是被定義在n維歐幾里得空間中的距離,這個空間是可以被擴展到任意維度的實內積空間,聽起來很複雜,但如果我們讓n = 3,其實就是我們生活中所習慣的三維空間,當然二維空間、一維空間也是我們所熟悉的。而對於資料點的世界來說,每多出一筆獨立資料我們就可以說整個資料集的世界多出了一個維度,以下我透過程式模擬一個二維資料集與一個三維資料集來看看:
在歐幾里得空間中的距離概念非常簡單,兩點之間的最小距離可以透過以下的式子衡量,也就是直線距離:
然而,在統計資料的世界中,資料點並不一定分布在歐幾里得空間(Non-Euclidean Space)裡面,造成這個現象的原因有很多,比方說變數的相關性,或是變數的變異數差異,都會造成非歐幾里得空間的分布狀況,我們可以想像成是空間被扭曲了,舉例來說像是莫比烏斯帶:
上圖就是一個比較典型的非歐幾里得空間,這種設計我們很常看到,跟我們直覺不同的是,如果你站在莫比烏斯帶的任一個點上往前走,基本上你是可以無限走下去的,你很難想像他並非一個一維或是二維空間。
因此,要衡量兩個點之間的距離,就並不一定是透過歐幾里得空間裡定義的最小直線距離,比方像是機器學習中的流形學習(Manifold Learning),對於點的計算方法就非常不同,這些方法雖然複雜,但也有助於我們更加貼近真實世界,比方說用譜嵌入(Spectral Embedding)去實現人臉辨識技術。
一般常見的統計距離有很多種,舉例來說我們可以透過除掉標準差來表示出標準化歐氏距離(Standardized Euclidean Distance),或是透過共變異數矩陣去清除相關性,我們稱為馬氏距離(Mahalanobis Distance):
實務上我們不見得能夠完全了解資料的分布狀況,尤其是對於高維度的大數據而言,但我們可以用各種損失函數去評估誤差,這等同是一種後驗方法,即使我們不知道實際距離狀況,卻可以模擬出該距離計算下的總誤差,也就某種程度上去反推得資料的大致分布情況。
常用的損失函數:MAE、MSE/RMSE
我們可以透過不同的損失函數來評估一個模型,在這邊先介紹兩個最常用的,MAE(平均絕對誤差,Mean Absolute Error)與MSE(均方誤差)。
我們先透過剛才使用過的鳶尾花資料來建立一個Linear Regression模型:
接下來我們可以分別去Fit MAE與MSE損失函數看看,我們先看一下兩個函數分別的計算公式:
如果把MSE去做根號運算,就變成RMSE(Root Mean Square Error),兩個函數的實際解釋是,MAE是計算每個點到Y=X上的誤差,而RMSE計算的是每個點到所有資料平均值的誤差。在一般的情況下MAE與RMSE得到的結果是非常相似的,但是隨著資料出現更大的變異數或是離群值,RMSE通常會比較大,這給了我們一個觀念是,RMSE放了更大的權重在Error Magnitude,但本身不見得對於平均誤差有足夠的解釋力。
延伸閱讀:
我們透過代碼來看一下這個迴歸模型的誤差:
要特別注意的是,我們不可以使用不同的變數準則去決定一個模型的優劣,應該要建立在同一準則下不斷修正誤差,比如調整權重、放入參數等,舉例來說我們可以改成多項式迴歸或是多變量迴歸,去檢驗單一指標的總誤差,最後選定最優值來建構估計模型,但是不可以使用同一個模型而只選擇好的估計指標。
如何預測:Training、Validation & Testing
時間序列資料的驗證通常需要經過時間(廢話),如果我們建立了一個預測10期,一期一個月的ARIMA模型,至少要等到10個月後才能評估該模型的總誤差,等於說為了測試哪個模型預測能力最好,我們通常要等10個月。
因此,在第七章短暫提過的 Training Set 與 Testing Set 就會派上用場,測試資料通常要等10個月,因此實際上我們會把訓練集資料再切分成Training Set與Validation Set,也就是我們假裝不知道一段期間內的資料變化,而透過其他已知的資料去建構模型,來比較模型預測結果與被我們假裝忽略的資料的總誤差,以便於評估這個模型的效力,稱為樣本外預測(Pseudo out-of-sample forecasting)。
下一個難題是,如何選擇資料期間?單一的資料期間在時間序列資料上很容易出問題,我們很難以確保趨勢、季節性與結構性都是一致的,此時,我們通常會使用不同的方法做更精準的估計,我們在這邊介紹其中一種方法也就是遞迴法(Recursive Scheme),如果以一個AR(1)模型舉例:
R是指樣本內資料,P則是指樣本外資料,由上述的式子可以知道,我們的估計式會不斷變化,樣本數也會不斷增多,我們可以不斷的把時間往後推,對於1到6月的資料,我們拿7月驗證,對於2到7月的資料,我們拿8月驗證等。
Overfitting & Underfitting
最後一節我們要談建立模型中常遇到的兩個問題:過度配適(Overfitting)與低度配適(Underfitting)。
過度配適:當我們在訓練集上得到的結果很理想(比如誤差很小,或R平方很高),但是在測試集上得到的結果很差的時候,通常就是發生過度配適的問題,要解決這樣的問題有許多辦法:
- 減少變數的使用:這非常好理解的是,當我們要辨識一個人的善惡,只要我們能夠有他從小到大所有的資料,這個判斷大概都會變得很準確,但如果拿同樣的標準去套用在其他人身上,就不見得準確,對於機器學習來說也是一樣,在解釋能力不要差異太大的情況下,應減少預測變數。
- 調整模型參數:比較常見的例子像是,在一個L1懲罰項作為損失函數的模型評估中,使用的模型卻是以L2參數來配適的。這個步驟非常複雜,也常常是資料科學家的重頭戲之一。(Kaggle上的競賽幾乎一定都會有暴力調參的環節)
- 交叉驗證(Cross-Validation):簡單來說就是重複切割資料,並且對每次切割都配適一次模型,如果發現每次配適的結果差異很大的時候,通常就是有過度配適的問題了。此外,通常經過交叉驗證的模型雖然誤差會比較不理想(每一次Train的樣本更少),但是結果通常更可靠。
- 整體學習(Ensemble Learning):這邊的方法有很多,之後有空再一一介紹,比方說將基層模型(Base Model)做疊加,或是用不同的抽樣方法(Boostrap Sampling)等等,概念上是透過連續、重複隨機等不同方法去盡可能讓機器學習到整體的資料以避免偏誤。
- 重新研究你的輸入資料,是不是變數取捨或特徵工程沒有做好等等
低度配適:當我們在訓練集上得到的結果不理想,但是測試集上的結果較優(實際上這個問題比較複雜,但不排除是Underfitting的情況),有可能就是模型低度配適,在小樣本的預測上比大樣本更好一些,顯現模型的泛用性並不是這麼高,通常可以用加大變數、交叉驗證等方式解決。
總結
下一篇我們會談到如何去檢測時間序列資料裡面的異常值與結構性變動,這可以幫助我們針對不同的區段分別建構預測模型,以更加精準的預測,如果你喜歡我的文章,還請下方不吝按下Clap喔!