經驗誤差與過擬合
通常我們把分類錯誤的樣本數占樣本總數的比例稱為“錯誤率”,“精度”為1-錯誤率
更一般地,我們把學習器的實際預測輸出與樣本的真實輸出之間的差異稱為“誤差”,學習器在訓練集上的誤差成為“訓練誤差”或“經驗誤差”,在新樣本上的誤差稱為“泛化誤差”。
顯然,我們希望得到泛化誤差小的學習器。
為了達到這個目的,應該從訓練樣本中盡可能學出適用于所有潛在樣本的“普遍規律”,這樣才能在遇到新樣本時做出正確的判別。然而,當學習器把訓練樣本學得“太好”了的時候,很可能已經把訓練樣本自身的一些特點當作了所有潛在樣本都會具有的一般性質,這樣就會導致泛化性能下降。這種現象在機器學習中稱為“過擬合”(學習能力過于強大,以至于把訓練樣本所包含的不太一般的特性都學到了),與“過擬合”相對的是“欠擬合”,這是指對訓練樣本的一般性質尚未學好,是由于學習能力低下造成的。欠擬合比較容易克服,如在決策樹學習中擴展分支、在神經網絡學習中增加訓練輪次數等;過擬合則很麻煩,是機器學習面臨的關鍵障礙,無法徹底避免。
現實任務中,我們往往有多重學習算法可供選擇,甚至對同一個學習算法,當使用不同的參數配置時,也會產生不同的模型,那么我們該選擇哪一個學習算法、使用哪一種參數配置呢?這就是機器學習中的“模型選擇”問題,理想的解決方案當然是對候選模型的泛化誤差進行評估,然后選擇泛化誤差最小的那個模型。但是,我們無法直接獲得泛化誤差,而訓練誤差又由于過擬合現象的存在而不適合作為標準,那么,在現實中如何進行模型評估與選擇呢?
通常,我們可通過實驗測試來對學習器的泛化誤差進行評估并進而做出選擇。為此,需使用一個“測試集”來測試學習器對新樣本的判別能力,然后以測試集上的“測試誤差”作為泛化誤差的近似。通常,我們假設測試樣本也是從樣本真實分布中獨立同分布采樣而得。但需注意的是,測試集應該盡可能與訓練集互斥,即測試樣本盡量不在訓練集中出現、未在訓練過程中使用過。
留出法
“留出法”(hold-out)直接將數據集D劃分為兩個互斥的集合,其中一個集合作為訓練集S,另一個作為測試集T,在S上訓練出模型后,用T來評估其測試誤差,作為對泛化誤差的估計。
需要注意的是,訓練/測試集的劃分要盡可能保持數據分布的一致性,避免因數據劃分過程引入額外的偏差而對最終結果產生影響,例如在分類任務中至少要保持樣本的類別比例相似。如果從采樣(sampling)的角度看待數據集的劃分過程,則保留類別比例的采樣方式通常稱為“分層采樣”(stratified sampling)。
另一個需要注意的問題是,即便在給定訓練/測試集的樣本比例后,仍存在多種劃分方式對初始數據集D進行分割。不同的劃分將導致不同的訓練/測試集,相應的,模型評估的結果也會有差異。因此,單次使用留出法得到的估計結果往往不夠穩定可靠,在使用留出法時,一般要采用若干次隨機劃分、重復進行實驗評估后取平均值作為留出法的評估結果。
留出法會導致一個窘境:若令訓練集S包含絕大多數樣本,則訓練處的模型可能更接近于用D訓練處的模型,但由于T比較小,評估結果可能不夠穩定準確;若令測試集T多包含一些樣本,則訓練集S與D差別更大了,被評估的模型與用D訓練出的模型相比可能有較大差別,從而降低了評估結果的保真性(fidelity)。這個問題沒有完美的解決方案,常見做法是將2/3~4/5的樣本用于訓練,剩余樣本用于測試。
交叉驗證法
“交叉驗證法”(cross validation)先將數據集D劃分為k個大小相似的互斥子集,每個子集都盡可能保持數據分布的一致性,每次用k-1個子集的并集作為訓練集,余下的那個子集作為測試集;這樣就可獲得k組訓練/測試集,從而可進行k次訓練和測試,最終返回的是這k個測試結果的均值。顯然,交叉驗證法評估結果的穩定性和保真性在很大程度上取決于k的取值。為強調這點,通常把交叉驗證法稱為“k折交叉驗證”,k最常用的取值是10.
留一法(leave-one-out,簡稱LOO)是交叉驗證法的特例,不受隨機樣本劃分方式的影響,使用的訓練集與初始數據集相比只少一個樣本,這就使得在絕大多數情況下,留一法中被實際評估的模型與期望評估的用D訓練出的模型很相似。因此,留一法的評估結果往往被認為比較準確,然而,其缺陷在于當數據集比較大時,訓練m個模型的計算開銷可能是難以忍受的,而這還是在未考慮算法調參的情況下。另外。留一法的估計結果也未必永遠比其他評估方法準確(沒有免費的午餐)
自助法
“自助法”(bootstrapping)可以減少訓練樣本規模不同造成的影響,同時還能比較高效地進行實驗估計,它直接以自助采樣法(bootstrap sampling)為基礎,給定包含m個樣本數據集D,我們對它進行采樣產生數據集D’:每次隨機從D中挑選一個樣本,將其拷貝放入D’,然后再將該樣本放回初始數據集D中,使得該樣本在下次采樣時仍有可能被采到;這個過程重復執行m次后,我們就得到包含m個樣本的數據集D',這就是自助采樣的結果。顯然,D中有一部分樣本會在D'中多次出現,而另一部分樣本不出現,可以做一個簡單的估計,樣本m次采樣中始終不被采到的概率取極限可知:通過自助采樣,初始數據集D中約有36.8%的樣本未出現在采樣數據集D’中,于是我們可以將D’用作訓練集,D\D’用作測試集。這樣,實際評估的模型與期望評估的模型都使用m個訓練樣本,而我們仍有數據總量約1/3的、沒在訓練集中出現的樣本用于測試,這樣的測試結果,亦稱“包外估計”(out-of-bag estimate)
自助法在數據集較小、難以有效劃分訓練/測試集時很有用;此外,自助法能從初始數據集中產生多個不同的訓練集,這對集成學習等方法有很大好處。然而,自助法產生的數據集改變了初始數據集的分布,這會引入估計偏差。因此,在初始數據量足夠時,留出法和交叉驗證法更常用一些。
調參
在進行模型評估與選擇時,除了要對使用學習算法進行選擇,還需對算法參數進行設定,這就是通常所說的“參數調節”或簡稱“調參”
機器學習常涉及兩類參數:一類是算法的參數,亦稱“超參數”,數目常在10以內;另一類是模型的參數,數目可能有很多,例如大型“深度學習”模型甚至有上百億個參數。兩者調參方式相似,均是產生多個模型之后基于某種評估方法來進行選擇;不同之處在于前者通常是由人工設定多個參數侯選值后產生模型,后者則是通過學習來產生多個候選模型(如神經網絡在不同輪數停止訓練)
調參和算法選擇沒什么本質區別:對每種參數配置都訓練出模型,然后把對應最好模型的參數作為結果。有一點需要注意:學習算法的很多參數是在實數范圍內取值,因此,對每種參數配置都訓練出模型來是不可行的。現實中常用的做法,是對每個參數選定一個范圍和變化步長,例如在[0,0.2]范圍以0.05位步長,則實際要評估的候選參數值有5個,最終是從這5個候選值中產生選定值。顯然,這樣選定的參數值往往不是“最佳”值,但這是在計算開銷和性能估計之間進行折中的結果,通過這個折中,學習過程才變得可行。即便如此,調參往往仍很困難,在不少應用任務中,參數調得好不好往往對最終模型性能有關鍵影響。
需要注意的是,我們通常把學得模型在實際使用中遇到的數據稱為測試數據,為加以區分,模型評估與選擇中用于評估測試的數據集常稱為“驗證集”(validation set)。例如,在研究對比不同算法的泛化性能時,我們用測試集上的判別效果來估計模型在實際使用時的泛化能力,而把訓練數據另外劃分為訓練集和驗證集,基于驗證集上的性能來進行模型選擇和調參。