模型評估-驗證指標(validation index)

若將預測這件事簡單區分成兩大種類,大致可分為
1. 機率預測,比如會不會下雨、下一張牌的紅心A…
2. 數值預測,比如預測下一季的銷售量、捷運站的客流量…
我們利用所蒐集到的資料訓練出模型進行預測,然而怎麼評估模型成效(Performance)呢?

我們會使用驗證指標(validation index)來當作成效參考,對應到機器學習領域,依據應用分為「分類指標」和「回歸指標」。

機率預測的「分類指標」:
- 二元相關:混淆矩陣confusion matrix和相對應驗證指標、ROC曲線、AUC。
- 多元相關:多元混淆矩陣和相對應驗證指標。

數值預測的「回歸指標」:
- 絕對誤差(Absolute Error, E)、相對誤差(Relative Error, e)
- 平均絕對誤差(Mean Absolute Error, MAE)
- 平均均方誤差(Mean Squared Error, MSE)
- 平均均方對數誤差(Mean Squared Logarithmic Error, MSLE)
- 正歸化均方誤差、均方根誤差

這篇先來介紹數值預測的迴歸指標,相對比較容易一些。

數值回歸前情提要

在講述數值模型評估方法前,還是不厭其煩的前情提要,數值預估多採用線性回歸(Linear regression),是找出自變數(independent variable)和依變數(dependent variable)之間的關係建立出來的模型。

白話來說,就是找到一條公式,可以解釋自變數\(x\)(或稱內生變數endogenous variable)與依變數\(y\)(外生變數exogenous variable)的關係,也就是 \(y=bx+a\)

當只有一個自變數和一個依變數的情形稱為簡單線性回歸(Simple linear regression),超過一個自變數的情形稱為多元回歸(multiple regression)。

數值預測評估方法

對於數值預測的效果評估,「回歸指標」主要是比較真實數值與預測結果,例如預測銷售量為25645,預測為24332,比較兩者差異值1313,即為最簡單的絕對誤差,從此概念延伸有許多的誤差計算法,觀察真實數列與預測數列的接近程度,越接近就表示預測模型效果越好。

下面就要介紹常見的評估指標,首先

我們討論時,假設資料列共有n個值,以符號代表:
  \(y_{i}\)代表真實值
  \(\hat{y_{i}}\)代表預測值
  \(i\in[1,n]\)
另外!自由度的問題會擺在後面討論。


絕對誤差(Absolute Error, E)

\[E_{i}= y_{i}-\hat{y_{i}} \]
很直覺,真實值和預測值差異,其值當然是越小越好,絕對誤差有正負之分(但也有些教科書取絕對值)。
這裡我們參考Wiki上的定義。 從樣本所估計得到的誤差為“殘差(Residual)”,誤差與殘差的差別我在後面討論!。 舉例:預測今天總來客數是1500人,實際上是1600人,差了-100即為E。
Regression Line
這張圖修改自Tommy線性回歸 不得不推Tommy大的Medium非常精彩!
這張圖上的殘差就是這裡說的E,真實值、預測值、平均值之間的關係都可以用符號代表。

相對誤差(Relative Error, e);百分誤差

\[e_{i}=\frac{y_{i}-\hat{y_{i}}}{y_{i}}\] 將絕對誤差除上真實值,大多數情況能將數值控制在1與-1之間。此時失去單位,可用做不同預測值間的比較。 承上例,-100/1500= -0.06 ;約為 6%

平均絕對誤差(Mean Absolute Error, MAE)

\[MAE=\frac{1}{n}\sum_{i=1}^{n} \left |E_{i} \right |=\frac{1}{n}\sum_{i=1}^{n} \left |y_{i}-\hat{y_{i}} \right |\] 討論點估計看E和e。
對整個預測數列評估時,則要看整體的誤差分佈狀況,然而拿有正負號的絕對誤差E直接相加會有問題。舉例:
下午一點預測來客數1600,實際1500,絕對誤差E為-100
下午兩點預測來客數1800,實際1900,絕對誤差E為100
直接相加為0,無法當作模型評估指標,因此改取絕對值相加後平均,MAE則為100。
白話來說就是,我這個預測模型平均會有差不多正負100的誤差! 但事實上取絕對值的方法在統計上不常用。

註:error和deviation的含義是一樣的,所以Mean Absolute Error也可稱做Mean Absolute Deviation(MAD),其他指標同理。

平均百分相對誤差(Mean Percentage Error, MPE)

\[MPE=\frac{100%}{n}\sum_{i=1}^{n} e_{i} =\frac{1}{n}\sum_{i=1}^{n} \frac{y_{i}-\hat{y_{i}}}{y_{i}}\]

平均絕對百分誤差(MAPE, Mean Absolute Percentage Error)

\[MAPE=\frac{100}{n}\sum_{i=1}^{n} \left |e_{i} \right |=\frac{100}{n}\sum_{i=1}^{n} \left|\frac{y_{i}-\hat{y_{i}}}{y_{i}}\right|\] 是取相對誤差(e)絕對值之和的平均值,大致可感受偏差的平均程度。
是經常被拿來使用的數值評估指標,一般來說MAPE < 10%的模型為可接受的。
但有一點需要非常注意,若實際值出現0,會使得e變無窮大,為了避免這個 bug,MAPE一般用於實際值不會為0的情形。

均方誤差(Mean Squared Error, MSE)

\[MSE=\frac{1}{n}\sum_{i=1}^{n} E_{i}^{2} =\frac{1}{n}\sum_{i=1}^{n} (y_{i}-\hat{y_{i}})^{2}\]

跟平均誤差類似,但平方除了可以避開正負不能相加的問題,還可以放大誤差的作用。 用這個例子感受一下差別:

## [1] 21.6
## [1] 2004.4

正歸化均方誤差(Normalized Mean Squared Error, NMSE)

先看熟悉的離均差平方合sum of square \(SS_{t}= \sum_{i=1}^{n} (y_{i}-\bar{y})^{2}\)
\(SS_{t}\)是用來分析原始資料的離散程度。 我們將\(MSE/SS_{t}\)得到正歸化後的NMSE: \[NMSE=\frac{SS_{e}}{SS_{t}}=\frac{\sum_{i=1}^{n} (y_{i}-\hat{y_{i}})^{2} }{\sum_{i=1}^{n} (y_{i}-\bar{y})^{2} }\] 原本的MSE還帶著單位平方,正歸化後較適合比較。
NMSE的值超過1時,表示模型很糟糕,越小越好。

均方根誤差(Root Mean Squared Error, RMSE)

簡單來說就是對MSE開根號,表示預測值與真實值的平均偏離程度,仔細看就會發現算法跟標準差有雷同概念 \[RMSE=\sqrt{\frac{1}{n}\sum_{i=1}^{n} {E_{i}}^{2}}=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_{i}-\hat{y_{i}})^{2}}\]

平均均方對數誤差(Mean Squared Logarithmic Error, MSLE)

\[MSLE=\frac{1}{n}\sum_{i=1}^{n}\left ( ln(1+y_{i})-ln(1+\hat{y_{i}})\right)^{2}\]

希爾不等係數(Theil inequality coefficient, TIC)

\[TIC=\frac{\sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_{i}-\hat{y_{i}})^{2}}}{\sqrt{\frac{1}{n}\sum_{i=1}^{n}y_{i}^{2}}+\sqrt{\frac{1}{n}\sum_{i=1}^{n}\hat{y_{i}}^{2}}}\]

其值介於0到1之間,越小預測效果越好。


看到這裡是不是頭暈了呢?其實還有許多衍伸變化,不過皆大同小異概念雷同。
太多公式無法記住全部沒關係,重點是這些指標都是值越小表示模型越好!
眾多模型比較時,只要選定適合的,即可開始比較各模型的驗證指標(validation index)。
其中RMSE請一定要記得!

判定係數(Coefficient of Determination, R squared)

\(R^{2}\)這各位肯定不陌生,另外還有常見的Adjusted\(R^{2}\)
其為最常用來反映回歸模型解釋力的統計量。使用在很多統計書上都有描述,但千萬要小心一知半解的使用,尤其是把它跟相關係數(coefficient of correlation, r)搞混。
又稱為「決定係數」或者「擬合度」,亦可理解為誤差百分比(precentage of reduced error, PRE),反映的是預測值對實際值的解釋程度。
其值通常介於0-1之間,\(R^{2}\)越接近1,預測值越接近真實值。
\[R^{2}=1-\frac{SS_{e}}{SS_{t}}=1-\frac{\sum_{i=1}^{n} (y_{i}-\hat{y_{i}})^{2} }{\sum_{i=1}^{n} (y_{i}-\bar{y})^{2} }\]
\(SS_{t}=\sum(y-\bar{y})^{2}\)為總變異量
\(SS_{e}=\sum(y-\hat{y})^{2}\)為殘差(誤差)變異量
\(SS_{regression}=\sum(\hat{y}-\bar{y})^{2}\)則是回歸可解釋的變異量

依變數Y的總變異量\(SS_{t}\) 可以拆解成 可被迴歸模型解釋的回歸變異量\(SS_{regression}\)與不可解釋的殘差(誤差)變異量\(SS_{e}\)
\[SS_{t}=SS_{regression}+SS_{e}\] \[\sum(y-\bar{y})^{2}=\sum(y-\hat{y})^{2}+\sum(\hat{y}-\bar{y})^{2}\] 對於總離差平方和怎麼拆解的,我在另外一篇文章SST拆解證明討論。

我們用比例的概念來思考,如果總變異量為1,那麼迴歸模型解釋的百分比佔多少,殘差又佔多少? \[1=\frac{SS_{regression}}{SS_{t}}+\frac{SS_{e}}{SS_{t}}\]

回歸可解釋的變異量 \[R^{2}=\frac{SS_{regression}}{SS_{t}}=1-\frac{SS_{e}}{SS_{t}}\]

一般來說,\(R^{2}\)越大,表示模型擬合效果越好。
模型解釋了多少,反映的就是大概有多準,隨著樣本數量的增加,\(R^{2}\)必然增加,無法真正說明準確程度,只能大概定量。

多大的值才代表模型的精度高呢?這個其實沒有統一的標準。但依經驗歸納如下:
\(R^{2}\)的值大於0.75,表示迴歸模型擬合度很好,迴歸方程的可解釋程度較高,即迴歸方程的精度較高。 \(R^{2}\)的值在0.5和0.75之間,表示迴歸模型的擬合可以接受,但需要進一步修正迴歸模型。 \(R^{2}\)的值小於0.5,表示迴歸模型擬合有問題,我們需要調整自變量重新進行迴歸分析。

校正判定係數(Adjusted R-Square)

我們做回歸時會增減自變數來調整模型,當加入的自變數越多,\(R^{2}\)會越大,呈現高估的現象。這會顯得迴歸方程擬合效果很好。但實際上可能並非如此,有些自變量與因變量完全不相關,增加這些自變量,並不會提升擬合水平和預測精度,但卻能提高判定係數\(R^{2}\)的值。因此經過自由度的調整,可避免 \(R^{2}\)的膨脹。

對判定係數\(R^{2}\)進行調整採用的方法是,用樣本量n和自變量的個數k去進行調整。 \[{R_{adjusted}}^{2}=1-\frac{\frac{SS_{e}}{n-k-1}}{\frac{SS_{t}}{n-1}}\]

做一些整理 \[{R_{adjusted}}^{2}=1-\frac{n-1}{n-k-1}\frac{SS_{e}}{SS_{t}}=1-\frac{n-1}{n-k-1}(1-R^{2})\] 從公式中可以看出,當加入的自變數個數K越大,會導致後項越大,使\({R_{adjusted}}^{2}\)越小。
因為(n-1)永遠大於(n-k-1),所以多元迴歸中,調整後的判定係數\({R_{adjusted}}^{2}\)永遠小於判定係數\(R^{2}\)

因調整後的判定係數\({R_{adjusted}}^{2}\)較判定係數\(R^{2}\)測算更全面也更準確,所以,在迴歸分析尤其是多元迴歸分析中,我們通常使用調整後的R2對迴歸方程的精度進行測算和評定,以評估迴歸方程的擬合度和迴歸分析預測的效果。

這邊我們用Iris資料集做個示範:

## 
## Call:
## lm(formula = Sepal.Length ~ ., data = iris)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.79424 -0.21874  0.00899  0.20255  0.73103 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        2.17127    0.27979   7.760 1.43e-12 ***
## Sepal.Width        0.49589    0.08607   5.761 4.87e-08 ***
## Petal.Length       0.82924    0.06853  12.101  < 2e-16 ***
## Petal.Width       -0.31516    0.15120  -2.084  0.03889 *  
## Speciesversicolor -0.72356    0.24017  -3.013  0.00306 ** 
## Speciesvirginica  -1.02350    0.33373  -3.067  0.00258 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3068 on 144 degrees of freedom
## Multiple R-squared:  0.8673, Adjusted R-squared:  0.8627 
## F-statistic: 188.3 on 5 and 144 DF,  p-value: < 2.2e-16

同判定係數\(R^{2}\)一樣,習慣上在迴歸分析中,會用0.5當作調整後的\({R_{adjusted}}^{2}\)的臨界值,如果調整後的\({R_{adjusted}}^{2}\)小於0.5,則要分析我們所採用和未採用的自變量,調整迴歸方程,重新進行迴歸分析。

另外,在進行迴歸方程精度評定時,還需注意如果調整後的\({R_{adjusted}}^{2}\)與判定係數\(R^{2}\)存在明顯差異,則意味着所用的自變量不能很好的測算因變量的變化,或者是我們遺漏了一些可用的自變量。
調整後的\({R_{adjusted}}^{2}\)與判定係數\(R^{2}\)間差距越大,模型的擬合程度越差。

R數值評估函數

已經有些相關的套件如Metrics可直接引入。
這邊也跟大家一起練習手刻,函式都很簡單。

實務上在R中我們不會去看這麼多指標,慣用的是直接用summary去檢討回歸模型。 Residual standard error即為殘差項的RMSE。

迴歸分析的假設檢定

R squared的顯著性檢定

前面已經說明了迴歸模型的變異數拆解原理。
其中有個問題,當\(R^{2}\)很高時,是否就代表模型很好!? 其實不然,若要說\(R^{2}\)具統計意義,還得通過顯著性檢定。

F Test

我們在前面討論均方誤差時,其實簡化了自由度的討論。
實際上n的位置應代入自由度\(df\)
公式修正如下: \[MSE=\frac{1}{df_{e}}\sum_{i=1}^{n} E_{i}^{2} =\frac{1}{df_{e}}\sum_{i=1}^{n} (y_{i}-\hat{y_{i}})^{2}\] 而針對回歸值,也可以計算回歸效果變異數: \[MSRegression=\frac{1}{df_{Reg}}\sum_{i=1}^{n} (\hat{y_{i}}-\bar{y})^{2}\]

這兩個變異數的比值可以透過F檢定進行顯著性考驗。 此時\(H_{0}\)表示,「回歸可解釋變異量為0」,如果無法推翻,即使\(R^{2}\)再高,也沒有統計上的意義。
F檢定探討迴歸模型中的迴歸係數β(就是各因子的權重)是否全部為0。當係數不全為0時,迴歸模型才具有預測力。
虛無假說(Null hypothesis):\(H_{0}:\beta_{1}=\beta_{2}=...=\beta_{p}=0\)
對立假說(alternative hypothesis):\(H_{0}:\beta_{1},\beta_{2},...,\beta_{p}\neq 0\)
F檢定量的統計值(Statistics): \[F=\frac{MSRegression}{MSE}=\frac{\frac{SS_{reg}}{df_{reg}}}{\frac{SS_{e}}{df_{e}}}=\frac{\frac{SS_{reg}}{p}}{\frac{SS_{e}}{N-P-1}}\]

R變異量分析表

R變異量分析表

可以對應到下方R Summary的結果。
## R 中 Linear Model Summary 的各項含意 R summary解釋

迴歸分析的基本假設

當我們建立出一個線性回歸時,必須要確認其殘差(residual)是否符合下面三個假設:
- 常態性(Normality)
- 獨立性(Independence)
- 變異數同質性;等分散性(Homogeneity of Variance)

我們先從回歸模型中找到殘差的值,這邊延續上面iris的model介紹。

##  [1] "coefficients"  "residuals"     "effects"       "rank"         
##  [5] "fitted.values" "assign"        "qr"            "df.residual"  
##  [9] "contrasts"     "xlevels"       "call"          "terms"        
## [13] "model"

常態性假設

shapiro.test()函式可以用來檢驗殘差的常態性:

## 
##  Shapiro-Wilk normality test
## 
## data:  lm.fit$residuals
## W = 0.99538, p-value = 0.9202

由於虛無假設H0:殘差服從常態分配,因為p-value > 0.05,代表不會拒絕H0,也就是殘差符合常態分布!

獨立性假設

要檢驗殘差的獨立性,可用套件car中的durbinWatsonTest()函式:

##  lag Autocorrelation D-W Statistic p-value
##    1      0.01099141      1.965705   0.708
##  Alternative hypothesis: rho != 0

由於虛無假設H0:殘差間相互獨立,因p-value > 0.05,代表不會拒絕H0,也就是殘差無自相關。 殘差自相關現象在時間序列分析較常發生。 其實殘差自相關仍可繼續分析,只是殘差變異量可能產生偏誤,進而影響到\(R^{2}\)導致迴歸模型被拒絕。

同質性(等分散性)假設

要檢驗殘差的變異數同質性,同樣使用套件car中的ncvTest()函式:

## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 2.715134, Df = 1, p = 0.099401

由於虛無假設H0:殘差變異數具有同質性,因p-value < 0.05,代表拒絕H0。

Residual homoscedasticity

我們用一元的線性回歸圖來解釋:
圖上X是自變數,Y是依變數。
殘差不應該隨著X而有所不同,理想上如同圖a,誤差有等分散性。
但如果在不同的X有不相等的殘差變異量(此即誤差變異歧異性heteroscedasticity),如圖b,此時表示對Y的預測而言,可能還需其他自變數來解釋。 另外,當研究數據具有值端值存在或非線性關係時,非同質性的現象也容易出現。

推薦參考: r-bloggers

ASD (A Standard Deviation)累計圖

檢查完這些假設後,還可以用殘差來製作ASD累計圖,概念跟上方的殘差分布圖很類似。
因預估值的尺度不同,分析後不同的預測模型殘差尺度差異會讓分析者覺得缺乏一致性。
舉例來說,預測身高和預測花瓣長度,尺度不同,殘差次數分布圖上X軸的單位也不相同,如下:

我們可以使用標準差將這張圖標準化,變成累計分布圖(Cumulative Distribution Function)來比較。
如果各位還記得機率分布,這就跟累積分布函數的計算如出一轍!因此我們也借用R中cdf的function來畫圖。
作法:將每個殘差除以真實值\(y\)的標準差,取絕對值,並且畫累積分布圖。


當取線可以越往左偏,曲線下面積越大,表示殘差越小!
最好的情況是,在X軸上從0往右,曲線能快速拉升,表示大部分的殘差都在很小的標準差範圍內,表示模型極好。
然而,如果預測中有殘差較大的(已經大於一倍標準差的情況),那麼曲線將不能再一倍標準差的範圍內達到100%。

補充:誤差(Error)與殘差(Residual)

誤差與殘差,這兩個概念在某程度上具有很大的相似性,都是衡量不確定性的指標,可是兩者又存在區別。普遍上是蠻常被混著使用的。

簡單理解為:
誤差\(\varepsilon_{i}=y_{i}-E\{y_{i}\}\)為 觀測值與 真實回歸線之離差,但是真實迴歸線是未知的。
殘差\(e_{i}=y_{i}-\hat{y_{i}}\)為 觀測值與所估計出之迴歸線上的擬合值的偏離,所以是已知的。

誤差是指樣本對母體(無法觀察到的)均值及真實值的均值的偏離。
殘差則是指樣本和觀察值(樣本總體)或回歸值(預測值)的差異量。

誤差與測量有關,誤差大小可以衡量測量的準確性,誤差越大則表示測量越不準確。
(1)誤差分為兩類:系統誤差與隨機誤差。
  ①系統誤差與測量方案有關,通過改進測量方案可以避免系統誤差。
  ②隨機誤差與觀測者,測量工具,被觀測物體的性質有關,只能儘量減小,卻不能避免。
(2)殘差與預測有關,殘差大小可以衡量預測的準確性。殘差越大表示預測越不準確。殘差與資料本身的分佈特性,回歸方程的選擇有關。


越寫越滿了,原本沒要寫這麼多的!邊寫邊訓練腦袋

資料參考:
Skydome資料分析筆記
Tommy線性回歸

如果內容有任何問題或錯誤,歡迎來信跟我聯絡唷!