模型評估和選擇

1. 人類學習

在一次自然測驗前,王老師給同學們講了 10 道不同風格的訓練題。舒岱梓同學死記硬背的學,基本上是死記每道題的細節和解題步驟;肖春丹同學心不在焉的學,老師講的時候他一直在分心;甄薛申同學舉一反三的學,主要學習老師講的解題思路和方法。講完題後老師開始髮捲子測驗,裡面有 10 道測驗題。舒岱梓同學把訓練題學的太過以至於測驗題稍微變動一點就做不好了,典型的應試教育派;肖春丹同學學習能力低下,訓練題都學不好,測驗題一樣也做不好,典型的不學無術派;甄薛申同學學到了題里的普遍規律,發現所有題都是萬變不離其宗,測試題也做的很好,典型的素質教育派。

舒岱梓同學這種現象叫做「過學習」 (overstudy),它的極端結果就是只能在做過的題上拿高分;肖春丹同學這種現象叫做「欠學習」 (understudy),它的極端後果就是做什麼題都拿不到高分。這兩者都不好,我們要向甄薛申同學學習。

作者看了看其中的一道題和他們給的答案,就以下明白了為什麼「過學習」 和「欠學習」為什麼不好了。

「過學習」的舒岱梓學的太細,把訓練樣本自身的一些特點 (樹葉的鋸齒) 當作了潛在樣本 (沒有鋸齒的樹葉) 都會具有的特性。「欠學習」的肖春丹學的太粗,連訓練樣本的一般性質 (樹葉至少不會有樹榦吧) 都沒學好。人類學習這樣,機器學習亦如此。對人類來說,你訓練題都做對不算什麼,牛的是每次測驗題都能拿高分;對機器來說,你訓練數據能擬合 (fit) 好不算什麼,牛的是每次測試數據擬合的誤差小。

註:舒岱梓肖春丹甄薛申分別的諧音是書獃子,小蠢蛋和真學神。

2. 機器學習

我在一家房地產中介上班,一天老闆說一個富豪客戶想買一套在濱海灣的公寓,需要我們給個報價,你根據周邊公寓的不同面積的價格建個模型吧。我心想這還不簡單,趕緊收集數據如下:

首先我用了一次多項式做了線性擬合,馬上把結果展示給老闆看:

註:藍色實心點是真實數據,綠色線是擬合後的模型

老闆:這擬合的是什麼鬼?紅框裡面那兩套房子離你預測模型差太遠了吧,你這整體的誤差也太大了吧。

:。。。

的確誤差有點大,怎麼改善模型呢?突然我靈機一動,可以用高次多項式啊,7個數據我用個六次多項式可以完美擬合所有點啊,機智如我!馬上我用六次多項式做了擬合,屁顛屁顛著給老闆展示,心想我做到了零誤差期待你的肯定:

註:紫色實心點是新數據

老闆:這個客戶想買的面積大概3300平方英尺,你的模型告訴我客戶需要付8500萬新幣?而市場3500平方英尺大概才1300多萬哦!什麼爛模型!

:。。。

誤差大也不行,零誤差也不行?你還要我怎樣,要怎樣 (薛之謙的音樂背景)?到底哪裡出了問題?想了幾天,我大概摸出以下一些規則:

  1. 太簡單的模型擬合現有數據的質量不太好,誤差比較大。即便給了新數據,也沒有人會用這個模型來預測。

  2. 太複雜的模型擬合現有數據的質量會很好甚至完美 (零誤差),但適應新數據的能力不好也沒什麼卵用。

  3. 折中方案是找一個中間模型,即使你擬合現有數據的質量低於複雜模型,但它只要能更好的適應新數據,我們就應該選用它。

經過一輪調試,我使用二次多項式來擬合數據,結果如下圖:

老闆:哎喲這個模型不錯喲,現有數據擬合的很好,而且貌似對新數據的預測也比較合理。(客戶想買的3300平方英尺大概1250萬左右)

:Yeah?

通過上面三個例子,一次多項式「欠擬合」 (underfitting) 數據 (基本上沒有學習到數據的非線性特徵),六次多項式「過擬合」 (overfitting) 數據 (學數據學的太過了導致於來個新數據 3300 平方英尺給出那麼離譜的價格),而二次多項式擬合的結果看起來比它們都好。這個「好」可以量化嗎?說它「好」是因為它能適應新數據,但是在沒見到新數據之前怎麼來判斷模型的好壞呢 (更別提如何量化它了)?

這些問題在第 4 節都會得到解答,但是在此之前,我們一定要了解第 3 節里的幾個重要概念。

3. 重要概念

3.1 總體 (population) 和樣本 (sample)

在統計中,把研究對象的全體稱為總體,而把組成總體的各個元素稱為個體,把從總體中抽取的若干個體稱為樣本。舉個調查中國男性平均身高的例子,全國的男性就是總體,每個男性是個體。有時候普查所有男性金錢花費和時間成本太高,通常我們會抽取若干男性作為樣本。我們計算樣本里的男性平均身高作為總體里的所有男性平均身高的推理 (inference)。

弄清楚總體和樣本的概念之後,我們來看看誤差和殘差。

3.2. 誤差 (error) 和殘差 (residual)

誤差和殘差是兩個極易混淆的概念,誤差是觀察值和總體平均值的偏差,而殘差是觀察值和樣本平均值的偏差。還是用調查中國男性平均身高的例子:

  • 誤差 - 假如中國所有男性平均身高為1.75米,一個隨機選擇的男性身高為1.80米,則誤差為0.05米;如果另一個隨機選擇的男性身高為1.70米,則誤差為-0.05米。需要強調的是總體均值1.75米通常是不可觀察 (unobservable) 的,因此誤差也是不可觀察的。

  • 殘差 - 假設我們隨機抽樣了10000人的樣本,也算出樣本里男性平均身高為1.74米,一個隨機選擇的男性身高為1.80米,則殘差為0.06米;如果另一個隨機選擇的男性身高為1.70米,則殘差為-0.04米。需要強調的是樣本均值1.74米是可觀察 (observable) 的,因此殘差也是可觀察的。

因此可看出殘差是不可觀察量的誤差得可觀察估計。(residual is the observable estimator of unobservable error)。當我們做統計調查時都是用的樣本 (通常不可能用總體的,除非總體裡面的元素不多),樣本均值可以作為總體均值的良好估計量,然後我們有:

  • 樣本中每個男性的身高和不可觀察的總體均值之間的差異叫誤差。(誤差通常僅用於嚴格的定義,因為不可觀察不可實操)

  • 樣本中每個男性的身高和可觀察的樣本均值之間的差異叫殘差。(殘差在實踐中非常重要,因為可觀察可實操)

作者費這麼多功夫描述誤差和殘差的區別,是因為我覺得所有機器學習的術語里對訓練誤差 (training error),測試誤差 (test error) 和驗證誤差 (validation error) 定義的都不太嚴謹 (如果按傳統的統計學定義的話)。原因是誤差都是基於總體而且不可觀察也不可量化的,但是訓練集,測試集和驗證集都是樣本而且可觀察也可量化,難道不應該叫做訓練殘差 (training residual),測試殘差 (test residual) 和驗證殘差 (validation residual) 嗎?有一個術語,真實誤差 (true error),作者覺得這個定義就很嚴謹。因為真實誤差衡量的是模型對新數據適用的能力,所以真實誤差是不可觀察的,不能稱其為真實殘差。

:這個問題也困擾了我很久,如果是我才疏學淺,望大牛們來斧正。也許這是機器學習術語界的一種慣例吧。在後文作者也就跟著慣例用這些術語。為了不給大家添堵,我們就認為「對於一個模型,誤差就是該模型預測輸出和樣本真實輸出之間的差異 」吧。在我們的預測房價的例子里

誤差 = 預測價格 - 真實價格

做人也不要太嚴謹,累!

3.3 多項式函數

在本貼作者都拿多項式模型舉例,在解釋後面的訓練誤差 (真實誤差) 跟模型複雜度的關係時更加直觀一點。說白了就是用不同階的多項式來擬合房價,像第 2 節那個例子一樣,用一次多項式結果不理想就試試六次多項式,結果還不理想再試試二次多項式,一直到結果理想為止。模型函數如下:

3.4 模型複雜度 (model complexity)

原本以為這個定義會很簡單,google 發現沒有一個解釋的非常通俗易懂,要不定義的不清不楚,要不用了一大堆嚴謹的數學符號。為了幫助理解本帖內容,我們就把注意力集中在「多項式函數」上,多項式階越高,該模型複雜度越高。例如:

以此類推。

3.5 損失函數 (loss function)

損失函數是一種衡量預測損失和錯誤 (損失和錯誤預測相關) 程度的函數。定義為

為什麼可以把「預測不準」看做是一種損失?以預測房屋價格為例,如果你是賣家,估價太低賺的就少了,估價太高很可能會失去買家;如果你是買家,估價太低很可能會失去賣家,估價太高花的就多了。在各種情況 (買家或賣家) 下,估不準房價,估高 (overpredict) 或估低 (underpredict),可能都會造成損失。損失函數裡面的「平方」就考慮了因估高或估低而使買家或賣家蒙受損失的情況。

3.6 訓練集和訓練誤差 (training set, training error)

訓練集是每一個訓練樣本組成的集合,也是上文那 7 個 [面積, 房價] 的數據。

訓練誤差又叫經驗誤差 (empirical error),定義為模型在訓練集上的誤差,通常可表示為訓練集上的損失均值

假設我們用線性模型擬合訓練集,訓練誤差展示於下圖:

下面兩圖我們計算了用零次,一次,二次和六次多項式擬合後的訓練誤差,發現模型複雜度越高,訓練誤差越小 (六次多項式已經可以生成零訓練誤差了)。

訓練誤差跟模型複雜度的關係如下:

問題:訓練誤差是模型預測能力的好的度量嗎?換句話問,是不是訓練誤差越小模型預測就越准?

回答:不是!除非訓練數據包含了所有數據!反例可見下圖

這個六次多項式完美的擬合訓練數據,訓練誤差為 0,你看著它的瘋狂形狀,捫心自問你會對它的預測能力有信心嗎?紫色那個點對應的那個價格會不會太瘋狂?

3.7. 真實誤差 (true error)

真實誤差又叫泛化誤差 (generalization error),它的定義是一個模型學完訓練數據之後,用在新數據上的誤差。真實誤差主要衡量模型得「歸納能力」 (induction ability),模型是否能從訓練數據中歸納出規則而適應是新數據的能力。

新數據是沒有見過的數據。真實誤差實際上是測量已訓練好的模型在所有數據 (所有現有的數據和未來的數據) 上的誤差。在這數據全集上,對任何一個給定面積的房子,它的價格總會有一個概率分布。

假設某房子面積為 2500 平方英尺,它的價格在 800~1500 萬之間 (假設價格只有800萬,1000萬和1500萬這三個,真實情況不可能這樣,只是為了便於下文分析),而且分布概率通常會如上圖所示,極低價800萬和極高價1500萬的個數會很小,分別是1棟和2棟,而中間價1000萬的個數會很大,是7棟。對於這套房子,用模型擬合的價格是1050萬,它的真實誤差為

實際中,面積為 2500 平方英尺會有無數個,因為未來會一直有新數據進來。在給定 xt 時,真實誤差的嚴謹數學表達式為

公式裡面的期望符號相當於上例中累加符號。

對於所有 xt,真實誤差的數學表達式為

接下來我們分析一下真實誤差和模型複雜度之間的關係,首先是一次多項式:

由上文分析可知,在整個數據集里 (已知的未知的) 每一個面積的房子對應的價格都有一個概率分布,而上圖兩條紅色曲線就是真實房價的上下邊界,而那條藍色曲線就是真實房價的均值。綠色直線是擬合出來的一次多項式模型,我們發現它和藍色曲線相差比較遠,因此一次多項式模型對應的真實誤差比較大。

接著二次多項式:

綠色曲線是擬合出來的二次多項式模型,我們發現它和藍色曲線相差很近,因此二次多項式模型對應的真實誤差很小。

最後六次多項式:

綠色曲線是擬合出來的六次多項式模型,我們發現它和藍色曲線相差非常非常遠,因此六次多項式模型對應的真實誤差非常大。

真實誤差跟模型複雜度的關係如下:

和訓練誤差不同,真實誤差不是隨著模型複雜度變高而變小的,它是先變小再變大的。當訓練模型時,我們希望找一個模型使得它的真實誤差最小。

最嚴重的問題是上面所有關於真實誤差的圖都是假想的 (我們最多只能推斷出它的形狀是這樣的,但得不到具體的數值),因為真實誤差是基於所有數據的,沒有人可以計算出基於未來數據的誤差,因此真實誤差只能意會,不能計算!不能計算那費這麼大篇幅介紹它有何用?測試誤差終於派上用場了。

3.8 測試集和測試誤差 (test set, test error)

測試集是選出用來測試的樣本組成的集合。最重要的是測試集裡面不包含任何訓練集裡面的數據。當你選好訓練集之後,測試集是在模擬那些你從來都沒見過但未來可能會見到的數據集。

測試誤差是定義為模型在測試集上的誤差,它是真實誤差的一種近似 (還記得上文說過真實誤差看以來很美但是不能計算,因此我們需要找一個可以計算的而又能夠近似真實誤差的量)。計算公式如下:

3.9 偏差,方差和雜訊 (bias, variance and noise)

讓我們再深一步剖析真實誤差。以房價為例,給定一個模型 (比如線性模型),該模型在給定一個面積來預測房價,是一定會有誤差的,那麼誤差的來源有哪幾個呢?

  • 這個模型只用了一套 [面積, 房價] 訓練集來擬合模型參數,而市場中有無數套同樣大小的 [面積, 房價] 訓練集。用每套訓練集來擬合模型都會得出一套不同的模型參數。我們可以假想市場上有一個真實模型 (想的到捉不著) 來描述面積與房價關係的。

    • 對所有套訓練集得到的所有模型求均值得到一個平均模型,它與真實模型之間的差距叫做偏差。
    • 用所有套訓練集得到的所有模型本身也各不相同,它們的變動水平叫做方差。
  • 這些成交房價不一定只是和面積相關,還可能和當時買家或賣家的心情,風水,甚至成交當天的天氣有關。這些因素造成的誤差都可以看成是雜訊。

簡單模型和複雜模型

為了便於解釋,我們選常函數為簡單模型,高次多項式函數為複雜模型。下圖是展示了兩套數據擬合出的兩個簡單模型 (綠色水平線),而黃色曲線是真實模型。

同樣,下圖是展示了兩套數據擬合出的兩個複雜模型 (綠色瘋狂曲線),而黃色曲線是真實模型。

從上圖可看出,用不同訓練集的數據可以擬合出不同的簡單模型或複雜模型,簡單模型平淡,複雜模型瘋狂。接下來我們來看看這兩種情況下的偏差和方差的性質。

偏差

簡單模型 (模型複雜度低)

將所有簡單模型求平均得到下圖的綠色虛線,發現它和黃色曲線相差甚遠。給定無數套訓練集而期望擬合出來的模型就是平均模型。偏差就是真實模型平均模型的差異。該模型太簡單,就是一組水平直線,平均之後和真實模型的曲線差別較大,因此簡單模型通常高偏差 (見灰色陰影部分)。

複雜模型 (模型複雜度高)

將所有複雜模型求平均得到下圖的綠色虛線,發現它和黃色曲線相差甚近。該模型太複雜,是一組起伏很大波浪線,平均之後最大值和最小組都會相互抵消,和真實模型的曲線差別較小,因此複雜模型通常低偏差 (見黃色曲線和綠色虛線幾乎重合)。

方差

簡單模型 (模型複雜度低)

簡單模型的對應的函數如出一轍,都是水平直線,而且平均模型的函數也是一條水平直線,因此簡單模型的方差很小,並且對數據的變動不敏感。

複雜模型 (模型複雜度高)

複雜模型的對應的函數千奇百怪,毫無任何規則,但平均模型的函數也是一條平滑的曲線,因此複雜模型的方差很大,並且對數據的變動很敏感。

雜訊

雜訊表達了在當前任務上任何學習演算法所能達到的期望真實誤差的下界,即學習問題本身的難度。

偏差和方差權衡 (bias-variance tradeoff)

由上兩小節可知:

  1. 簡單模型的偏差大方差小,複雜模型的偏差小方差大。

  2. 偏差和模型複雜度成反比,方差和模型複雜度成正比。

  3. 簡單模型「欠擬合」,複雜模型「過擬合」。

  4. 「欠擬合」的模型的偏差大方差小,「過擬合」的模型的偏差小方差大

一張圖勝過千句話:

一般來說,偏差和方差是有衝突的,這稱為偏差-方差權衡。給定學習任務:

  • 當訓練不足時,模型擬合能力不夠強,訓練數據的擾動不足以是模型產生顯著變化,此時偏差是總誤差的主要來源。

  • 當訓練充足時,模型擬合能力逐漸加強,數據發生的輕微擾動都會導致模型發生顯著變化,此時方差是總誤差的主要來源。

如上圖所示,最優模型出現在總誤差最小的那點。

深度研究真實誤差 (Deep study of true error)

溫馨小貼士:本節是給喜愛數學的讀者準備的,不愛數學的同學可以跳過。

回憶真實誤差的定義,對於所有 xt (面積) ,其數學表達式為

然而現在還有一個新問題,就是你每次選的訓練集也是隨機選取的,今天選前1000個,明天選後1000個,後天選中間1000個,每次擬合出來的模型也不盡相同,因此我們真的要量化的東西是:用不同訓練集來計算真實誤差 (擬合出來不同的房價預測函數 h,和真實房價 y 一起計算出損失函數 L),然後將所有真實誤差求平均值,稱為預期誤差 (expected prediction error)。預期誤差的嚴謹數學公式如下:

接下來我們從數學上來推出真實誤差是偏差,方差和雜訊的總和。

推導解釋:

小結

綜上所述,真實誤差有三個來源,偏差,方差和雜訊。由於真實誤差是衡量模型泛化性能的,因此泛化性能是由學習演算法的能力,數據的充分性以及學習任務的本身難度所共同決定的。給定學習任務 (因為其本身難度是無法降低的,就像雜訊是無法消除的一樣),為了獲得好的泛化性能 (降低真實誤差),有兩條路可走:增強擬合數據能力 (降低偏差) 和增強抗擾數據能力 (降低方差)。

4. 模型精度評估和選擇

如果你有耐心看到這,現在思路應該很明晰了。我們用訓練集來訓練模型,通常模型複雜度越高訓練誤差越小。但是看一個模型好不好是要看它的泛化能力,也就是適應新數據的能力,而真實誤差是衡量模型泛化能力的。可惜的是,真實誤差就像一個仙子一樣,只能說說想想,卻永遠抓不到算不出,因此我們用測量誤差來代替真實誤差來選擇合適的模型複雜度,但有時能成功,有時會失敗,且聽以下分析。

4.1 訓練集和測試集劃分 (training/test sets split)

如果數據足夠多的話,通常按 80% 和 20% 來劃分訓練集和測試集。

4.2 假想執行方案 (hypothetical implementation)

模型選擇流程如下:

  1. 按 80% 和 20% 劃分訓練集和測試集。

  2. 對於每一個模型 (例如,不同階的多項式模型),用訓練集的數據擬合出模型參數。

  3. 用此參數和測試集算出測試誤差。選一個測試誤差最小的模型。

此做法的缺陷是,如果測試集的數據不能代表數據全集,那麼最小測試誤差的模型可能表現還沒有其他模型好。

4.3 實際執行方案 (practical implementation)

解決方案就是除訓練集之外創建兩個「集」,一個用來選擇模型或調解參數,叫做「驗證集」,一個用來估計選好的模型在實際使用時的泛化能力,叫做「測試集」。如果數據足夠多的話,通常按 50%, 25% 和 25% 來劃分訓練集,驗證集和測試集。

模型選擇流程如下:

  1. 按 50%, 25% 和 25% 劃分訓練集,驗證集和測試集。

  2. 對於每一個模型 (例如,不同階的多項式模型),用訓練集的數據擬合出模型參數。

  3. 用此參數和驗證集算出驗證誤差。選一個驗證誤差最小的模型。

  4. 用對應的模型參數和測試i集算出測試誤差作為真實誤差的評估。

4.4 k 折交叉驗證法 (k-fold cross vallidation)

上次劃分 50%, 25% 和 25% 為訓練集,驗證集和測試集的先決條件是數據足夠多。如果數據不夠多的話,驗證集里的數據也不足以反映真實數據的特徵。這個時候通常會使用 k 折交叉驗證法。以 k 等於 5 為例:

將整個數據集大概平均分成 5 份。

  1. 對於每一個模型,從第一份到最後一份,將選中那份數據集當作驗證集,剩餘的四份一起當作訓練集。
  2. a. 用訓練集的數據擬合出模型參數。

    b. 用此參數和驗證集算出驗證誤差。

  3. 求出 5 個驗證誤差的均值作為交叉驗證誤差。

  4. 選一個交叉驗證誤差最小的模型

當 k = 1 時,則得到了交叉驗證法的一個特例:留一法 (LOO, leave-one-out)。顯然此評估會非常準確,且不受隨機樣本劃分方式的影響。但是當數據集比較大時,其計算開銷太大。在實踐中 k 通常選 5 或 10,分別叫做 5折交叉驗證法和 10折交叉驗證法。

5. 模型綜合評估和選擇

上節模型評估只是從精準角度出發,在實踐中這是遠遠不夠的,通常選擇一個模型需要考慮以下五點:

  • 精度 (accuracy)
  • 可解釋 (interpretability)

  • 高效 (efficiency)

  • 可擴展 (scalability)

  • 簡單 (simplicity)

一個好的方法是從簡單模型開始,然後根據需要才增加模型複雜性。 一般來說,簡單應該是首選,除非複雜模型可以大幅度提高精度。

模型精度的主要測量來自於估計給定模型的測試誤差。因此,模型選擇的精度提高目標是減少估計的測試誤差。需要注意的是,通常提高模型性能,模型精度可以提高,但是提高的幅度遞減 (diminishing return)。鑒於此,選擇模型並不總是要它最精準。有時還必須考慮其他重要因素,包括可解釋,高效,可擴展和簡單。

通常,給定的一個應用程序,你可能需要折中一下模型精度和模型可解釋性。人工神經網路 (ANN, aritificial neural network),支持向量機 (SVM, suppport vector machine) 和一些集合方法 (ensemble methods) 可以用於創建非常精確的預測模型,但是對非專業人士就是個黑盒子。

當預測性能是首要目標時並且不需要解釋模型如何工作和進行預測,可以優選黑盒演算法。然而,在某些情況下,模型可解釋性是首選,有時甚至是法律強制的。比如在金融業,假設機器學習演算法用於接受或拒絕個人的信用卡應用程序。如果申請人被拒絕並決定提出投訴或採取法律行動,金融機構將需要解釋該決定是如何做出的。雖然這對於 ANN 或 SVM 系統幾乎是不可能的,但對於基於決策樹 (decision tree) 的演算法來說是相對直接的。

在訓練,測試,處理和預測速度方面,一些演算法和模型類型需要更多的時間,並且需要比其他演算法和存儲器更大的計算能力和內存。在一些應用中,速度和可擴展性是關鍵因素,特別是在任何廣泛使用的接近實時的應用 (電子商務站點) 中,給了一個新數據,模型就需要快速更新,並且在大數據上預測或分類。

最後,如前所述,模型簡單應該總是優選的,除非提高精度對你有顯著的增益。簡單模型通常更高效,更容易擴展也更容易解釋。

6. 總結和下帖預告

如何評估模型精度?

千萬不要看訓練誤差,要看真實誤差。但由於真實誤差不可計算,通常用測試誤差或者驗證誤差來代表它。

如何劃分數據集?

如果數據夠多,將數據集按 50%, 25% 和 25% 來劃分訓練集,驗證集和測試集。如果數據不夠多,將採用5折或10折交叉驗證法。

如何選擇模型?

簡單為大,除非提高精度對你有顯著的增益。

下帖開始真正的演算法解析,監督學習的線性回歸,外加實踐中用到的各種小 trick。Stay tuned!

----------------------------------------------------------------------------------------------------------------------------------裡面所有的圖都是作者自己做的,蠻花時間精力。如果本篇能幫助你直觀的了解了機器學習,可關注微信號 MeanMachine1031,我保證在今後的帖子里你能學到更多。Peace Out!


推薦閱讀:

[行為檢測|行為識別]調研綜述
來自小姐姐的入門推薦:七套機器學習基本演算法(Python)
機器能像人一樣思考嘛? 金句領讀137
Cousera deeplearning.ai筆記 — 深度神經網路(Deep neural network)
機器學習之數據預處理簡介

TAG:機器學習 | 模型 |