第十一章 應用機器學習的建議
該系列文章為,觀看 “吳恩達機器學習” 系列視訊的學習筆記。雖然每個視訊都很簡單,但不得不說每一句都非常的簡潔扼要,淺顯易懂。非常適合我這樣的小白入門。
本章含蓋
- 11.1 決定下一步做什麼
- 11.2 評估假設
- 11.3 模型選擇和訓練、驗證、測試集
- 11.4 診斷偏差與方差
- 11.5 正則化和偏差、方差
- 11.6 學習曲線
- 11.7 決定接下來做什麼
決定下一步做什麼
當你發現,你的假設函式在新的資料集上有很大的偏差時,你可以嘗試做些什麼了?

- 獲取更多的訓練樣本
- 嘗試使用更少的特徵集(:point_left:,防止過擬合)
- 嘗試使用更多的特徵
- 嘗試增加多項式特徵
- 嘗試減小 λ(正則化引數)
- 嘗試增大 λ(正則化引數)
:point_up_2:的方法,一般都是需要花費比較長的時間(如,6個月)才能看到改正後的效果到底是好的,還是壞的。也就是,你選擇的方法是對,的還是錯的。
通過“機器學習效能評估”和“機器學習診斷”能快速過濾掉至少一半(上面)的無用選項
機器學習診斷

診斷:這是一種測試法。你通過執行這種測試,能夠了解演算法在哪裡出了問題。這通常也能夠告訴你,要想改進一種演算法的效果,什麼樣的嘗試才是有意義的。
這些診斷的執行和實現是需要花些時間的。確實需要花很多時間來理解和實現。但這樣做的確是把時間用在了刀刃上。因為診斷法能讓你節省幾個月的時間,提早發現某些方式是無效的。
11.2 評估假設
過擬合:

怎麼樣判斷一個“假設函式”是否過擬合了?
1,如果特性引數很少的話,可以通過將假設函式畫出來,來判斷是否過擬合。
2,當特徵引數很多時,就無法通過畫圖(因為很難或者根本無法畫出這樣的圖)來判斷假設函式是否過擬合。那麼,我們就需要使用其他方法了。
評估“假設函式”的標準方法:

為了確保我們可以評估我們的假設函式,我們要做的是,將我們的訓練樣本分成兩份。第一部分成為我們的訓練集;第二部分成為我們的測試集。
將所有的資料分成:訓練集和測試集。其中一種典型的分割方法是,按照 7 :3 的比例。70% 為訓練集;30% 為測試集。
注意,因為:point_up_2:我們選擇了前70%的資料為訓練集,後30%的資料為測試集。因此如果這組資料有某種規則或順序的話,那麼最好是隨機選擇70%和30%的資料。(即,保證“訓練集”和“測試集”的隨機性和一致性)
-
:point_down:展示了一種典型的方法,來訓練和測試你的學習演算法。比如,線性迴歸演算法
首先,你需要對訓練集進行學習得到引數 θ 。具體來講,就是最小化訓練誤差J(θ)。
接下來,計算測試誤差。我們將從訓練集中學習得到的引數 θ,放在J_test(θ),來計算你的測試誤差。
當然,:point_up_2:這個是我們使用線性迴歸和平方誤差標準時,測試誤差的定義。
那麼如果考慮分類問題,比如,使用邏輯迴歸的時候

訓練和測試邏輯迴歸的步驟與前面(線性迴歸)所說的非常類似。
首先,我們要從訓練資料,也就是70%的資料中,學習得到引數 θ。
然後用:point_down:的方式計算測試誤差

除了 J_test(θ),還有另一種形式的測試度量,可能更易於理解,叫做“錯誤分類”,也被稱為“0/1分類錯誤(0:分類正確;1:分類錯誤)”
err(h_(θ), y) :point_left:關於假設函式(即,h_(θ))和標籤y的誤差。
然後我們就能應用“錯誤分類”誤差來定義“測試誤差”,即:
對於每一個測試集(m_test)例項,計算:

然後對計算結果求平均。即,

:point_up_2:,這實際上就是我的假設函式誤標記的部分在測試集中的比率(誤分類的比率)。
:point_up_2:,這也就是使用“0/1錯誤分類度量”來定義的測試誤差。
11.3 模型選擇和訓練、驗證、測試集
如果你想要確定對於一個數據集,最合適的多項式次數,怎樣選用正確的特徵,來構造學習演算法。或者你需要選擇學習演算法中的正則化引數 λ ,我們應該怎麼做。
:point_up_2:這類問題被叫做“模型選擇問題”。
我們不再是將資料分為“訓練集”和“測試集”。而是將資料分為三個資料組:訓練集、測試集、驗證集。
該視訊會介紹如何將資料分為這三個資料組,以及這三個資料組的含義,同時告訴我們如何使用這些資料組進行模型選擇。

:point_up_2:過擬合。一個假設函式在訓練集的誤差很小,並不能說明在新資料上的泛化能力好。
下面我們來考慮模型選擇問題。
假如,你現在要選擇能最好擬合數據的多項式次數。
你應該選擇一次函式、二次函式、三次函式等等中的哪一個了?

d:表示你該選擇的多項式次數。
所以,除了引數 θ,還有引數 d 需要你要資料集來確定。
第一步:使用“訓練集”擬合引數 θ
首先,選擇第一個模型,然後最小化訓練誤差。這樣你會得到一個引數向量 θ^(1)。
然後,你再選擇第二個模型,用它擬合你的訓練集,這樣就得到另一個引數向量 θ^(2)。
以此類推。。。
第二步:使用“測試集”/“驗證集”擬合引數 d
然後,對所有這些模型求出“測試集誤差”。即,J^ (θ^(i))_test
接下來,為了從這些模型中選出最好的一個。我們應該看哪個模型有最小的“測試誤差”。選擇那個有最小誤差的模型。
比如,此處選擇了’第五個模型’,即,5次多項式函式擬合的模型。
第三步:
驗證所選出模型的泛化能力。即,使用“驗證集誤差”來進行泛化能力評估。J^ (θ^(i))_cv
第二步和第三步的集合可互換使用,因為,典型分配模式下,它們的樣本個數是一樣的。
引數向量 θ^(i) :表示,用 i 次多項式函式擬合數據得到的引數向量。

交叉驗證(驗證集),簡稱“cv”(cross validation set)。
“訓練集” :“交叉驗證” :“測試集” 典型的分配比例為:60% :20% :20%。這個比例值可以稍微調整,但這種分法是最典型的比例。
:point_down:“訓練誤差”、“交叉驗證誤差”、“測試誤差”

串起來:

注意:對於你有一個很大很大的訓練集時,你使用相同的訓練集進行引數的擬合,以及泛化能力的評估,可能沒有多大的問題。但如果你沒有很大很大的資料集,就應該使用:point_up_2:說的方法,將資料集分為“訓練集”、“交叉驗證”、“測試集”來分別進行引數的擬合,和泛化能力的評估。
11.4 診斷偏差與方差
當你執行一個學習演算法時,如果這個演算法的表現不理想,那麼多半是出現兩種情況:
① 要麼是偏差比較大
② 要麼就是方差比較大
換句話說,要麼就是欠擬合問題,要麼是過擬合問題。
這種情況下,搞清楚是‘偏差問題’還是’方差問題’,或者兩者都有關,這一點很重要。
“偏差”和“方差”的概念
假設你正在構建一個貓咪識別器。目前,你的訓練集錯誤率為15%,並且你的開發集錯誤率為16%。
那麼,演算法在訓練集上的錯誤率。在本例中,它是15%。我們非正式的認為這是演算法的偏差(bias)。
其次,演算法在開發(或測試)集上比訓練集差多少。在本例中,開發集比訓練集差1%。我們非正式的認為這是演算法的方差(Variance)。即,方差 = 開發集/訓練集的錯誤率 - 測試集的錯誤率
因為搞清楚是哪一點的問題,就能很快找到有效的方法和途徑來改進演算法。


橫座標:多項式次數,即,引數 d
隨著多項式次數的增大,訓練誤差越來越小。
交叉驗證誤差 和 測試集誤差 類似
具體來說,假設你得到了一個學習演算法。而這個並沒有表現的像你期望的那樣好。如果你的 交叉驗證誤差 或者 測試集誤差 都很大,我們怎麼判斷,此時的學習演算法出現了高偏差的問題,還是高方差的問題?
交叉驗證誤差很大的情況出現在’凹行曲線’的兩端。左邊一端對應的是“高偏差問題(即,欠擬合問題)”,表示使用了一個過於小的多項式次數,而實際上,我們需要一個較高的多項式次數來擬合數據。
相反地,右邊一端對應的是“高方差問題(即,過擬合問題)”。
具體來說,
相對於’高偏差(欠擬合)的情況’:我們發現,“交叉驗證誤差”和“訓練集誤差”都會很大
反過來,如果你的演算法有“高方差(過擬合)問題”:你會發現,“訓練集誤差”很小,但是“交叉驗證誤差”遠遠大與“訓練集誤差”。

11.5 正則化和偏差、方差

當我們對高階多項式進行擬合的時候,為了防止過擬合,我們會在代價函式中加入正則化項,來讓引數的值儘可能小
那麼如何自動的選擇一個最合適的正則化引數 λ 的值呢?(類似於“多項式”的選擇)

:point_down:這就是我們自動選擇正則化引數 λ 的方法。

通常我的做法是,選取一系列我想要嘗試的 λ 值。因此,首先我可能考慮不是用正則化,以及一些列我可能會試的值。
通常,我一般將 步長 設定為 2倍速度增長,直到一個比較大的值。
:point_up_2:我們用交叉驗證集來擬合引數,使用測試集來評估 h(θ) 的泛化能力。

11.6 學習曲線
使用學習曲線來判斷一個學習演算法是否處於偏差、方差問題,或者二者都有
為了繪製學習曲線,我們通常先繪製 J_train 或 J_vc

訓練集的樣本是個常數,一般很大。我們使用小部分訓練樣本來繪製圖即可。如,如果有100個訓練樣本,我們使用30、40個樣本來繪製圖即可。
當 m 很小時,訓練誤差很小。反過來,當 m 值逐漸增大,訓練誤差就會越來越大。
當我們的假設函式 h(θ) 出現高偏差問題時的學習曲線:

當 m 足夠大時,你就會找到條最有可能擬合數據的那條直線。並且,此時,即便你繼續增大訓練集的樣本容量,還是會得到一條差不多的直線。因此交叉驗證集誤差將會變為水平而不再變化,只要達到或超過一定數量的訓練樣本。
而訓練集誤差的情況是,一開始樣本極少的時候,可以很好的擬合數據,但是隨著樣本的增加,你會發現訓練集誤差會逐漸增大,最後接近交叉驗證誤差。
最後補充一點,高偏差的學習曲線,可能有很高的交叉驗證誤差和訓練集誤差(即,縱軸值很大),也就是說,最終你會得到一個值比較大的 J_cv 和 J_train。
如果一個學習演算法有高偏差,選用更多的訓練樣集資料對於改善演算法表現並無幫助。
:point_up_2:這個特徵,對於我們判斷我們的學習演算法是否處於‘高偏差’情況,很重要。
當演算法處於’高方差’時的學習曲線:

演算法處於’高方差’的一個很明顯的特徵:訓練集誤差和交叉驗證誤差之間有一段很大的距離。
如果我們增大訓練集的樣本數,‘訓練集誤差’ 和 ‘交叉驗證誤差’ 這兩條學習曲線則會互相靠近。也就是,隨著訓練集樣本數的增大,’訓練集誤差’會不斷增大,而‘交叉驗證誤差’會不斷減小(這同‘高偏差’的情況是不一樣的,‘高偏差’情況,隨著訓練樣本數的增加,’訓練集誤差’和‘交叉驗證誤差’會變為水平而不再變化)。
因此,在’高方差’情況下,使用更多的訓練樣本對改進演算法表現是有幫助的。
11.7 決定接下來做什麼

-
獲取更多的訓練樣本
解決“高方差”問題
-
嘗試使用更少的特徵集(:point_left:,防止過擬合)
解決“高方差”問題
-
嘗試使用更多的特徵
並非一定,通常使用來解決“高偏差”問題的一個方法
-
嘗試增加多項式特徵
這是另一種修正“高偏差”問題的方式
-
嘗試減小 λ(正則化引數)
可以修正“高偏差”問題
-
嘗試增大 λ(正則化引數)
修改“高方差”問題。
如何為神經網路選擇結構,或連線形式

當你在進行神經網路擬合的時候,你可以選擇一種相對比較簡單的神經網路模型:隱藏層單元較少,甚至只有一個隱藏層,並且只有少量的隱藏單元。像這樣的一個簡單神經網路,引數就不會很多,容易出現欠擬合。
這種比較小型的神經網路的最大優勢,在於計算量較小。
與之相對的另一種情況是,擬合較大型的神經網路結構。比如,每一層中有很多的隱藏單元,或者有很多隱藏層。這種比較複雜的神經網路,引數一般較多,更容易出現過擬合。這種結構的一大劣勢,也許不是主要的劣勢,但還是需要考慮的,那就是當網路有大量神經元時,這種結構會有很大的計算量。
雖然有這個情況,但通常來講這不是問題。這種大型的網路結構,最主要的潛在問題,還是它更容易出現過擬合現象。
事實上,如果你經常應用神經網路,特別是大型神經網路的話,你就會發現越大型的網路效能越好,但如果發生了過擬合,你可以使用正則化的方法來修正。
一般來說,使用一個大型的網路神經,並使用正則化來修正過擬合問題,通常比使用一個小型的網路效果更好,但主要可能出現的一個問題,就是計算量相對較大。
最後,你還需要選擇,所需的隱藏層的層數。通常來說,使用一個隱藏層是比較合理的預設選項。但如果你想要選擇一個最合適的隱藏層層數,你也可以試試,把資料分割成訓練集、驗證集和測試集。然後訓練一個隱藏層的神經網路,然後試試兩個、三個隱藏層,然後看看哪個神經網路在交叉驗證集上表現得最理想。