1. 程式人生 > >用大白話講講幾個機器學習中的重要概念

用大白話講講幾個機器學習中的重要概念

這次的文章是對於周志華所著的《機器學習》一書第二章模型評估與選擇的讀書筆記,還是以問答的形式儘量通俗地對一些基本的概念作一個總結。

一 在模型訓練中常常會過擬合,能不能跟一個小白講講什麼是過擬合?
先來看看官方原話是怎麼說的:當學習器把訓練樣本覺得‘太好了’的時候,很可能已經把訓練樣本自身的一些特點當作了所有潛在樣本都會具有的一般性質,這樣就會導致泛化能力的下降,這就是所謂的過擬合。
哎,說得人云裡霧裡的,一大堆的專業詞彙,好多人就是這樣從入門到放棄的…
現在我通過一個膚淺的例子用大白話來講一下下:現有一個任務,判斷一個女孩算不算得上美女。我就開始想了,貌似面板白,大眼睛的就會被稱為美女啊,因為我從小到大看到的美女都有這幾個特徵哎,而且周圍的人也說我的審美眼光不差哎。那麼漸漸地,我把這幾個特徵當作了判斷美女的準則。可是有一天我去了非洲,咦,怎麼個個都黑不溜秋的,可是仔細瞧瞧,分明也有很多看著很順眼的啊。我之前的判斷準則貌似失效了,不知道該怎麼判斷一個女孩差還是醜了。這就是產生了過擬合現象。‘我在國內見到的女生’對應‘訓練樣本’,而‘我在國外見到的女生’是‘測試樣本’,因為之前一直只見過國內的美女,也有一套準確率很高的判斷標準,所以把國內評判美女的標準普遍到了全球的標準,直到看到外國的女生,才發現之前的判斷標準不太準了。
總結一下,因為見過的太少,所以經驗有限,一旦走到外面的世界,才發現自己的認知水平還是遠遠不夠。

二 那麼,可以防止擬合嗎?
必須說明,過擬合是無法避免的。
用官方的話來解釋:因為機器學習面臨的通常是NP難甚至更難,而有效的學習演算法必然是在多項式時間內執行完成,若徹底避免過擬合,則通過經驗誤差最小化就能獲得最優解,這就意味著我們構造性地證明了P=NP, 因此,只要相信P不等於NP, 過擬合就不可避免!
什麼鬼,什麼P不P的,讀了十遍,還是沒明白。讓我用一句大白話解釋一下下:就是因為不可能通過有限的經驗去完全推測一個無限的世界啊!(在這裡感嘆一句,生而為人,往往無不在枷索當中!)

三 那總可以減弱過擬合吧,應該咋辦呢?
確實,我們只能夠減弱過擬合現象。
大概可以從兩個角度出發:
從樣本的角度:增大樣本量,既然你見的太少,那就多走出去看看外面的世界啊!
從模型的角度:讓模型變得簡單些,既然你的準則不能放之四海而皆準,那你就不要那麼固執,把自己的準則放寬鬆些嘛!

四 還有個問題,什麼又是欠擬合呢?
這種情況是指尚未對訓練樣本的一般性質學好。
簡單地說,就是:一屋不掃,何以掃天下。自己手頭上的東西都還沒掌握好,就先不急著出門見世界了。

五 那模型訓練過程中應當怎麼做評估呢?
官方原答案:我們可通過實驗測試來對模型的泛化誤差進行評估並進而做出選擇,為此,需要使用一個測試集來測試模型對新樣本的判別能力,然後以測試集上的測試誤差作為泛化誤差的近似。需要注意的是,測試集應該儘可能與訓練集互斥。
舉個大家喜聞樂見的例子:在高考之前我們是不是要經過大大小小的測驗?那在還沒有高考之前,我們暫且用的是平時測驗的成績,來評估自己大概能在高考中考個什麼樣的大學吧。而這些測驗,最好是我們平時沒有做過的題,為什麼呢,因為高考題都是我們平時沒見過的,這樣的評估才可靠些。

六 能說說在具體實踐中都有哪些評估操作流程?
常見的做法有:留一法,交叉驗證法,自助法(有放回取樣法)
一般在實踐中我常常用10折交叉驗證法,下面詳細講講這個方法:
我們把訓練集劃分為10個大小相同的互斥子集,每個子集儘可能保持資料分佈的一致性,然後每次拿其中9個子集作為訓練集,餘下的那個作為測試集,一共做10次這樣的操作,這樣每個子集都被當作測試集使用過。最終返回的是這10次測試的均值作為結果。
還是舉個例子:現在有一個任務,有個10名小學生的班級,給你10套難度類似的題,怎麼樣評估這班級總的學習能力呢?用10折交叉法,就是讓每個小學生做9套題,再測試1 套題,而且每個小學生測試的那套題都不一樣,最後取所有學生的測試結果來評估這個班級的學習能力。

七 有了可靠可行的實驗估計方法,我們用什麼指標來評價這個模型好不好使呢?
這就是效能度量的問題了。
炸一想,這個問題很簡單啊,如果是判斷美女的話看看判斷對了幾個就行啦,如果是做題的話看看得了幾分就行啦。其實事實沒有這麼簡單。
事實上模型的好壞是相對的,使用不同的效能度量往往會導致不同的評判結果,什麼樣的模型是好的,不僅取決於演算法和資料,還決定於任務需求。
以上的話有些抽像,在這裡我先來說說一個現象當作引子:
中國的法律是‘有罪推斷’,如果一個人被列為犯罪嫌疑人了,基本上大家也都認定這是個罪犯了;而美國的法律是‘無罪推斷’,就算是犯罪嫌疑人,在沒有找到確切的證據之前,我們不能把這個人當作罪犯來看待。大家來想想,這兩者的區別是什麼?前者傾向於‘決不姑息一個壞人’,後者傾向於‘決不冤枉一個好人’。這又是為什麼呢?個人認為,中國是集體主義,以大局為重,放走一個壞人會危害社會,美國是個人主義,從犯罪嫌疑人的角度來考慮,如果是錯判,那這個人的一生基本上就毀了。
(集體主義和個人主義,又可以追溯到中國的農耕文明,需要穩定和結盟以及西方的海洋文明,嚮往冒險和自由。題文無關,便不再多述。對了,推薦一部電影《12怒漢》,比較的就是以上所述的兩種不同態度,中國版的也有。)
簡言之,關注的點不一樣,評價指標也就不一樣了。
這裡列舉一些常見的評價指標:均方誤差,錯誤率,精度,準確率,召回率,F1, ROC, AUC, 代價敏感錯誤率和代價曲線。這些指標的具體演算法網路上有很多介紹,便不再一一描述了。(主要還是因為自己黔驢技窮,想不出那麼多例子來解釋了…)

八 有了實驗評估方法和效能度量,那怎麼做效能比較呢?
是直接取效能度量值然後比大小嗎?事情沒有想象中的那麼簡單。
官方解釋:首先,我們希望比較的是泛化效能,然而能過實驗評估方法我們獲得的是測試集上的效能,兩者的對比結果可能未必相同;第二,測試集上的效能與測試集本身的選擇有很大關係,且不論使用不同大小的測試集會得到不同的結果,即使使用想同大小的測試集,若包含的測試樣例不同,測試結果也會不同;第三,很多機器學習演算法本身有一定的隨機性,即便使用相同的引數設定在同一個測試集上多次執行,其結果也會有不同。
通常是基於統計假設檢驗,有交叉驗證t檢驗,McNemar檢驗,Friedman檢驗和Nemenyi後續檢驗。(這些東西還沒有理解透徹,不知道怎麼通俗地說,等之後再補上吧)

九 什麼是方差-偏差窘境呢?
根據一系列的公式可推出,泛化誤差可分解為偏差,方差與噪聲之和。
偏差刻畫的是演算法本身的學習能力,期望預測和真實結果的偏離程度。
方差刻畫的是資料擾動造成的影響,即同樣大小的訓練集的變動導致的學習效能的變化。
噪聲則表示了當前任務下任何演算法所能達到的期望泛化誤差的下界,代表問題本身的難度。
一般來說,偏差與方差是有衝突的。若訓練不足,學習器的擬合能力不夠強,偏差很大,訓練資料的振動不足以使學習器發生顯著變化,即方差很小;若訓練程度充足,擬合能力很強,偏差減小,則訓練資料發生的輕微振動就會導致學習器發生顯著變化,即方差很大。我們需要在這兩者間做一個平衡。
還是舉個大家喜聞樂見的小學生做題的例子:小學生做的題量還不夠多,學習能力不好,即偏差大,老師隨便拿了幾套試卷來做測試,最後結果都差不多地差,即學習效能很穩定,方差很小;後來這個小學生被家長罵了後幡然醒悟,開始瘋狂做題,過了幾天,老師又隨便拿了幾套卷子來做測驗,咦,數學這麼好,英語那麼差,原來小學生之前一直在做數學題呢,所以在不同的卷子上成績差別很大,這就是所謂的偏科,即方差很大。(可能拿這個例子並不是十分恰當,畢竟小學生的課程數量是有限的,可以在各個課程上面下功夫,來應對老師出的各種卷子。但是在更復雜的生活中,根本無法預測人生會給我們出一張什麼樣的卷子。)

這次的筆記先記到這裡,如果有什麼錯誤勞煩指出。