1 引言
人類在對客觀世界的問題進行判斷時,往往都會根據(jù)過去的經(jīng)驗來指導(dǎo)自己。例如,為什么看到微濕的路面、感到和風(fēng)、看到晚霞,就認(rèn)為明天是好天了呢?這是因為在我們的生活經(jīng)驗中已經(jīng)見過了很多類似的情況,頭一天觀察到上述的特征后,第二天天氣通常會很好,為什么色澤青綠、根蒂蜷縮、敲聲濁響,就能判斷出是正熟的好瓜?因為我們吃過、看到過很多西瓜,所以基于色澤、根蒂、敲聲這幾個特征我們就可以做出相當(dāng)好的判斷。可以看出,我們能做出有效的判斷,是因為我們已經(jīng)累計了許多經(jīng)驗,而通過對經(jīng)驗的利用,就能對新的情況作出有效的決策。
那么上面對經(jīng)驗的利用是靠我們?nèi)祟愖陨硗瓿傻模嬎銠C能幫忙嗎?
機器學(xué)習(xí)正是這門學(xué)科,它致力于研究如何通過計算的手段,利用經(jīng)驗來改善系統(tǒng)自身的性能。在計算機系統(tǒng)中,”經(jīng)驗“通常以”數(shù)據(jù)“的形式存在,因此,機器學(xué)習(xí)所研究的主要內(nèi)容,是關(guān)于在計算機上從數(shù)據(jù)中產(chǎn)生”模型“(model)的算法,即“學(xué)習(xí)算法”(learning algorithm)。有了學(xué)習(xí)算法,我們把經(jīng)驗數(shù)據(jù)提供給它,它就能基于這些數(shù)據(jù)產(chǎn)生模型;在面對新的情況時(例如看到一個沒有剖開的西瓜),模型會給我們提供相應(yīng)的判斷(例如好瓜)。如果說計算機科學(xué)是研究關(guān)于“算法”的學(xué)問,那么類似的,可以說機器學(xué)習(xí)是研究關(guān)于“學(xué)習(xí)算法”的學(xué)問。
2 模型評估與選擇
2.1 經(jīng)驗誤差與過擬合
通常我們把分類錯誤的樣本占樣本總數(shù)的比例成為“錯誤率” (error rate),即如果在 個樣本中有 個樣本分類錯誤,則錯誤率 ;相應(yīng)的, 稱為“精度” (accuracy),即 “精度=1-錯誤率”。更一般的,我們把學(xué)習(xí)期的實際預(yù)測輸出與樣本的真實輸出之間的差異成為“誤差” (error),學(xué)習(xí)器在訓(xùn)練集上的誤差稱為“訓(xùn)練誤差” (training error) 或“經(jīng)驗誤差” (empirical error),在新樣本上的誤差稱為“泛化誤差” (generalization error)。顯然,我們希望得到泛化誤差最小的學(xué)習(xí)器。然而,我們事先并不知道新樣本是什么樣,實際能做的是努力使經(jīng)驗誤差最小化。在很多情況下,我們可以學(xué)得一個經(jīng)驗誤差很小、在訓(xùn)練集上表現(xiàn)很好的學(xué)習(xí)器,例如甚至對所有訓(xùn)練樣本都分類正確,即分類錯誤率為零,分類精度為100%,但這是不是我們想要的學(xué)習(xí)器呢?遺憾的是,這樣的學(xué)習(xí)器在多數(shù)情況下都不好。
我們實際希望的,是在新樣本上能表現(xiàn)得很好的學(xué)習(xí)器。為了達到這個目的,應(yīng)該從訓(xùn)練樣本中盡可能學(xué)出適用于所有潛在樣本的“普遍規(guī)律”,這樣才能在遇到新樣本時做出正確的判斷。然而,當(dāng)學(xué)習(xí)器把訓(xùn)練樣本學(xué)得“太好”的時候,很可能已經(jīng)把訓(xùn)練樣本自身的一些特點當(dāng)做了所有潛在樣本都會具有的一般性質(zhì),這樣就會導(dǎo)致泛化能力下降。這種現(xiàn)象在機器學(xué)習(xí)中稱為“過擬合” (overfitting)。與“過擬合”相對的是“欠擬合” (underfitting),這是指對訓(xùn)練樣本的一般性質(zhì)尚未學(xué)好。
有很多因素可能導(dǎo)致過擬合,其中最常見的情況是由于學(xué)習(xí)能力過于強大,以至于把訓(xùn)練樣本所包含的不太一般的特性也都學(xué)習(xí)到了,而欠擬合則通常是由于學(xué)習(xí)能力低下而造成的。欠擬合比較容易克服,例如在決策樹中擴展分支、在神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)中增加訓(xùn)練輪數(shù)等,而過擬合則很麻煩。過擬合是機器學(xué)習(xí)面臨的關(guān)鍵障礙,各類學(xué)習(xí)算法都必然帶有一些針對過擬合的措施;然而必須認(rèn)識到,過擬合是無法徹底避免的,我們所能做的只是“緩解”,或者說減小其風(fēng)險。關(guān)于這一點,可大致這樣理解:機器學(xué)習(xí)面臨的問題通常是 NP 難甚至更難,而有效的學(xué)習(xí)算法必然是在多項式時間內(nèi)運行完成,若克徹底避免過擬合,則通過經(jīng)驗誤差最小化就能獲得最優(yōu)解,這就意味著我們構(gòu)造性地證明了 “P = NP”;因此,只要相信?,過擬合就不可避免。
在現(xiàn)實任務(wù)中,我們往往有很多學(xué)習(xí)算法可供選擇,甚至對同一個學(xué)習(xí)算法,當(dāng)使用不同的參數(shù)匹配時,也會產(chǎn)生不同的模型。那么,我們該選用哪一個學(xué)習(xí)算法,使用哪一種配置參數(shù)呢?這就是機器學(xué)習(xí)中的“模型選擇” (model selection)問題。理想的解決方案當(dāng)然是對候選模型的泛化誤差進行評估,然后選擇泛化誤差最小的那個模型。然而如上面所討論的,我們無法直接獲得泛化誤差,而訓(xùn)練誤差又由于過擬合現(xiàn)象的存在而不適合作為標(biāo)準(zhǔn),那么,在現(xiàn)實中如何進行模型評估與選擇呢?
2.2 評估方法
通常,我們可以通過實驗測試來對學(xué)習(xí)器的泛化誤差進行評估并進而做出選擇。為此,需要使用一個“測試集” (testing set)來測試學(xué)習(xí)器對新樣本的判別能力,然后以測試集上的“測試誤差” (testing error)作為泛化誤差的近似。通常我們假設(shè)測試樣本也是從樣本真實分布中獨立同分布采樣而得。但需要注意的是,測試集應(yīng)該盡可能與訓(xùn)練集互斥,即測試樣本盡量不在訓(xùn)練集中出現(xiàn)、未在訓(xùn)練過程中使用過。
測試樣本為什么要盡可能不出現(xiàn)在訓(xùn)練集中呢?為理解這一點,不妨考慮這樣一個場景:老師出了 10 道題供同學(xué)們練習(xí),考試時老師又用同樣的這 10 道題作為試題,這個考試成績能否有效反應(yīng)出同學(xué)們學(xué)得好不好呢?答案是否定的,可能有的同學(xué)只會做這 10 道題卻能得高分?;氐轿覀兊膯栴}上來,我們希望得到泛化性能很強的模型,好比是希望同學(xué)們對課程學(xué)得很好、獲得了對所學(xué)知識 “舉一反三” 的能力;訓(xùn)練樣本相當(dāng)于給同學(xué)們練習(xí)的習(xí)題,測試過程則是相當(dāng)于考試。顯然,若測試樣本被用作訓(xùn)練了,則得到的將是過于 “樂觀” 的估計結(jié)果。
可是,我們只有一個包含個樣例的數(shù)據(jù)集?, 既要訓(xùn)練,又要測試,怎樣才能做到呢?答案是:通過對?
?進行適當(dāng)?shù)奶幚恚瑥闹挟a(chǎn)生出訓(xùn)練集 S?和測試集 T?。下面介紹幾種常見的做法。
2.2.1 留出法
“留出法”(hold-out) 直接將數(shù)據(jù)集D劃分成兩個互斥的集合,其中一一個集合作為訓(xùn)練集S另一個作為測試集T,即。在S上訓(xùn)練出模型后,用T來評估其測試誤差,作為對泛化誤差的估計。
以二分類任務(wù)為例,假定D包含1000個樣本,將其劃分為S包含700個樣本, T包含300個樣本,用S進行訓(xùn)練后,如果模型在T上有90個樣本分類錯誤,那么其錯誤率為90/300X100%,相應(yīng)的,精度為1-30%=70%。
需注意的是,訓(xùn)練/測試集的劃分要盡可能保持?jǐn)?shù)據(jù)分布的一致性,避免因數(shù)據(jù)劃分過程引入額外的偏差而對最終結(jié)果產(chǎn)生影響,例如在分類任務(wù)中至少要保持樣本的類別比例相似。如果從采樣(sampling)的角度來看待數(shù)據(jù)集的劃分過程,則保留類別比例的采樣方式通常稱為 ”分層采樣”(stratified sampling)。例如通過對D進行分層采樣而獲得含70%樣本的訓(xùn)練集S和含30% 樣本的測試集S,若D包含500個正例、500 個反例,則分層采樣得到的S應(yīng)包含350個正例、350 個反例,而T 則包含150個正例和150個反例;若S、T中樣本類別比例差別很大,則誤差估計將由于訓(xùn)練/測試數(shù)據(jù)分布的差異而產(chǎn)生偏差。
另一個需要注意的問題是,即便在給定的訓(xùn)練測試集的樣本比例后,仍存在多種劃分方式對初始數(shù)據(jù)集 D 進行分割。例如在上面的例子中,可泌巴 D 中的樣本排序,然后把前 350 個正例放到訓(xùn)練集中,也可以把最后 350 個正例放到訓(xùn)練集中,…… 這些不同的劃分將導(dǎo)致不同的訓(xùn)練測試集,相應(yīng)的,模型評估的結(jié)果也會有差別。因此,單次使用留出法得到的估計結(jié)果往往不夠穩(wěn)定可靠,在使用留出法時,一般要采用若干次隨機劃分、重復(fù)進行實驗評估后取平均值作為留出法的評估結(jié)果。佰收口進行 1 00 次隨相蒯分 r 每次產(chǎn)生一個訓(xùn)練/測試集用于實驗評估, 100 次后就得到 1 00 個結(jié)果,而留出法返回的則是這 1 00 個結(jié)果的平均。
此外,我們希望評估的是用 D 訓(xùn)練出的模型的性能,但留出法需劃創(chuàng) 11 練/測試集,這就會導(dǎo)致一個窘境( a wkward situation ) :若令訓(xùn)練集 S 包含絕大多數(shù)樣本,則訓(xùn)練出的模型可能更接近于用 D 訓(xùn)練出的模型,但由于 T 比較小,評估結(jié)果可能不夠穩(wěn)定準(zhǔn)確;若令測試集 T 多包含一些樣本,則訓(xùn)練集 S 與 D 差別更大了,被評估的模型與用 D 訓(xùn)練出的模型相比可能有較大的差別,從而降低了評估結(jié)果的保真性( fidelity )。這個問題沒有完美的解決方案,常見做法是將大約 2 / 3 ~4 / 5 的樣本用于訓(xùn)練,剩余樣本用于測試。
2.2.2 交叉驗證法
“交叉驗證法” (cross validation)先將數(shù)據(jù)集D劃分為k個大小相似的互斥子集,即
。每個子集D;都盡可能保持?jǐn)?shù)據(jù)分布的一致性,即從D中通過分層采樣得到。然后,每次用k- 1個子集的并集作為訓(xùn)練集,余下的那一個子集作為測試集;這樣就可獲得k組訓(xùn)練測試集,從而可進行k次訓(xùn)練和測試,最終返回的是這k個測試結(jié)果的均值。顯然,交叉驗證法評估結(jié)果的穩(wěn)定性和保真性在很大程度上取決于k:的取值,為強調(diào)這一點,通常把交叉驗證法稱為“ k折交叉驗證”( k - foldcross validation)。? 最常用的取值是10,此時稱為10折交叉驗證;其他常用的k值有5、20等。
與留出法相似,將數(shù)據(jù)集 D劃分為k:個子集同樣存在多種劃分方式。為減小因樣本劃分不同而引入的差別, k折交叉驗證通常要隨機使用不同的劃分重復(fù)p次,最終的評估結(jié)果是這p次k折交叉驗證結(jié)果的均值,例如常見的有"10 次10折交叉驗證”。
假定數(shù)據(jù)集D中包含 m個樣本,若令k= m,則得到了交叉驗證法的一個特例:留一法(Leave-One-Out,簡稱LOO)。顯然,留一法不受隨機樣本劃分方式的影響,因為個樣本只有唯一的方式劃分為個子集每個子集包含一個樣本; 留一法使用的訓(xùn)練集與初始數(shù)據(jù)集相比只少了一個樣本,這就使得在絕大多數(shù)情況下,留一法中被實際評估的模型與期望評估的用D訓(xùn)練出的核型很相似。因此,留一法的評估結(jié)果往往被認(rèn)為比較準(zhǔn)確。然而,留一法也有其缺陷:在數(shù)據(jù)集比較大時,訓(xùn)練m個模型的計算開銷可能是難以忍受的(例如數(shù)據(jù)集包含1百萬個樣本,則需要訓(xùn)練1百萬個模型),而這還是在未考慮算法調(diào)參的情況下。另外,留一法的估計結(jié)果也未必永遠(yuǎn)比其他評估方法準(zhǔn)確; “沒有免費的午餐” 定理對實驗評估方法同樣適用。
2.2.3 自助法
我們希望評估的是用D訓(xùn)練出的模型。但在留出法和交叉驗證法中,由于保留了一部分樣本用于測試,因此實際評估的模型所使用的訓(xùn)練集比D小,這必然會引入一些因訓(xùn)練樣本規(guī)模不同而導(dǎo)致的估計偏差。留一法受訓(xùn)練樣本規(guī)模變化的影響較小,但計算復(fù)雜度又太高了。有沒有什么辦法可以減少訓(xùn)練樣本規(guī)模不同造成的影響,同時還能比較高效地進行實驗估計呢?
“自助法”(bootstrapping)是一個比較好的解決方案,它直接以自助采樣法(bootstrapsampling)為基礎(chǔ)。給定包含m個樣本的數(shù)據(jù)集D ,我們對它進行采樣產(chǎn)生數(shù)據(jù)集D' :每次隨機從D中挑選一個樣本,將其拷貝放入D',然后再將該樣本放回初始數(shù)據(jù)集中,是的該樣本在下次采樣時仍有可能被采到;這個過程重復(fù)執(zhí)行m次后,我們就得到了包含m個樣本的數(shù)據(jù)集,這就是自助采樣的結(jié)果。顯然,D中有一部分樣本會在D'中多次出現(xiàn),而另一部分樣本不出現(xiàn)??梢宰鲆粋€簡單的估計,樣本在m次采樣中始終不被采到的概率是?,取極限得到:
即通過自助采樣,初始數(shù)據(jù)集D中約有36.8% 的樣本未出現(xiàn)在采樣數(shù)據(jù)集D'中。于是我們可將D'用作訓(xùn)練集, D D' 用作測試集;這樣實際評估的模型與期望評估的模型都使用m個訓(xùn)練樣本,而我們?nèi)杂袛?shù)據(jù)總量約1/3 的、沒在訓(xùn)練集中出現(xiàn)的樣本用于測試。這樣的測試結(jié)果,亦稱“外包估計”(out-of-bag estimate)。
自助法在數(shù)據(jù)集較小、難以有效劃分訓(xùn)練/測試集時很有用;此外, 自助法能從初始數(shù)據(jù)集中產(chǎn)生多個不同的訓(xùn)練集,這對集成學(xué)習(xí)等方法有很大的好處。然而,自助法產(chǎn)生的數(shù)據(jù)集改變了初始數(shù)據(jù)集的分布,這會引入估計偏差。因此,在初始數(shù)據(jù)集足夠時,留出法和交叉驗證法更為常用一些。
2.2.4 調(diào)參與最終模型
大多數(shù)學(xué)習(xí)算法都有些參數(shù) (parameter) 需要設(shè)定,參數(shù)配置不同,學(xué)得模型的性能往往有顯著差別。因此,在進行模型評估與選擇時,除了要對適用學(xué)習(xí)算法進行選擇,還需要對算法參數(shù)進行設(shè)定,這就是通常所說的 “參數(shù)調(diào)節(jié)” 或簡稱 “調(diào)參” (parameter tuning)。
這里需要注意一點:學(xué)習(xí)算法的很多參數(shù)是在實數(shù)范圍內(nèi)取值,因此,對每種參數(shù)配置都訓(xùn)練出模型來是不可行的?,F(xiàn)實中常用的做法,是對每個參數(shù)選定一個范圍和變化步長, 例如在[0, 0.2]范圍內(nèi)以0.05為步長,則實際要評估的候選參數(shù)值有5個,最終是從這5個候選值中產(chǎn)生選定值。顯然,這樣選定的參數(shù)值往往不是“最佳” 值,但這是在計算開銷和性能估計之間進行折中的結(jié)果,通過這個折中,學(xué)習(xí)過程才變得可行。事實上,即便在進行這樣的折中后,調(diào)參往往仍很困難。可以簡單估算一下: 假定算法有3個參數(shù),每個參數(shù)僅考慮5個候選值,這樣對每一組訓(xùn)練/測試集就有
給定包含m個樣本的數(shù)據(jù)集D, 在模型評估與選擇過程中由于需要留出一部分?jǐn)?shù)據(jù)進行評估測試,事實上我們只使用了-部分?jǐn)?shù)據(jù)訓(xùn)練模型。因此,在模型選擇完成后,學(xué)習(xí)算法和參數(shù)配置已選定,此時應(yīng)該用數(shù)據(jù)集D重新訓(xùn)練模型。這個模型在訓(xùn)練過程中使用了所有m個樣本,這才是我們最終提交給用戶的模型。
另外,需要注意的是,我們通常把學(xué)得模型在實際使用中遇到的數(shù)據(jù)稱為測試數(shù)據(jù),為了加以區(qū)分,模型評估與選擇中用于評估測試的數(shù)據(jù)集常稱為 “驗證集” (validation set)。例如,在研究對比不同算法的泛化性能時,我們用測試集上的判斷效果來估計模型在實際使用時的泛化能力,而把訓(xùn)練數(shù)據(jù)另外劃分為訓(xùn)練集和驗證集,基于驗證集上的性能來進行模型選擇和調(diào)參。
-
計算機
+關(guān)注
關(guān)注
19文章
7665瀏覽量
90839 -
機器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8504瀏覽量
134661
原文標(biāo)題:機器學(xué)習(xí)中的模型評估與選擇
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
評論