積跬步以至千里,積怠惰以至深淵html
注:本篇文章在整理時主要參考了 周志華 的《機器學習》。算法
在上一篇文章中,咱們知道要根據具體的問題選擇具體的算法和概括偏好。那麼咱們怎麼斷定咱們的選擇是正確的呢?這就須要擁有一套規範的模型評估與選擇方法論了。bootstrap
首先,咱們要理解機器學習爲何須要一套模型評估與選擇方法論?app
在前一章的學習中,咱們知道機器學習是對數據集的泛化過程,即從輸入的數據中概括出一套能適用於全部潛在樣本的「廣泛規律」。可由於訓練數據不夠充分,機器學習出來的模型並沒辦法涵蓋全部的狀況,這就會致使學習器的實際預測輸出與樣本的真實輸出之間存在「偏差」。機器學習
學習器在訓練集上的偏差稱爲「經驗偏差」,在新樣本上的偏差稱爲「泛化偏差」。把分類錯誤的樣本數佔樣本總數的比例稱爲「錯誤率」 (error rate) ;相應的,1-「錯誤率」稱爲「精度」。很明顯,要使得分類器儘量的有用,咱們應該要讓泛化偏差儘量的小。惋惜在現實環境中,咱們很難知道新樣本是什麼樣的,因此咱們實際能作的只有努力使經驗偏差最小化。工具
說到這裏,也許有的心急的同窗已經火燒眉毛的去將算法設計的儘量百分百的知足全部訓練樣本了,把訓練樣本自身的一些特色看成了全部潛在樣本都會具備的通常性質,可卻忘了學習器真正要達到的是泛化偏差儘量小,而不是目前的折中方案下降經驗偏差。而在下降經驗偏差的道路上,駐守着機器學習領域最大的攔路虎之一:「過擬合」性能
「過擬合」是指學習器對訓練樣本學的太好了,致使泛化程度不夠(還記得機器學習就是一個泛化過程嗎),無法適應新的數據樣本。與之相反的還有一個「欠擬合」的概念,就是對訓練樣本中的通常規律都沒學習好。舉個例子,讓機器來學習天鵝的特徵,通過訓練後,學習了天鵝是有翅膀的,天鵝的嘴巴是長長的彎曲的,天鵝的脖子是長長的有點曲度,天鵝的整個體型像一個「2」且略大於鴨子。這時候你的機器已經基本能區別天鵝和其餘動物了。然而,很不巧你的訓練天鵝數據全是白色的,因而機器通過學習後,會認爲天鵝的羽毛都是白的,之後看到羽毛是黑的天鵝就會認爲那不是天鵝,那就是過擬合;而若是沒能學習到天鵝的基本特徵,那就是欠擬合了。學習
圖1. 圖2. 圖3.測試
圖1. 不可以很好的反映數據樣本的「廣泛規律」 (欠擬合) 圖3. 太過於糾結訓練數據的分佈,從而沒法很好的適應新的數據樣本 (過擬合) 。spa
因此,咱們知道了吧,咱們爲何須要一套模型評估與選擇的方法論呢?由於咱們的訓練數據無法真正表明真實的樣本空間,而泛化偏差沒法直接得到,經驗偏差又由於過擬合的存在而不適合做爲標準,因此咱們才須要一套模型評估與選擇的方法論。
咱們知道了爲何要對模型進行評估,那麼在不知道泛化偏差的狀況下,咱們該如何進行評估呢?
一個經常使用的思路是:既然咱們無法拿到新樣原本進行泛化偏差計算,那麼咱們能夠從訓練樣本中取出一部分來,僞裝它是一組新樣本,並用這些樣本計算出來的偏差做爲泛化偏差的近似。這組選出來的樣本被稱爲「測試集」,測試集上的偏差被稱爲測試偏差。但需注意的是,測試集應該儘可能不與訓練集重合,不然測試集計算出的偏差將無法準確表明該學習器的泛化能力。
爲了理解這一點,不妨考慮這樣一個場景:老師出了10道習題供同窗們練習,考試時又用一樣的10道題做爲試題,這個考試成績可否反映出同窗們寫的好很差呢?答案是否認的,可能有的同窗只會作這10道題卻能得高分。
綜上所述,咱們運用一下幾種常見的作法把一個包含m個樣例的數據集D進行適當的處理,從中產生出訓練集S和測試集T。
一、留出法(hold-out)
直接將D劃分爲互斥的兩部分S和T,在S上訓練出模型後,用T來評估測試偏差。
須要注意的是:應避免因數據劃分過程引入額外的誤差而對最終結果產生影響,例如經過對D進行分層採樣 (保留類別比例的採樣方式) 而得到含70%樣本的訓練集S和含30%樣本的訓練集T,若D包含500個正例子、500個反例,則分層採樣獲得的S應包含350個正例、350個反例。而T則包含150個正例和150個反例;若S、T中樣本類別比例差異很大,則偏差估計將因爲訓練/測試數據分佈的差別而產生誤差。另外,一樣能夠把D中的樣本排序,而後把前350個正例放到訓練集中,也能夠把後350個正例放到訓練集中,......
不一樣的劃分方案將致使不一樣的訓練/測試集,相應的模型評估也會有所差別。所以,通常採用若干次隨機劃分、重複進行實驗評估後取平均值做爲留出法的評估結果。
特色:測試集小時,評估結果的方差較大,被評估的模型與用D訓練出的模型相比可能有較大區別,從而下降了評估結果的保真性;訓練集小時,評估結果的誤差較大,評估結果可能不夠穩定準確。
二、交叉驗證法(cross validation)
將D分層採樣劃分爲互斥的k個子集,每次訓練用其中(k-1)個數據子集,用剩下的一個子集做爲測試集。這樣就能得到k組訓練/測試集,對這k組分別進行訓練和測試,最終返回k個測試結果的均值。
特色:評估結果的穩定性和保真性在很大程度上取決於k的取值 (k折交叉驗證)
三、留一法 (Leave-One-Out)
交叉驗證法的一個特例:假定數據集D中包含m個樣本,令k=m。
特色:不受隨機樣本劃分方式的影響;評估結果每每被認爲比較準確;訓練m個模型的計算開銷比較大。
四、自助法(bootstrapping)
每次從D中隨機複製一個樣本到D1中,重複m次,會獲得一個擁有m個數據樣本的D1數據集 (自主採樣法:可重複採樣或又放回採樣) 。顯然,D中的一部分數據會屢次出如今D1中,而另外一部分樣本不出現。根據平均分佈機率計算,初始數據集D中約有36.8%的樣本未出如今採樣數據集D1中。咱們將D1用做訓練集,D\D1用做測試集 (「\」表示集合減法) 。
五、適用性
自助法在數據集較小、難以有效劃分訓練/測試集時頗有用;此外,自助法能從初始數據集中產生多個不一樣的訓練集,這對集成學習等方法有很大的好處。然而,自助法產生的數據集改變了初始數據集的分佈,這會引入估計誤差。所以,在初始數據量足夠時,留出法和交叉驗證法更經常使用一些。
六、調參
參數配置不一樣,學得模型的性能每每有着顯著差異。需注意的是,在研究對比不一樣算法的泛化性能時,咱們用測試集上的判別效果來估計模型在實際使用時的泛化能力,而把訓練數據另外劃分爲訓練集和驗證集,基於驗證集上的性能來進行模型選擇和調參。
(數據集 (訓練數據(訓練集)(驗證集)) (測試集))
瞭解瞭如何有效可行地實驗評估方法,還須要有衡量模型泛化能力的評價標準,這就是性能度量。這意味着模型的「好壞」是相對的,什麼樣的模型是好的,不只取決於算法和數據,還決定於任務需求。
迴歸任務中最經常使用的性能度量是「均方偏差」,即用模型的輸出與實際輸出計算輸出結果的方差。
一、錯誤率與精度
錯誤率:分類錯誤的樣本數佔樣本總數的比例;
精度:分類正確的樣本數佔樣本總數的比例;
二、查準率、查全率與F1
查準率(precision):被模型預測爲正的樣本中,真正爲正的樣本比例(被預測爲好瓜的西瓜中,真的是好瓜的西瓜比例)
查全率(recall):在全部正的樣本上,被學習器預測爲正的樣本比例(在全部好瓜中,被學習器正確識別的好瓜比例)
F1:(2x查準率x查全率)/(查準率+查全率)。 F1是基於查準率和查全率的調和平均。
「平衡點」(Break-Even Point):「查準率=查全率」時的取值。
查準率和查全率是一對矛盾的度量。通常來講,查準率高時,查全率每每偏低;而查全率高時,查準率每每偏低。例如,若但願將好瓜儘量多地選出來,則可經過增長選瓜的數量來實現,若是將全部西瓜都選上,那麼全部的好瓜也必然都被選上了,但這樣查準率就會較低;若但願選出的瓜中好瓜比例儘量高,則可只挑選最有把握的瓜,但這樣就不免會漏掉很多好瓜,使得查全率較低。一般只有在一些簡單任務中,纔可能使查全率和查準率都很高。
以查準率爲縱軸、查全率爲橫軸做圖,就獲得了查準率-查全率曲線,簡稱「P-R曲線」。
在進行比較時,若一個學習器的P-R曲線被另外一個學習器的曲線徹底「包住」,則可斷言後者的性能優於前者。當曲線有相交時,很難斷言二者的優劣。真要判別時,「平衡點」(Break-Even Point)是一個不錯的度量方法。
三、ROC與AUC
ROC曲線是從「通常狀況下」泛化性能的好壞出發來研究學習器泛化性能的有力工具。ROC:「受試者工做特徵」(receiver operating characteristic)曲線,與P-R 曲線相似,只不過取用「真正利率」(TPR )做爲縱軸,「假正例率」(FPR)做爲橫軸。
對角線對應於「隨機猜想」模型,而點(0,1)則對應於將全部正例排在全部反例以前的「理想模型」。
進行學習器的比較時,與P-R圖類似,若一個學習器的ROC曲線被另外一個學習器的曲線徹底「包住」,則可斷言後者的性能優於前者;若兩個學習器的ROC曲線發生交叉,則難以通常性地斷言二者孰優孰劣。此時若是必定要進行比較,則較爲合理的判據是比較ROC曲線下的面積,即AUC (Area Under ROC Curve)。
四、代價敏感錯誤率與代價曲線
在現實生活中,不一樣類型的錯誤所形成的後果不一樣。例如在醫療診斷中,錯誤地把患者診斷爲健康人與錯誤地把健康人診斷爲患者,看起來都是犯了「一次錯誤」,但後者的影響是增長了進一步檢查的麻煩,前者的後果卻多是喪失了拯救生命的最佳時機。所以,爲權衡不一樣類型錯誤所形成的不一樣損失,可爲錯誤賦予「非均等代價」 (unequal cost)。代價敏感錯誤率表明數據的平均整體代價。
在均等代價下,錯誤率是直接計算「錯誤次數」,並無考慮不一樣錯誤會形成不一樣的後果。在非均等代價下,咱們所但願的再也不是簡單地最小化錯誤次數,而是但願最小化「整體代價」 (total cost)。
有了實驗評估方法和性能度量,表面上看就能對學習器的性能進行評估比較了。但怎麼來作「比較」呢?
這裏面涉及幾個重要因素:
第一,咱們但願比較的是泛化性能,然而經過實驗評估方法咱們得到的是測試集上的性能,二者的對比結果可能未必相同;
第二,測試集上的性能與測試集自己的選擇有很大的關係,且不論使用不一樣大小的測試集會獲得不一樣的結果,即使用相同大小的數據集,若包含的測試樣例不一樣,測試結果也會有所不一樣;
第三,不少機器學習算法自己有必定的隨機性,即使用相同的參數設置在同一個測試集上屢次運行,其結果也會有所不一樣。
爲了解決這些問題,統計假設檢驗(hypothesis test)爲咱們提供了重要的依據。
假設檢驗中的「假設」是對學習器泛化錯誤率分佈的某種猜測或判斷,而後經過假設的驗證結果來對不一樣的學習器或模型的性能進行判斷。泛化錯誤率與測試錯誤率在直觀上比較接近,所以,可根據測試錯誤率估推出泛化錯誤率的分佈。
給定測試錯誤率,則求解樣本誤分類機率公式的偏導可知,錯誤率符合二項(binomial)分佈。
如圖所示,若 錯誤率=0.3,則10個樣本中測得3個被誤分類的機率最大。
[1]設定一個假設,好比「一個機器學習真正的泛化錯誤率不大於0.3」
[2]設定一個置信機率「顯著度a」,a的通常取值爲0.0五、0.1;a表明的意思是當咱們的假設成立的機率在(1-a,1]的範圍內時,咱們認爲是成立的。
[3]計算使假設在置信範圍內成立的最大值是多少,好比根據上邊[1]中的假設,要使泛化錯誤率不大於0.3成立,即泛化錯誤率小於0.3的機率大於(1-a)。要計算這個,咱們要算出要使錯誤率大於0.3的機率之和小於a時的最大泛化錯誤率是多少。
[4]比較計算出的知足假設的最大值和咱們實際計算出的值,若是咱們實際計算出來的錯誤率已經大於最大可能的錯誤率了,說明假設不成立。
[5]在這裏的假設中,假設不成立說明咱們的學習器錯誤率要大於0.3啊,這是個很爛的學習器,咱們還須要繼續調優。
在實際實驗時,咱們會屢次使用留出法或交叉驗證法進行屢次訓練/測試,那麼咱們實際上會獲得多個測試錯誤率(這裏假設爲k個)。咱們能夠經過求這些錯誤率的平均和方差來將假設檢驗轉換爲自由度爲k-1的 t 分佈。經過查詢 t 檢驗經常使用臨界表能夠很方便的計算出假設是否成立。
對學習算法除了經過實驗估計其泛化性能,咱們還須要理解「爲何」具備這樣的性能,「誤差與方差分解」(bias-variance decomposition)是解釋學習算法泛化性能的一種重要工具。
泛化偏差可分解爲誤差、方差和噪音之和。
誤差度量了學習算法的指望預測與真實結果的偏離程度,即刻畫了學習算法自己的擬合能力;方差度量了一樣大小的訓練集的變更所致使的學習性能的變化,即刻畫了數據擾動所形成的影響;噪聲則表達了在當前任務上任何學習算法所能達到的指望泛化偏差的下界,即刻畫了學習問題自己的難度。
誤差-方差分解說明,泛化性能是由學習算法的能力、數據的充分性以及學習任務自己的難度所共同決定的。
通常來講,誤差與方差是有衝突的。給定學習任務,假定咱們能控制學習算法的訓練程度,則在訓練不足時,學習器的擬合能力不夠強,訓練數據的擾動不足以使學習器產生顯著變化,此時誤差主導了泛化錯誤率;隨着訓練程度的加深,學習器的擬合能力逐漸加強,訓練數據的擾動漸漸能被學習器學到,方差逐漸主導了泛化錯誤率;在訓練程度充足後,學習器的擬合能力已很是強,訓練數據發生的輕微的擾動都會致使學習器發生顯著變化,若訓練數據自身的、非全局的特性被學習器學到了,則將發生過擬合。
泛化偏差沒法得到,經驗偏差由於過擬合的存在而不適合做爲標準,致使咱們須要專門的模型評估方法來測量學習器的效果
專門的模型評估方法是經過從數據集中選取一部分數據做爲測試集來對訓練出的模型進行驗證,以測試偏差來近似泛化偏差實現的
測試偏差體如今具體的性能度量指標上,咱們要根據具體狀況選擇對應的指標
假設檢驗是咱們對學習器性能進行比較的有效方法
泛化性能是由學習算法的能力、數據的充分性以及學習任務自己的難度所共同決定的
(額外閱讀)數據比算法要更重要的一個例子:對一批數據使用高明的算法,比不上用普通算法可是引入一部分外部數據源的效果要好( http://anand.typepad.com/datawocky/2008/03/more-data-usual.html )
具體的章節思路請參考下圖理解: