天天看點

機器學習模型的評估和選擇

模型評估與選擇

經驗誤差與過拟合

通常我們把分類錯誤的樣本數占樣本總數的比例稱為"錯誤率" (error rate) ,即如果在 m 個樣本中有 α 個樣本分類錯誤,則錯誤率 E= α/m; 相應的, 1 - α/m 稱為"精度" (accuracy) ,即"精度 =1 -錯誤率"更一般地,我們把學習 器的實際預測輸出與樣本的真實輸出之間的差異稱為"誤差" (error), 學習器在訓練集上的誤差稱為"訓練誤差" (training error)或"經驗誤 差" (empirical error) ,在新樣本上的誤差稱為"泛化誤差" (generalization error)。

顯然,我們希望得到泛化誤差小的學習器。然而,我們事先并不知道新 樣本是什麼樣,實際能做的是努力使經驗誤差最小化。在很多情況下,我們可以 學得一個經驗誤差很小、在訓練集上表現很好的學習器,例如甚至對所有訓練 樣本都分類正确,即分類錯誤率為零,分類精度為 100%,但這是不是我們想要 的學習器呢?遺憾的是,這樣的學習器在多數情況下都不好。

我們實際希望的,是在新樣本上能表現得很好的學習器。為了達到這個 目的,應該從訓練樣本中盡可能學出适用于所有潛在樣本的"普遍規律",這 樣才能在遇到新樣本時做出正确的判别。然而,當學習器把訓練樣本學得"太 好"了的時候,很可能巳經把訓練樣本自身的一些特點當作了所有潛在樣本都 會具有的一般性質,這樣就會導緻泛化性能下降這種現象在機器學習中稱為 "過拟合" (overfitting)。 與"過拟合"相對的是"欠拟合" (underfitting) ,這 是指對訓練樣本的一般性質尚未學好。

過拟合其實很好了解,就是在訓練的樣本資料上表現的太好,以至于學到了樣本的所有的特征,但是,其他樣本的特針和訓練樣本是不盡相同的,是以導緻該學習器在測試樣本上表現很差,泛化能力不強。欠拟合,就是學習的不到家,隻學了1+1就想去分類10*10,錯誤率很高。

有多種因素可能導緻過拟合,其中最常見的情況是由于學習能力過于強大, 以至于把訓練樣本所包含的不太一般的特性都學到了,而欠拟合則通常是由 于學習能力低下而造成的欠拟合比較容易克服,例如在決策樹學習中擴充分 支、在神經網絡學習中增加訓練輪數等,而過拟合則很麻煩。在後面的學習中 我們将看到,過拟合是機器學習面臨的關鍵障礙,各類學習算法都必然帶有一 些針對過拟合的措施;然而必須認識到,過拟合是無法徹底避免的,我們所能做 的隻是"緩解'或者說減小其風險。關于這一點,可大緻這樣了解:機器學習 面臨的問題通常是 NP 難甚至更難,而有效的學習算法必然是在多項式時間内運作完成,若可徹底避免過拟合, 則通過經驗誤差最小化就能獲最優解,這就意 味着我們構造性地證 明了 " P=NP" ;是以, 隻要相信 "p 不等于 NP " ,過拟合就 不 可避免。

在現實任務中,我們往往有多種學習算法可供選擇,甚至對同 一個學習算 法,當使用不同的參數配置時,也會産生不 同的模型 。 那麼,我們該選用 哪 一個 學習算法、使用哪一種參數配置呢?這就是機器學習 中的"模型選擇" (model selection) 問題。理想的解決方案當然是對候選模型的泛化誤差進行 評估 , 然後 選擇泛化誤差最小的那個模型。然而如上面所讨論的,我們無法直接獲得泛化 誤差,而訓練誤差又由于過拟合現象的存在而不适合作為标準,那麼,在現實中 如何進行模型評估與選擇呢?

評估方法

通常, 我們可通過實驗測試來對學習器的泛化誤差進行評估并進而做出 選 擇 為此, 需使用一個 "測試集 " (testing set)來測試學習器對新樣本的判别 能 力,然後 以測試集上的"測試誤差" (testing error)作為泛化誤差的近似。(在現實任務中往往還會考慮時間開信 銷、可解釋性等方面的因素,這裡暫且隻考慮泛化 誤差)通常 我們假設測試樣本也是從樣本真實分布 中獨立同分布采樣而得但需注意 的 是,測試集應該盡可能與訓練集互斥, 即測試樣本盡量不在訓練集中出現、未 在訓練過程中使用過。 測試樣本為什麼要盡可能不出現在訓練集中呢?為了解這一點,不妨考慮 這樣一個場景:老師出了 10 道習題供同學們練習 ,考試時老師又用 同樣的這 10 道題作為試題,這個考試成績能否有效反映出同學們學得好不好呢?答案是否 定的,可能有的同學隻會做這 10 道題卻能得高分。回到我們的問題上來,我們希望得到泛化性能強的模型,好比是希望同學們對課程學得很好、獲得了對所 學知識"舉一反三"的能力;訓練樣本相當于給同學們練習的習題,測試過程 則相當于考試。顯然,若測試樣本被用作訓練了,則得到的将是過于"樂觀"的 估計結果。 可是,我們隻有一個包含 m 個樣例的資料集 D={(X1, Yl) ,(X2,Y2), … , (Xm , Ym)} , 既要訓練,又要測試,怎樣才能做到呢?答案是:通過對 D 進行适當 的處理,從中産生出訓練集 S 和測試集 T. 下面介紹兒種常見的做法。

留出法

"留出法" (hold-out)直接将資料集 D 劃分為兩個互斥的集合,其中一個 集合作為訓練集 S,另一個作為測試集 T, 即 D=SUT ,S 交T= 空。在 S 上訓 練出模型後,用 T 來評估其測試誤差,作為對泛化誤差的估計。

以二分類任務為例,假定 D 包含 1000 個樣本,将其劃分為 S 包含 700 個樣 本 , T 包含 300 個樣本,用 S 進行訓練後,如果模型在 T 上有 90 個樣本分類錯 誤,那麼其錯誤率為 (90/300) x 100% 口 30%,相應的,精度為 1- 30% = 70%。

需注意的是,訓練/測試集的劃分要盡可能保持資料分布的一緻性,避免 因資料劃分過程引入額外的偏差而對最終結果産生影響,例如在分類任務中 至少要保持樣本的類别比例相似。如果從來樣 (sampling) 的角度來看待資料 集的劃分過程,則保留類别比例的采樣方式通常稱為"分層采樣" (stratified sampling)。例如通過對 D 進行分層采樣而獲得含 70% 樣本的訓練集 S 和含 30% 樣本的測試集 T , 若 D 包含 500 個正例、 500 個反例,則分層采樣得到的 S 應包含 350 個正例、 350 個反例,而 T 則包含 150 個正例和 150 個反例;若 S、 T 中樣本類别比例差别很大,則誤差估計将由于訓練/測試資料分布的差異 而産生偏差。

另一個需注意的問題是,即使在給定訓練/測試集的樣本比例後,仍存在多 種劃分方式對初始資料集 D 進行分割。例如在上面的例子中,可以把 D 中的樣 本排序,然後把前 350 個正例放到訓練集中,也可以把最後 350 個正例放到訓 練集中,……這些不同的劃分将導緻不同的訓練/測試集,相應的模型評估的 結果也會有差别。是以,單次使用留出法得到的估計結果往往不夠穩定可靠,在 使用留出法時,一般要采用若幹次随機劃分、重複進行實驗評估後取平均值作 為留出法的評估結果。例如進行 100 次随機劃分,每次産生一個訓練/測試集用 于實驗評估, 100 次後就得到 100 個結果,而留出法傳回的則是這 100 個結果的 平均。

此外,我們希望評估的是用 D 訓練出的模型的性能,但留出法需劃分訓練/測試集, 這就會導緻一個窘境:若令訓練集 S 包含絕大多數樣本, 則訓練出 的模型可能更接近于用 D 訓練出的模型, 但由于 T 比較小,評估結果可能不夠 穩定準确;若令測試集 T 多包含一些樣本, 則訓練集 S 與 D 差别更大了,被評 估的模型與用 D 訓練出 的模型相比可能有較大差别,進而降低了評估結果的保 真性(fidelity) ,這個問題沒有完美的解決方案 , 常見做法是将大約 2/3 到 4/5 的 樣本用于訓練,剩餘樣本用于測試。

交叉驗證法

"交叉驗證法" (cross validation)先将資料集 D 劃分為 k 個大小相似的 互斥子集, 即 D = D1 U D2υ... U Dk, Di n Dj = ø (í 不等于j ) 。每個子集 Di 都 盡可 能保持資料分布的一緻性,即從 D 中 通過分層采樣得到。然後,每次用 k-1 個子集的并集作為訓練集,餘下 的那個子集作為測試集;這樣就可獲得 k 組訓練/測試集,進而可進行 k 次訓練和測試, 最終傳回的是這 k 個測試結果 的均值。顯然,交叉驗證法評估結果的穩定性和保真性在很大程度上取決于 k 的取值,為強調這一點,通常把交叉驗證法稱為 " k 折交叉驗證" (k-fold cross validat ion)。k 最常用 的取值是 10,此時稱為 1 0 折交叉驗 證 ; 其他常用 的 k 值 有 5、 20 等。

與 留出法相似,将資料集 D 劃分 為 k 個子集同樣存在多種劃分方式。為 減小 因樣本劃分不同而引入的差别 , k 折交叉驗證通常要随機使用不同的劃分 重複 p 次,最終的評估結果是這 p 次 k 折交叉驗證結果的均值,例如常見的有 "10 次 10 折交叉驗證"。

假定資料集 D 中包含 m 個樣本,若令 k=m , 則得到了交叉驗證法的 一 個特例:留一法 (Leave-One-Ot比,簡稱 LOO) . 顯然 , 留一法不受随機樣本劃分方式的影響,因為 m 個樣本隻有唯一的方式劃分為 m 個子集一一每個子集包含 一個樣本;留一法使用的訓練集與初始資料集相比隻少了一個樣本,這就使得 在絕大多數情況下,留一法中被實際評估的模型與期望評估的用 D 訓練出的模 型很相似。是以,留一法的評估結果往往被認為比較準确。然而,留一法也有其 缺陷:在資料集比較大時,訓練 m 個模型的計算開銷可能是難以忍受的(例如數 據集包含 1 百萬個樣本,則需訓練 1 百萬個模型),而這還是在未考慮算法調參 的情況下。另外,留一法的估計結果也未必永遠比其他評估方法準确;"沒有免 費的午餐"定理對實驗評估方法同樣适用。

自助法

我們希望評估的是用 D 訓練出的模型.但在留出法和交叉驗證法中,由于 保留了一部分樣本用于測試,是以實際評估的模型所使用的訓練集比 D 小,這 必然會引入一些因訓練樣本規模不同而導緻的估計偏差。留一法受訓練樣本規 模變化的影響較小,但計算複雜度又太高了。有沒有什麼辦法可以減少訓練樣 本規模不同造成的影響,同時還能比較高效地進行實驗估計呢?

"自助法" (bootstrapping)是一個比較好的解決方案,它直接以自助采樣 法 (bootstrap sampling)為基礎 [Efron and Tibshirani, 1993].。給定包含 m 個樣 本的資料集 D , 我們對它進行采樣産生資料集 D': 每次随機從 D 中挑選一個 樣本 ,将其拷貝放入 D' ,然後再将該樣本放回初始資料集 D 中,使得該樣本在 下次采樣時仍有可能被采到;這個過程重複執行 m 次後,我們就得到了包含 m 個樣本的資料集 D',這就是自助采樣的結果。顯然 , D 中有一部分樣本會在 D' 中多次出現,而另一部分樣本不出現。可以做一個簡單的估計,樣本在 m 次采 樣中始終不被采到的機率是 (1 - 1/m)^m 。

即通過自助來樣,初始資料集 D 中約有 36.8% 的樣本未出現在采樣資料集 D' 中。于是我們可将 D' 用作訓練集 , D\D' 用作測試集;這樣,實際評估的模型與 期望評估的模型都使用 m 個訓練、樣本,而我們仍有資料總量約 1/3 的、沒在訓 練集中出現的樣本用于測試.這樣的測試結果,亦稱"包外估計" (out-of-bag estimate)。

自助法在資料集較小、難以有效劃分訓練/測試集時很有用;此外,自助法 能從初始資料集中産生多個不同的訓練集,這對內建學習等方法有很大的好處. 然而,自助法産生的資料集改變了初始資料集的分布,這會引入估計偏差。是以,在初始資料量足夠時,留出法和交叉驗證法更常用一些。

——本文内容來自于 周志華<機器學習>

繼續閱讀