改進自己的機器學習算法系統
當我們初步求出了一個機器學習算法以後,我們希望這個算法的預測或者分類能力是很好的,能夠對我們的每一個新的數據做出合理的判斷。但是我們實際發現這個算法的錯誤率其實很高,這個時候我們應該怎麼去做,怎麼做能夠更省力更有效更具有針對性? 這就是week6 要解決的問題。
我們很容易就想到的方法有這些:
1.增加訓練數據
2.減少特徵
3.增加特徵
4.增加多項式特徵
5.減小
6.增加
但是這些方法到底有沒有用,或者說,在什麼情況下有用,這就是值得去探討的問題
那我們需要做的其實是三件事情:
1. 評估一個學習出來的算法
2. 判斷一個表現不太好的學習算法是出了什麼問題?high bias(欠擬合)還是high variance(過擬合)的問題
2.1 model selection
- 2.1.1 degree of polynomial
- 2.1.2 bias vs variance
- 2.1.3 regularize parameter
2.2 learning curve
3. 如何更有效更有針對性地怎麼去改善學習算法
1. 怎麼樣去評估一個已有的算法——>劃分數據集
要去評價評估學習到的算法時,很重要的一部分就是要有能夠檢驗的數據,以估計算法的泛化能力。在實際訓練中,如果把所有的數據全部都當作是訓練數據,固然可以得到擬合效果比較好的學習算法,但是我們並不知道這個算法對新的數據的估計情況。在現有的條件下,我們不妨將現有的數據分成兩部分,一部分用來訓練(70%),一部分用來驗證(30%)。通過訓練數據來訓練參數向量,通過驗證數據來評價學習到的算法。於是,我們就有一般過程如下:
a. 訓練
b. 計算測試集誤差
在不同的情形下,
線性迴歸:
邏輯迴歸:
2. 判斷欠擬合還是過擬合
做完評估以後,我們接着就可以通過“Learning Curve”的判斷方式來判斷我們的算法究竟是high bias 還是high cvariance 或者兩者皆有的問題。其中,high bais就是欠擬合,high variance就是過擬合。
但是我們在考慮learning curve以前,我們需要先做一個工作,model selection。model selection的目的主要是有個:1.引入交叉驗證集的概念。2.解釋清楚high bias和 high variance這兩個概念 3.闡述清楚如何去選擇一個更合適的模型,也就是如何確定更合適的參數d,λ,即搞清楚d,λ和bias,variance之間的關係。
理清一下:我們接下來講清楚兩個內容:1.model selection 2.learning curve
2.1 我們解決模型選擇的問題。
模型選擇主要設計到兩個過程和三個參數:1. 多項式次數d 2. 正則化係數λ 3. 特徵Θ
2.1.1 這裏引入cross validation set並且解釋清楚第一個過程:如何選擇d
做模型選擇的時候,我們首先要做的事情是確定degree of polynomial。增加一個新的參數
一般步驟如下:
a. k個d訓練
b. 在驗證集上確定
c. 在測試集上估計泛化的能力,也就是
以上是關於d的選擇思想。我們輸入不同的d,最後得到一個d
2.1.2 接下來我們來解釋清楚high bias和high variance這兩個概念
我們的test error 是由bias² 和variance組成
bias是迴歸值的期望與實際值之間的差距
variance是迴歸曲線的波動程度
具體的數學過程這裏不多敘述。
這裏重點其實是在於我們怎麼去區分這兩類不同的情況:
區分bias和variance其實是要從
2.1.3 最後我們來考慮第二個過程:λ的選擇
λ的選擇,也是通過類似選擇d的方式來進行。
a. 選擇k個λ,然後分別計算使得
b. 代入
c. 代入計算
d vs λ | 同 | 異 |
---|---|---|
目的 | 都要求一個合適的參數 | |
輸入 | 都是要進行比較的多個參數(不妨設k) | |
過程1 | 訓練k個使得 |
求λ時,θ的訓練要用帶有正則化項(懲罰項)的 |
中間輸出 | ||
過程2 | ||
最終輸出 | 要求的參數d或者λ,並且記錄對應的θ,便於計算 |
最後我們總結一下d,λ和high bias,high variance以及error之間的關係。
在欠擬合的情況下,degree小,λ大 這個時候
Jtrain≈Jcv ,並且都很大在過擬合的情況下,degree大,λ小,這個時候
Jcv≫Jtrain
用圖表來概括d和λ是怎麼引發high bias和high variance的問題的
high bias | high variance | |
---|---|---|
d | 太小 | 太大 |
λ | 太大 | 太小 |
2.2 接下來我們又要回到learning curve的內容
首先是理想狀態下的learning curve
理想狀態下的learing curve,x軸是m(訓練集的數量),y軸是error。我們在座標平面內表示不帶λ的
接下來是high bais情況下的learning curve
很明顯,兩條曲線的升降趨勢沒有太大變化,但是升降的幅度(也就是收斂的速度)快了很多,兩者之間的gap極小,幾乎貼近(因爲數量多了以後,在訓練集和驗證集上的表現不會有太大的差別)。另外一個值得注意的地方是,兩條曲線的收斂值都比之前要大,也就意味着large error
從而,我們知道,在high bias的情況之下,增加訓練集數量並沒有太多幫助
最後是high variance情況下的learning curve
同樣地,曲線的升降趨勢沒有太大變化,只是收斂的速度b似乎變慢了,比理想狀態下還要慢,在同樣的m情況下,gap變大了很多。但是有意思的是,隨着m的增大,兩條曲線最終還是會逐漸靠攏。
於是,我們就知道了,增加訓練集數量可能對high variance的情況助益更大
3. 有針對性地改善現有算法
我們前面已經總結了欠擬合和過擬合狀態下d和λ的狀態,如果我們想要改善所出現的問題,我們就可以從d,λ和m上下手
所處狀態 | high bias | high variance |
---|---|---|
d | 太小 | 太大 |
λ | 太大 | 太小 |
如何解決 | high bias | high variance |
---|---|---|
d | 增大d | 減小d |
λ | 減小λ | 增大λ |
m | 無能無力 | 增加m |
把上面的表格表達成更易理解的語言,就可以回到我們一開始的問題
1.增加訓練數據 ———-> 解決過擬合 m↑
2.減少特徵 ———-> 解決過擬合 d↓
3.增加特徵 ———-> 解決欠擬合 d ↑
4.增加多項式特徵 ———-> 解決欠擬合 d ↑
5.減小
6.增加
至此,我們就解決了我們一開始提出的三個問題。
ps:文中所有圖的來源是Ng的課程視頻截圖和講義截圖
======================================
其他的一些想法
我們做這些的目的就是減少error
這裏有兩個問題,一個是爲什麼只用了traing set 和cross validation set?另外一個是究竟怎麼去判斷大和小的問題
驗證集和測試集的本質都是用來做測試的數據,只是用途不一樣,一個用來測試degree 另外一個用來測試θ
d,λ,m到底是大還是小我們其實不用知道,因爲我們使用的這三個參數其實是一個相對的大小。我們只要去比較
Jtrain 和Jcv 的大小,然後根據我們判斷出來的情況,決定是在現有的參數基礎上往增加的方向還是減小的方向即可。
3.彩蛋。作者本人可見