機器學習的目的是使學習到的模型不僅對已知資料而且對未知資料都能有很好的**能力。
假設學習到的模型是y=
f^(x
) ,訓練誤差是模型y=
f^(x
) 關於訓練資料集的平均損失: re
mp(f
^)=1
n∑i=
1nl(
yi,f
^(xi
))其中
n 是訓練樣本容量。
測試誤差是模型y=
f^(x
)關於測試資料集的平均損失: et
est(
f^)=
1n′∑
i=1n
l(yi
,f^(
xi))
其中n′
是測試樣本容量。
當損失函式是0-1損失時,測試誤差就變成了常見的測試資料集上的誤差率(**錯誤的個數除以測試資料的總個數)。
訓練誤差的大小,對判定給定問題是不是乙個容易學習的問題是有意義的,但本質上不重要。測試誤差反映了學習方法對未知資料集的**能力,是學習中的重要概念。顯然,給定兩種學習方法,測試誤差小的方法具有更好的**能力,是更有效的方法。通常將學習方法對未知資料的**能力稱為泛化能力(generalization ability)。
我們知道假設空間理論上有無限個模型,它們有著不同的複雜度(一般表現為引數個數的多少),我們希望選擇或學習乙個合適的模型。
如果一味提高對訓練資料的**能力,所選的模型的複雜度則往往會比真實模型更高。這種現象稱為過擬合。過擬合是指學習時選擇的模型所包含的引數過多,以致於出現這一模型對已知資料**很好,但對未知資料**很差的現象。
下面,以多項式函式擬合問題為例,說明過擬合與模型選擇,這是乙個回歸問題。
現在給定乙個訓練資料集: t=
其中,xi
∈r是輸入
x 的觀測值,yi
∈r是相應的輸出
y 的觀測值。多項式函式擬合的任務是假設給定資料由m次多項式函式生成,選擇最有可能產生這些資料的m次多項式函式,即在m次多項式函式中選擇乙個對已知資料以及未知資料都有很多**能力的函式。
我們用y=s
in(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_^mw_ix_i,m=9,x_0=0$');
plt.legend()
plt.show()
正則化項可以取不同的形式。例如,回歸問題中,損失函式是平方損失,正則化項可以是引數向量的l2
範數: l(
w)=1
n∑i=
1n(f
(xi;
w)−y
i)2+
λ2||
w||2
這裡,||
w|| 表示引數向量w 的
l2範數。
正則化項也可以是引數向量的l1
範數: l(
w)=1
n∑i=
1n(f
(xi;
w)−y
i)2+
λ||w
||1
這裡,||w
||1 表示引數向量w 的
l1範數。
正則化符合奧卡姆剃刀(occam』s razor)原理。奧卡姆剃刀應用在模型選擇時想法是:在所有可能選擇的模型中,能夠很好地解釋已知資料並且十分簡單才是最好的模型,也就是應該選擇的模型。從貝葉斯估計的角度來看,正則化項對應於模型的先驗概率。可以假設複雜模型有較小的先驗概率,簡單的模型有較大的先驗概率。
如果給定的樣本資料充足,進行模型選擇的一種簡單方法是隨機地將資料集切分成三部分,分別為訓練集、驗證集和測試集。訓練集用來訓練模型,驗證集用於模型的選擇,而測試集用於最終對學習方法的評估。在學習到的不同複雜度的模型中,選擇對驗證集有最小**誤差的模型。
但是在許多實際應用中資料是不充分的。為了選擇好的模型,可以採用交叉驗證方法。交叉驗證的基本想法是重複地使用資料;把給定的資料進行切分,將切分的資料集組合為訓練集與測試集,在此基礎上反覆地進行訓練、測試以及模型選擇。
1. 簡單交叉驗證
首先隨機地將已給資料分為兩部分,一部分作為訓練集,另一部分作為測試集;然後用訓練集在各種條件下訓練模型,從而得到不同的模型;在測試集上評價各個模型的測試誤差,選出測試誤差最小的模型。
2. s折交叉驗證
這種方法應用最多。首先隨機地將已給的資料切分為s個互不相交的大小相同的子集;然後利用其中的s-1個子集的資料訓練模型,然後用餘下的子集測試模型;將這一過程對可能的s種選擇重複進行;最後選出s次評測中平均測試誤差最小的模型。
3. 留一交叉驗證
s折交叉驗證的特徵情形是s=
n ,稱為留一交叉驗證,往往在資料缺乏的情況下使用。這裡,n是給定資料集的容量。
4. 泛化能力
學習方法的泛化能力是指由該方法學習到的模型對未知資料的**能力,是學習方法本質上重要的性質。現實中採用最多的辦法是通過測試資料集的誤差來評價學習方法的泛化能力。但是因為資料是有限的,並不能代表全體未知樣本,所以很有可能按照這樣評價到得的結果是不可靠的。
下面我們從理論上對學習方法的泛化能力進行分析。
首先給出泛化誤差的定義。如果學習到的模型是f^
,那麼用這個模型對未知資料**的誤差即為泛化誤差(generalization error) re
xp(f
^)=e
p[l(
y,f^
(x))
]=∫x
×yl(
y,f^
(x))
p(x,
y)dx
dy泛化誤差反映了學習方法的泛化能力,如果一種方法學習的模型比另一種方法學習的模型具有更小的泛化誤差,那麼這種方法就更有效。事實上,泛化誤差就是所學習到的模型的期望風險。
模型評估和選擇
可用模型很多 不同的演算法產生不同的模型,相同的演算法用不同的引數也產生不同的模型。怎麼選?使用訓練誤差最小的那個模型?顯然不行,過擬合問題。模型選擇涉及兩個問題 一是評估方案的實驗設計問題,這方面主要是如何從已有資料中分離出測試資料集,二是評估度量問題,即各種指標,諸如rmse,精度等。理想方案 ...
模型評估與模型選擇
模型選擇的目的是使學到的模型對已知資料和未知資料都有較好的 能力,同時又要避免過擬合。所考察的指標主要是模型的訓練誤差及測試誤差,模型的複雜度越高,訓練誤差越小,但測試誤差先減小後增大。訓練誤差和測試誤差隨模型複雜度變化趨勢 過擬合是指模型的複雜度比真模型更高,模型選擇就是選擇測試誤差最小的適當複雜...
統計分析的體會
客戶給了一張基本的資料表,然後讓我做大量的計算,並且動態 靜態的做統計分析報表,經過了長達兩個月的苦戰,終於作完了。體會如下 1 一張存放中間統計結果的表是必要的,如果能夠將客戶的統計分析需要經過計算才能顯示的字段囊括在內是最好不過了,畢竟在查詢的過程中作計算是一件很討厭的事,雖然有資料冗餘,但是簡...