1. 程式人生 > >機器學習 | 吳恩達機器學習第六週學習筆記

機器學習 | 吳恩達機器學習第六週學習筆記

課程視訊連結

第六週PPT  下載密碼:zgkq

本週主要講解了如何設計機器學習系統和如何改進機器學習系統,包括一些模型選擇的方法,模型效能的評價指標,模型改進的方法等。

目錄

一、應用機器學習建議

1.決定下一步做什麼

2.評估假設函式

3.模型選擇和訓練、驗證、測試集

4.診斷偏差與方差

5.正則化和偏差、方差

6.學習曲線

7.決定接下來做什麼

二、機器學習系統設計

1.確定執行的優先順序

2.誤差分析

3.不對稱性分類的誤差評估

4.查準率和召回率的權衡

5.機器學習資料

三、程式設計作業


一、應用機器學習建議

1.決定下一步做什麼

當你正在開發一個機器學習系統或者想改進機器學習系統的效能時,下一步需要做什麼,接下來以線性迴歸預測房價的例子進行具體說明:

假設你用如下的線性迴歸代價函式通過訓練已經得到了一組最優的引數,但是對於一些新樣本,模型的預測效果並不是很好。

此時,你可以從以下幾個方面進行嘗試,以改進模型效能:

  • 收集更多的訓練樣本(比較耗時,在特定情況下有用)
  • 嘗試使用更少的特徵(當原始輸入特徵比較多時,可以從中選擇一部分特徵進行訓練,緩解過擬合)
  • 增加更多的特徵(通過收集一些新的特徵,比如原始房價資料集只有面積一個特徵,可以通過一些渠道,收集一些其他影響房價的特徵,如臥室數目,地理位置等等,耗時,不建議使用)
  • 增加多項式特徵(在原始輸入特徵的基礎上,通過對這些特徵進行組合,獲取一些新的特徵,如x_{1}x_{2},x_{1}^{2},x_{2}^{2}...
  • 嘗試減小正則化懲罰係數\lambda
  • 嘗試增大正則化懲罰係數\lambda

上述提及的這些建議並非全都有意義,接下來我們將學習一些機器學習診斷法,通過它來得到什麼樣的嘗試對於改進模型效能是有意義的。

2.評估假設函式

當我們訓練一個機器學習模型時,我們總期望預測值(假設函式的輸出值)和真實值之間的誤差越小越好,但這並不是一種好的做法,這樣很容易產生過擬合。在訓練集上無比精確,但是對於新樣本卻不靈了,泛化能力很差。

那我們該如何評價訓練得到的假設函式呢?接下來以房價預測的例子進行演示:

當我們的原始輸入特徵只有面積時,通過增加多項式特徵,我們訓練得到了如下的假設函式:

這種情況下,我們可以通過視覺化擬合的效果,來判斷是否發生過擬合。但是這種方法,並不是通用的。

當我們的原始輸入特徵非常多時,假設有100個,此時是無法通過視覺化的方法來判斷是否發生過擬合的。我們需要使用一種評價假設函式的標準方法。

  • 評價假設函式的標準方法

首先對原始的訓練樣本進行隨機打亂,然後將其按比例分割為新的訓練集和測試集,一般來說新的訓練集佔70%,測試集佔30%。

對於線性迴歸:

首先通過新的訓練集進行訓練,最小化代價函式,得到一組最優的引數\Theta

然後使用訓練得到的\Theta在測試集上計算誤差:

對於邏輯迴歸:

類似的,首先通過新的訓練集進行訓練,最小化代價函式,得到一組最優的引數\Theta

然後使用訓練得到的\Theta在測試集上計算誤差:

不過對於分類問題,更常用的一種誤差度量是0/1錯誤分類度量:

3.模型選擇和訓練、驗證、測試集

正則化懲罰項係數\lambda的選擇;增加多項式特徵時,多項式的次數等這類問題,成為模型選擇問題。

當模型確定時,可以使用上一小節的方法;對於模型選擇問題,我們不能再像上一小節講的那樣,簡單的把原始訓練集分為新的資料集和測試集,而是應該把原始訓練集分為3部分:新的訓練集、驗證集和測試集。

結下來還是通過預測房價的例子進行演示,假設輸入特徵只有面積,如果只使用這一個原始輸入特徵,擬合效果是很不理想的。這種情況下,我們一般通過增加多項式特徵,再進行擬合。但是問題在於多項式特徵的次數該怎麼選?即應該選擇一個怎麼樣的模型(假設).

根據之前講的內容,我們可以這樣做:

首先把所有可能的假設羅列出來,上圖中的引數d代表多項式的次數。

然後對原始訓練集進行分割,分為新的訓練集和測試集,對這些假設分別在新訓練集上進行訓練,通過最小化訓練集的代價,求得一組最優的引數,\Theta ^{(1)} - \Theta ^{(10)}.

最後將\Theta ^{(1)} - \Theta ^{(10)}分別帶入測試集,計算測試誤差,選擇使測試誤差最小的那組引數所對應的假設,作為最好的假設。並把這個最小的測試誤差作為泛化誤差。

但是這樣做其實是不公平的,相當於你用測試集擬合了一個新的引數d,通過測試集來選擇模型,又用該模型在測試集上計算泛化誤差。這並不是一種好的做法。

 

對於這種模型選擇問題,更科學的做法是,把原始訓練集按比例分為新的訓練集(60%),驗證集(交叉驗證集20%),測試集(20%)三部分:

訓練、驗證和測試集誤差的計算:

對於模型選擇問題,可以這樣做:

首先把所有可能的假設羅列出來,上圖中的引數d代表多項式的次數。

然後對這些假設分別在新訓練集上進行訓練,通過最小化訓練集的代價,求得一組最優的引數,\Theta ^{(1)} - \Theta ^{(10)}.

接著將\Theta ^{(1)} - \Theta ^{(10)}分別帶入驗證集,計算驗證誤差,選擇使驗證誤差最小的那組引數所對應的假設,作為最好的假設。比如,當d=4時,驗證誤差最小,此時我們的假設函式就是:

最後,將\Theta ^{(4)}帶入測試誤差公式,得到測試誤差,作為泛化誤差,來評估該假設的效果。

綜上,對於模型選擇問題,用驗證集選擇模型,用測試集計算泛化誤差,評估效能。

 

4.診斷偏差與方差

我們需要對機器學習模型進行判斷,到底是高偏差還是高方差,以此來採用相應的改進措施。

高偏差和高方差

之前的課程中提到過,圖1屬於高偏差也就是欠擬合;圖3屬於高方差也就是過擬合。

對於不同的模型選擇,首先訓練得到一組引數,然後帶入訓練/驗證誤差的公式,得到訓練/驗證誤差,並繪圖,從而判斷高偏差/方差。

  • 上圖的橫座標是假設函式多項式次數,也就是不同的模型選擇

  • 縱軸代表該假設下的誤差

  • 圖中的兩條曲線分別代表訓練誤差曲線和驗證誤差曲線

  • 可以發現,當多項式次數比較低,模型的訓練誤差和驗證誤差都很大;隨著次數的提升,訓練誤差不斷減小,驗證誤差則是先減小後增大,驗證誤差最小的點對應最佳模型選擇。

  • 高偏差(欠擬合):訓練誤差和驗證誤差都很大,圖中剛開始的那一部分;

  • 高方差(過擬合):訓練誤差很小,而驗證誤差很大,圖中最後的那一部分。

 

5.正則化和偏差、方差

從正則化的角度來看偏差和方差,之前課程的實驗也做過,當我們選擇不同的懲罰係數\lambda時,模型效果是會有顯著的差異。

考慮如下的線性迴歸模型,及其代價函式(正則化):

\lambda去不同值時,模型擬合效果如下:

圖1,\lambda取10000,值很大,訓練得到的引數都會非常接近0,假設函式將會是一個常數。此時為高偏差(欠擬合)。

圖3,\lambda取0,值很小,相當於不做正則化,模型在訓練集上的擬合效果會非常好,此時為高方差(過擬合)

圖2,\lambda取值適中。

 

接下來討論如何選擇一個合適的\lambda

h_{\Theta }(x)是線性迴歸的假設函式,J(\Theta )是帶正則化的線性迴歸代價函式,接下里分別是在訓練/驗證/測試集上計算誤差的公式。注意進行區分,之前我們沒有考慮正則化,所以代價函式和計算訓練誤差的公式是一樣的,現在由於加入了正則化所以對2者進行了區分。

注意先在訓練集上最小化代價函式,求的最優的一組引數。然後再用該引數在訓練/驗證/測試集上根據公式計算相應的誤差。

選擇\lambda值也是一種模型選擇問題,不同的\lambda對應不同的模型。和之前類似,我們一般通過嘗試一組\lambda值,選出最佳的。

這組\lambda一般從0開始,逐漸小幅度遞增,知道一個比較大的值,如上圖所示,每次*2遞增。

每個\lambda對應一個假設,然後對這些假設分別在訓練集上進行訓練,通過最小化訓練集的代價,求得一組最優的引數,\Theta ^{(1)} - \Theta ^{(12)}.

接著將\Theta ^{(1)} - \Theta ^{(12)}分別帶入驗證集,計算驗證誤差,選擇使驗證誤差最小的那組引數所對應的假設,作為最好的假設。比如,\Theta ^{(5)}對應的假設。

最後,將該\Theta ^{(5)}帶入測試誤差公式,得到測試誤差,作為泛化誤差,來評估該假設的效果。

綜上,對於模型選擇問題,用驗證集選擇模型,用測試集計算泛化誤差,評估效能。

 

通過繪圖的方式,檢視\lambda值與方差/偏差的關係:

橫軸代表不同的\lambda值,縱軸代表到誤差。圖中的曲線分別是訓練誤差和驗證誤差。

可以看到,隨著\lambda的增大,訓練誤差越來越大;驗證誤差則是先減小後增大,驗證誤差最小的點,就是最優取值。

\lambda值比較小時,容易發生過擬合,高方差;

\lambda值比較大時,容易發生欠擬合,高偏差;

6.學習曲線

學習曲線可以幫助我們判斷模型是高偏差還是高方差,非常重要。

學習曲線影象的橫軸是訓練樣本數量,縱軸是誤差,我們一般只畫模型在訓練集以及驗證集上的誤差曲線。

考慮下面這個例子,我們用2次函式擬合訓練樣本:

當樣本比較少時(m=1,2,3),訓練時可以做到完美擬合,所以此時的訓練誤差幾乎是0,但隨著訓練樣本的增加,模型要做到完美擬合就會變得越來越困難。所以隨著訓練樣本的增加,訓練誤差是不斷增大的。

而對於驗證誤差來說,少量樣本訓練的模型,泛化能力很差,所以樣本數比較少時,驗證誤差非常大;但隨著訓練樣本增加,將會擬合出比較合適的假設函式,模型的泛化能力會越來越好,相應的驗證誤差會隨訓練樣本增加,不斷減小。

反應在影象上,如下所示:

 

  • 高偏差情況下的學習曲線

用一個簡單的例子來說明:

當我們用直線擬合下圖所示的資料時,很顯然會出現高偏差的情況:

當樣本數比較少時,假設只有1個,模型的泛化能力會非常差,所以剛開始驗證誤差會很大;隨著訓練樣本的增加,模型的泛化能力會增強,驗證誤差會不斷減小;但是樣本增大到一定程度時,將會擬合出一條比較合適的直線,之後再增大樣本數量,直線幾乎不會變化,所以驗證誤差會趨於平緩。

對於訓練誤差,樣本比較少時,模擬擬合的會非常完美,此時訓練誤差會很小;但是隨著樣本數量的增加,上圖中的直線擬合會越來越困難,訓練誤差會越來越大;在高偏差的情況下,訓練誤差隨著樣本的增加,趨於平緩,接近驗證誤差。

綜上,高偏差情況下的學習曲線如下圖所示:

如果機器學習演算法有高偏差,增加更多的訓練樣本,不會有一個更好的效果。

特點:驗證誤差隨樣本增加不斷減小,並趨於平緩;訓練誤差隨樣本增加不斷增大,最後也趨於平緩;並且二者非常接近,交界處對應的誤差很大。

  • 高方差情況下的學習曲線

用一個簡單的例子來說明:

當我們用一個多項式次數非常高的假設函式來擬合下圖的訓練樣本,很顯然會出現高方差:

當訓練樣本比較少時,假設函式將會擬合的非常完美,訓練誤差幾乎為0;但隨著樣本的增多,擬合完美會越來越困難,因此訓練誤差會逐漸增大。

當訓練樣本比較少時,不可能很好的擬合這麼多模型引數,所以驗證誤差非常大;但隨著樣本增多,擬合效果會變好,模型的泛化能力也會提高,驗證誤差會隨樣本的增多而不斷減小。

綜上,高方差情況下的學習曲線如下所示:

如果機器學習演算法有高方差,增加更多的訓練樣本,可以改進演算法。

特點:驗證誤差隨樣本增加不斷減小;訓練誤差隨樣本增加不斷增大;但2者之間的間距比較大。

 

上述的學習曲線都非常理想,實際中可能還會有噪聲,波動等,但大體形狀差不多。繪製學習曲線,可以幫助我們判斷學習演算法是否出現了高方差/偏差。

 

7.決定接下來做什麼

回到第一小節的那個例子,再來看一下那幾個措施能解決的問題:

  • 收集更多的訓練樣本(可以修正高方差的情況,如果畫出學習曲線後,不是高方差,那麼這樣做是沒有意義的)
  • 嘗試使用更少的特徵(可以修正高方差的情況)
  • 增加更多的特徵(可以修正高偏差的情況,如果畫出學習曲線後,不是高偏差,那麼這樣做純屬浪費時間)
  • 增加多項式特徵(可以修正高偏差的情況)
  • 嘗試減小正則化懲罰係數\lambda(可以修正高偏差的情況)
  • 嘗試增大正則化懲罰係數\lambda(可以修正高方差的情況)

 

神經網路與過擬合:

左圖是一個小型神經網路,隱藏層少且隱藏層的神經元少;右圖是一個大型神經網路,隱藏層比較多或隱藏層的神經元比較多。

小型網路引數更少,計算量比較小,但容易出現欠擬合;大型網路引數非常多,計算量很大(這個問題並不大),主要容易出現過擬合。實踐證明,大型網路如果採取相應的防過擬合的手段,如正則化等等,效能將會比小型網路好非常多。

至於網路隱藏層數的選擇,預設是一層;當然如果有更好的層數設計,可以採用多層,一般每層的神經元數相同。也可以多嘗試一些層數,然後用之前講多的模型選擇方法,選一個最好的層數。

 

二、機器學習系統設計

1.確定執行的優先順序

以建立垃圾郵件分類器為例進行演示,這是一個監督學習的問題。

  • 用向量表示郵件

輸入變數x為郵件的特徵;輸出變數y是標籤,1代表是垃圾郵件,0代表不是。

我們可以人工選擇100個單詞作為字典,用一個100維的向量x來表示郵件。如果郵件中的單詞在字典中出現,則向量x對應位置的分量x_{j}=1,不考慮單詞出現的次數,僅用0/1表示,那麼就可以構建向量x來表示郵件內容,作為機器學習演算法的輸入。

實際上,我們不會人工選擇單詞構成字典,而是在訓練集中自動選擇出現頻率最高的n(10000-50000)個單詞構成字典,然後用一個n維的特徵向量來表示郵件。

  • 想辦法降低分類的錯誤率

收集更多的訓練資料,但之前有講過,這種方法並不總是有效,需要視情況而定。

為每個郵件構建更復雜的特徵,比如生成特徵時除了正文把郵件標題也考慮在內,一些垃圾郵件的特徵會體現在標題中。

為郵件正文構建更復雜的特徵,比如單詞的單複數,discount和discounts是否應該看成一個單詞;首字母大小、字尾,deal和Dealer是否應該看作一個單詞;是否應該考慮標點符號,可能垃圾郵件中歎號會比較多。

構建更復雜的演算法來檢測郵件中的錯誤拼寫,比如垃圾郵件傳送者經常把一些容易被檢測到的單詞寫錯,如m0rtgage,med1cine,w4tches等,從而避免被檢測到。

 

2.誤差分析

  • 建議方法

構建一個機器學習系統時,建議首先使用一個簡單的演算法快速實現,然後在驗證集上測試他的效能,再逐步改進。

畫出學習曲線,判斷是存在高偏差還是高方差,然後以此來決定是否增加更多的資料,或構建更多特徵。

誤差分析:檢查驗證集上分錯的樣本(包括把非垃圾郵件分類為垃圾郵件,垃圾郵件分類為非垃圾郵件),觀察這些分錯的樣本是否存在一些特徵或規律,以此發現模型優缺點,進而進行改進。

  • 誤差分析例子

假設驗證集有500個樣本,m_{cv}=500,分類器分錯了100個樣本,此時你可以人工檢查這100個錯誤:

首先分析這100個錯分樣本的型別,以及各自對應的數量,如下所示:

比如,關於賣藥的郵件有12封,賣假貨的郵件4封,釣魚的郵件53封,其他郵件31封;通過以上分析,我們可以把重點放在釣魚類的郵件上。

然後繼續對釣魚類的郵件進行分析,是否可以發現一些新的特徵,能夠使提高分類器的效能,比如這類郵件可能存在以下問題,並統計數量,如下所示:

比如,有5封郵件存在錯誤拼寫,以逃避檢測,但這個數量有些少,此時沒必要花費額外的時間,去設計演算法識別這個問題;但是有32封郵件存在一些不常用的標點,應該把關注重點放在這,設計一些包含標點的更復雜的特徵,以此來提高分類器效能。

  • 數值評估

在做垃圾郵件分類時,可能會遇到這種問題:

應不應該把discount,discounts,discounted,discounting看作是同一個單詞,即是否看成一個特徵。

在自然語言處理中會使用詞幹提取,在這種情況下,上述單詞會被看作是同一個。但是詞幹提取有利有弊,這種方法通常指關注前幾個字母,比如它可能會把universe/university看作一個單詞,這顯然不合理。

那麼我們到底要不要使用詞幹提取?這時我們可以使用數值評估的方法:

首先使用詞幹提取,訓練一個分類器,在驗證集上計算它的錯誤率;然後不使用詞幹提取,訓練一個分類器,在驗證集上計算它的錯誤率。二者進行比較,哪個錯誤率低,就使用哪種方法。

類似的這種問題,還包括是否應該區分單詞大小寫,如mom和Mom是否應該看作一個單詞,都可以使用上述數值評估的方法,選擇一個合理的做法。

 

  • 總結:

在開始一個機器學習問題時,首先快速實現一個簡單的演算法,儘管它的效果可能不太好;然後通過一些強有力的工具決定下一步做什麼,可以第一步通過誤差分析,來發現它出現了什麼錯誤,以此來進行優化;第二步,如果你已經實現了一個簡單的演算法,並有一個數值評價指標,可以以此來驗證你的一些想法,判斷它對演算法效能提高是否有幫助。這樣可以讓你儘快的確定你的演算法應該放棄什麼,包含什麼。

 

3.不對稱性分類的誤差評估

之前我們一直在使用正確率或錯誤率來評價一個模型的效能,但這個指標並不是通用的,比如偏斜類問題。

首先回顧一下之前提到過的癌症分類的例子:

假設訓練了一個邏輯迴歸模型h_{\Theta }(x)進行癌症分類,y=1代表患癌,y=0代表沒有癌症。在測試集上,發現僅有1%的錯誤率,按理說分類效果已經非常好了;但是實際上,病人中只有0.5%的人有癌症。那麼此時1%的錯誤率就顯得非常糟糕。

如果有一個程式他對於任何輸入,輸出都為0:

那麼他的錯誤率也就只有0.5%,但是它總是預測沒有癌症,那麼一旦一個病人有癌症,這個分類器造成的後果是非常嚴重的,儘管它的錯誤率非常低。

對於這種偏斜類問題,即正負樣本的比例懸殊,如患癌的概率是非常低的。此時用正確率或錯誤率來評價分類器就不再適用了。

  • 查準率和召回率

對於偏斜類問題,使用查準率和召回率作為模型誤差的評估指標。

y=1代表稀有類別。

 

查準率:被分成正例的示例中,實際為正例的比例,如所有我們預測為患癌的病人中有多少比例真正患癌。

召回率:實際為正例的示例中,被分成正例的比例,如所有患癌的病人中,有多少比例被正確的預測為患癌。

查準率或召回率高的模型,被認為是一個好的模型。如之前總是預測為0的模型,他的準確率很高,但他的召回率卻是0,所以他不是一個好模型。

 

4.查準率和召回率的權衡

查準率和召回率公式:

使用邏輯迴歸模型對癌症病人進行分類:

一般情況下,我們設定的分類閾值是0.5,對於這種偏斜類問題,我們可以從兩個角度進行考慮:

  • 首先,我們可能想只有在非常有把握的前提下,才會預測病人患癌。否則病人接受癌症治療會非常痛苦。此時,我們可能會把分類閾值設定為0.7或0.9,即只有超過70%或90%的概率,我們才認為病人患癌。這種情況下,我們稱模型具有高查準率、低召回率。
  • 另一個角度,我們希望不遺漏任何一個患癌的病人,因為一旦遺漏了,病人不接受治療,認為自己沒病,後果將非常嚴重。此時,我們可能把分類閾值設定為0.3,即只要有超過30%的概率,我們就認為病人患癌。這種情況下,我們稱模型具有低查準率、高召回率。

模型查準率和召回率的一般曲線(包含3種可能的曲線走向):

我們的問題是如何權衡模型的查準率和召回率,也就是如何設定一個合理的閾值:

  • F1 Score

下面是一些不同的查準率和召回率數值:

如果簡單對2者求平均的話,第三個數值將最高,但它卻不是一個好的模型,當Recall=1時,意味著模型為把所有的病人預測為患癌,這顯然是不對的。

所以,一般使用F1 Score來權衡查準和召回率:

F1 Score越高,模型效能越好:

 

5.機器學習資料

之前曾經告誡過大家,使用機器學習演算法時,不要盲目的收集大量訓練資料,因為大量的訓練資料只會在某些情況下有用。

但是實踐證明,在某種條件下,獲取大量的訓練資料會更好的得到一個性能良好的學習演算法:

如果你的學習演算法有很多引數,訓練資料的特徵非常充足(如果一個人類專家拿到這些特徵,能做出很好的判斷,證明特徵比較充足),這種情況下如果有大量的訓練資料,他的效能會非常好,如使用大型神經網路等。

 

三、程式設計作業