機器學習算法 原理、實現與實踐——模型評估與模型選擇
1. 訓練誤差與測試誤差
機器學習的目的是使學習到的模型不僅對已知數據而且對未知數據都能有很好的預測能力。
假設學習到的模型是$Y = \hat{f}(X)$,訓練誤差是模型$Y = \hat{f}(X)$關於訓練數據集的平均損失:
$$R_{emp}(\hat{f}) = \frac{1}{N}\sum_{i=1}^NL(y_i,\hat{f}(x_i))$$
其中$N$是訓練樣本容量。
測試誤差是模型$Y = \hat{f}(X)$關於測試數據集的平均損失:
$$e_{test}(\hat{f}) = \frac{1}{N’}\sum_{i=1}^NL(y_i,\hat{f}(x_i))$$
其中$N’$是測試樣本容量。
當損失函數是0-1損失時,測試誤差就變成了常見的測試數據集上的誤差率(預測錯誤的個數除以測試數據的總個數)。
訓練誤差的大小,對判定給定問題是不是一個容易學習的問題是有意義的,但本質上不重要。測試誤差反映了學習方法對未知數據集的預測能力,是學習中的重要概念。顯然,給定兩種學習方法,測試誤差小的方法具有更好的預測能力,是更有效的方法。通常將學習方法對未知數據的預測能力稱為泛化能力(generalization ability)。
2. 過擬合與模型選擇
我們知道假設空間理論上有無限個模型,它們有着不同的復雜度(一般表現為參數個數的多少),我們希望選擇或學習一個合適的模型。
如果一味提高對訓練數據的預測能力,所選的模型的復雜度則往往會比真實模型更高。這種現象稱為過擬合。過擬合是指學習時選擇的模型所包含的參數過多,以致於出現這一模型對已知數據預測很好,但對未知數據預測很差的現象。
下面,以多項式函數擬合問題為例,說明過擬合與模型選擇,這是一個回歸問題。
現在給定一個訓練數據集:
$$T=\{(x_1,y_1),(x_2,y_2),\dots,(x_n,y_n)\}$$
其中,$x_i\in R$是輸入$x$的觀測值,$y_i\in R$是相應的輸出$y$的觀測值。多項式函數擬合的任務是假設給定數據由M次多項式函數生成,選擇最有可能產生這些數據的M次多項式函數,即在M次多項式函數中選擇一個對已知數據以及未知數據都有很多預測能力的函數。
設M次多項式為:
$$f_M(x,w) = w_0+w_1x+w_2x^2+\dots+w_Mx^M = \sum_{j=0}^Mw_jx^j$$
對於上面這個問題,模型的復雜度即為多項式的次數;然后在給定的模型復雜度下,按照經驗風險最小化策略,求解參數,即多項式的系數,具體地,求以下經驗風險最小化:
$$L(w) = \frac{1}{2}\sum^N_{i=1}(f(x_i,w)-y_i)^2$$
這時,損失函數為平方損失,系數$\frac{1}{2}$是為了計算方便。
我們用$y = sin(x)$生成10個數據點,並適當的在$y$值上加了一些誤差,下面我們分別用0~9次多項式對數據進行擬合。
上圖給出了$M=1,M=3,M=9$時多項式擬合的情況。當$M=1$時多項式曲線是一條直線,數據擬合效果很差。相反,如果$M=9$,多項式曲線通過每個數據點,訓練誤差為0。從對給定的訓練數據擬合的角度來說,效果是最好的。但是因為訓練數據本身存在噪聲,這種擬合曲線對未知數據的預測能力往往並不是最好的,這時過擬合現象就會發生。
import numpy as np import matplotlib.pyplot as plt import random x = np.linspace(0,1,10) y = np.sin(2*np.pi*x) for i in range(0,10): y[i] = y[i] + random.uniform(-0.4,0.4) p = np.polyfit(x,y,9) t = np.linspace(0,1.0,100) plt.plot(x,y,'o') plt.plot(t,np.sin(np.pi*2*t),label='$y=sin(x)$'); plt.plot(t,np.polyval(p,t),label='$y = \sum_{i=0}^Mw_ix_i,M=9,x_0=0$'); plt.legend() plt.show()
3. 正則化與交叉驗證
3.1 正則化
前面文章在介紹機器學習策略的時候,已經提到過結構風險最小化的概念。結構風險最小化正是為了解決過擬合問題來提出來的策略,它在經驗風險上加一個正則化項。正則化項一般是模型復雜度的單調遞增函數,模型越復雜,正則化值就越大。比如,正則化項可以是模型參數的向量的范數。
正則化項可以取不同的形式。例如,回歸問題中,損失函數是平方損失,正則化項可以是參數向量的$L_2$范數:
$$L(w) = \frac{1}{N}\sum_{i=1}^N(f(x_i;w)-y_i)^2+\frac{\lambda}{2}||w||^2$$
這里,$||w||$表示參數向量$w$的$L_2$范數。
正則化項也可以是參數向量的$L_1$范數:
$$L(w) = \frac{1}{N}\sum_{i=1}^N(f(x_i;w)-y_i)^2+\lambda||w||_1$$
這里,$||w||_1$表示參數向量$w$的$L_1$范數。
正則化符合奧卡姆剃刀(Occam’s razor)原理。奧卡姆剃刀應用在模型選擇時想法是:在所有可能選擇的模型中,能夠很好地解釋已知數據並且十分簡單才是最好的模型,也就是應該選擇的模型。從貝葉斯估計的角度來看,正則化項對應於模型的先驗概率。可以假設復雜模型有較小的先驗概率,簡單的模型有較大的先驗概率。
3.2 交叉驗證
如果給定的樣本數據充足,進行模型選擇的一種簡單方法是隨機地將數據集切分成三部分,分別為訓練集、驗證集和測試集。訓練集用來訓練模型,驗證集用於模型的選擇,而測試集用於最終對學習方法的評估。在學習到的不同復雜度的模型中,選擇對驗證集有最小預測誤差的模型。
但是在許多實際應用中數據是不充分的。為了選擇好的模型,可以采用交叉驗證方法。交叉驗證的基本想法是重復地使用數據;把給定的數據進行切分,將切分的數據集組合為訓練集與測試集,在此基礎上反復地進行訓練、測試以及模型選擇。
1. 簡單交叉驗證
首先隨機地將已給數據分為兩部分,一部分作為訓練集,另一部分作為測試集;然后用訓練集在各種條件下訓練模型,從而得到不同的模型;在測試集上評價各個模型的測試誤差,選出測試誤差最小的模型。
2. S折交叉驗證
這種方法應用最多。首先隨機地將已給的數據切分為S個互不相交的大小相同的子集;然后利用其中的S-1個子集的數據訓練模型,然后用余下的子集測試模型;將這一過程對可能的S種選擇重復進行;最后選出S次評測中平均測試誤差最小的模型。
3. 留一交叉驗證
S折交叉驗證的特征情形是$S=N$,稱為留一交叉驗證,往往在數據缺乏的情況下使用。這里,N是給定數據集的容量。
4. 泛化能力
學習方法的泛化能力是指由該方法學習到的模型對未知數據的預測能力,是學習方法本質上重要的性質。現實中采用最多的辦法是通過測試數據集的誤差來評價學習方法的泛化能力。但是因為數據是有限的,並不能代表全體未知樣本,所以很有可能按照這樣評價到得的結果是不可靠的。
下面我們從理論上對學習方法的泛化能力進行分析。
首先給出泛化誤差的定義。如果學習到的模型是$\hat{f}$,那么用這個模型對未知數據預測的誤差即為泛化誤差(generalization error)
$$R_{exp}(\hat{f}) = E_P[L(Y,\hat{f}(X))] = \int_{\mathcal{X}\times\mathcal{Y}}L(y,\hat{f}(x))P(x,y)dxdy$$
泛化誤差反映了學習方法的泛化能力,如果一種方法學習的模型比另一種方法學習的模型具有更小的泛化誤差,那么這種方法就更有效。事實上,泛化誤差就是所學習到的模型的期望風險。
而我們知道數據的聯合分布函數我們是不知道的,所以實際中,學習方法的泛化能力分析往往是通過研究泛化誤差的概率上界進行的,簡稱泛化誤差上界(generalization error bound)。具體來說,就是通過比較兩種學習方法的泛化誤差上界的大小來比較它們的優劣。
對二分類問題,當假設空間有有限個函數的集合$\mathcal{F}={f_1,f_2,\dots,f_d}$時,對任意一個函數$f\in\mathcal{F}$,至少以概率$1-\delta$,以下不等式成立:
$$R(f) \le \hat{R}(f)+\varepsilon(d,N,\delta)$$
其中,$\varepsilon(d,N,\delta)=\sqrt{\frac{1}{2N}(\log d+\log\frac{1}{\delta})}$
不等式左邊$R(f)$是泛化誤差,右端即為泛化誤差的上界。$\hat{R}(f)$為訓練誤差。