1. 程式人生 > >從 0 開始機器學習 - 機器學習演算法診斷

從 0 開始機器學習 - 機器學習演算法診斷

今天跟大家分享下如何診斷一個演算法是否存在偏差或者方差的問題,以及如何選擇優化演算法的方向。 ## 一、如何確定下一步的計劃? 當我們設計了一個機器學習演算法,比如線性迴歸或邏輯迴歸,並且演算法已經能夠正常工作,只是效果還不是太好,那用什麼方法來提高演算法的效能或者準確度呢?或者說在想辦法提升效能之前,有沒有一種方法來告訴我們下一步對我們設計的機器學習演算法該採取什麼步驟,比如: 1. 獲得更多的訓練樣本 2. 嘗試減少特徵的數量 3. 嘗試獲得更多的特徵 4. 嘗試增加多項式特徵 5. 嘗試減少正則化程度 6. 嘗試增加正則化程度 7. ... 上面 6 種思路都可以作為提升一個演算法效能的選擇,可是我們對一個演算法到底該選擇哪一種優化的思路呢?今天就跟大家分享下如何來評估一個機器學習演算法,也稱為**機器學習診斷法**,這個方法可以明確地告訴我們:**要想進一步提升演算法的效能,我們到底該採取什麼方法是比較有效地,是增加訓練集數量,還是增加或者減少特徵數等。** 使用這個方法的必要性是可以幫助我們節省時間,讓我們可以更加明確優化演算法的方向,不至於像無頭蒼蠅一樣胡亂的選擇優化思路,最終效果還不行。 ## 二、訓練集、交叉驗證集,測試集 在學習診斷法之前,需要先對訓練資料集進行處理,對於特徵變數比較少的情況,我們可以直接畫出假設函式在訓練集上的擬合效果,比如: ![](https://dlonng.oss-cn-shenzhen.aliyuncs.com/blog/train_cv_test.jpg) 但是當特徵數量很多以至於不能用曲線表示擬合效果時,就需要用另外一種代價函式誤差指標的方法來衡量假設函式的擬合效果,為此需要把原始資料集進行拆分: - 70% 作為訓練集 `training set` - 30% 作為測試集 `test set` 這樣我們就有了用來評估模型效果的測試資料集了,首先把模型在訓練集上進行訓練,然後用測試集計算模型的代價函式誤差 $J(\theta)$,但是在訓練集上擬合較好的模型不一定能適應新的樣本,為此我們再拆分一個**交叉驗證集幫助我們選擇訓練集上訓練的模型**,為此再對資料集拆分: - 60% 作為訓練集 `training set` - 20% 作為交叉驗證集 `cross validation set` - 20% 作為測試集 `test set ` 之後使用這 3 個數據集對多個模型進行訓練或者評估: 1. 在訓練集上訓練個模型,並計算訓練誤差 $J_{train}(\theta)$ 2. 在交叉驗證集上計算代價函式的交叉驗證誤差 $J_{cv}(\theta)$ 3. 選擇交叉驗證誤差最小的模型 4. 在測試集上計算上一步選擇的最小模型的代價函式推廣誤差 $J_{test}(\theta)$ 以上的 3 個誤差均為平方誤差代價函式,只是在不同的資料集上進行的計算: $$ J_{train} \left( \theta \right) = \frac{1}{2m}\sum\limits_{i=1}^m \left( h_{\theta}(x^{(i)})-y^{(i)} \right)^{2} $$ $$ J_{cv} \left( \theta \right) = \frac{1}{2m_{cv}}\sum\limits_{i=1}^{m_{cv}} \left( h_{\theta}(x_{cv}^{(i)})-y_{cv}^{(i)} \right)^{2} $$ $$ J_{test} \left( \theta \right) = \frac{1}{2m_{test}}\sum\limits_{i=1}^{m_{test}} \left( h_{\theta}(x_{test}^{(i)})-y_{test}^{(i)} \right)^{2} $$ 接下來我們分別在訓練集和交叉驗證集上用曲線做對比分析,以此來分析當前演算法存在**高偏差問題**還是**高方差問題**。 ## 三、多項式次數與偏差和方差的曲線 通過之前部落格的學習我們已經知道: - 高偏差問題:模型欠擬合 (underfitting) - 高方差問題:模型過擬合(overfitting) 通過前面拆分的訓練集合交叉驗證集,我們可以畫出一個模型的多項式次數 - 代價函式誤差的曲線,以此通過曲線來幫助我們分析當前的模型是欠擬合還是過擬合,比如下面的曲線: ![](https://dlonng.oss-cn-shenzhen.aliyuncs.com/blog/d_fitting_crave.jpg) 解釋下: - 橫座標代表假設函式(模型)的多項式次數 `d` - 縱座標表示代價函式的誤差 `error` - $J_{cv}(\theta)$ 表示模型在交叉驗證集上的代價函式誤差 - $J_{train}(\theta)$ 表示模型在訓練集上的代價函式誤差 從上面的曲線中我們可以發現 3 個關鍵位置及其含義: ![](https://dlonng.oss-cn-shenzhen.aliyuncs.com/blog/error_bias_variance.jpg) ### 3.1 多項式次數 d 較小 因為模型的次數低,所以擬合訓練集和交叉驗證集的誤差都比較大,從曲線上看 $J_{cv}(\theta)$ 與 $J_{train}(\theta)$ 誤差近似,都挺大的。 ### 3.2 多項式次數 d 合適 當我們選擇一個合適的模型時,訓練集和交叉驗證集的誤差都比較小,並且交叉驗證集的誤差處於最低點,這說明當前多項式次數對應的模型擬合交叉驗證集的效果最好。 ### 3.3 多項式次數 d 較大 但是當我們繼續增大模型的多項式次數後,會發現訓練集誤差繼續減少,但是交叉驗證誤差卻反而增大了,這是因為我們選擇的多項式次數太高,模型在交叉驗證集上產生了過擬合,也即方差太大。 通過以上 3 個關鍵的位置,可以得出以下的結論: - $J_{train}(\theta)$ 與 $J_{cv}(\theta)$ 近似時:模型欠擬合,偏差(Bias)較大 - $J_{cv}(\theta)$ 遠大於 $J_{train}(\theta)$ 時:模型過擬合,方差(Variance)較大 ## 四、正則化係數與偏差和方差的曲線 除了分析模型的多項式次數與偏差方法的關係,我們還可以分析正則化係數,這可以幫助我們選擇一個合適的正則化係數來防止過擬合,通過前面的學習我們知道: - 正則化係數 $\lambda$ 太大:模型容易欠擬合,偏差較大 - 正則化係數 $\lambda$ 合適:模型擬合效果較好 - 正則化係數 $\lambda$ 太小:模型容易過擬合,方差較大 如: ![](https://dlonng.oss-cn-shenzhen.aliyuncs.com/blog/multi_lamda .jpg) 為了分析正則化係數對模型的影響,我們同樣可以在前面的 3 個數據集上進行多組不同正則化係數模型的誤差計算: - 在 `training set` 上訓練多組不同正則化係數的模型 - 分別在 `cross validation set` 上計算每組的代價函式交叉驗證誤差 - 選擇交叉驗證誤差最小的模型 - 將誤差最小的模型在 `test set` 上計算推廣誤差 在這個過程中,我們可以畫出正則化係數與代價函式誤差的關係: ![](https://dlonng.oss-cn-shenzhen.aliyuncs.com/blog/error_bias_variance_lambda.jpg) 解釋下曲線上關鍵的 3 個位置: ### 4.1 $\lambda$ 較小 因為正則化係數較小,模型在訓練集上產生過擬合,雖然誤差 $J_{train}(\theta)$ 比較小,但是在交叉驗證集上的誤差 $J_{cv}(\theta)$ 很大,這是因為在訓練集上過擬合的模型不能很好的適應未知的樣本。 ### 4.2 $\lambda$ 合適 當選擇了一個合適的正則化係數時,模型在訓練集和交叉驗證集上的誤差都比較小,這也是我們想要的情況。 ### 4.3 $\lambda$ 較大 當正則化係數很大,模型在訓練集上都不能很好地擬合數據(欠擬合),更別說在未知上交叉驗證集上測試了,所以這兩者的誤差都很大。 也簡單總結下這個曲線: - 當 $\lambda$ 較小:訓練集誤差小,交叉驗證集誤差大 - 當 $\lambda$ 不斷增大:訓練集誤差逐漸增大,而交叉驗證集誤差先減小再增大 ## 五、學習曲線 除了以上的多項式次數、正則化係數與誤差的關係之外,還有一種很重要的稱為「學習曲線」的關係,它主要用來說明交叉驗證誤差和訓練集誤差隨著樣本數量變化的關係,可以用這個曲線幫助我們判斷一個演算法在給定樣本規模的情況下是否存在偏差或者方差的問題。 我們還是分析以下 2 個代價函式誤差: $$ J_{train} \left( \theta \right) = \frac{1}{2m}\sum\limits_{i=1}^m \left( h_{\theta}(x^{(i)})-y^{(i)} \right)^{2} $$ $$ J_{cv} \left( \theta \right) = \frac{1}{2m_{cv}}\sum\limits_{i=1}^{m_{cv}} \left( h_{\theta}(x_{cv}^{(i)})-y_{cv}^{(i)} \right)^{2} $$ 我們把這 2 者和樣本數量的關係畫成學習曲線: ![](https://dlonng.oss-cn-shenzhen.aliyuncs.com/blog/error_size_m.jpg) 因為是分析樣本數量與這 2 個誤差的關係,所以我們分 2 種情況來討論。 ### 5.1 模型存在高偏差(欠擬合)問題 當模型欠擬合時,比如多項式次數太少(特徵太少了),不管把樣本數量增大到多少,訓練集誤差和交叉驗證集誤差都不會下降很多,這種情況就說明我們的模型存在高偏差問題,也就是欠擬合了: ![](https://dlonng.oss-cn-shenzhen.aliyuncs.com/blog/hight_bias.jpg) 這種情況下,如果你不用學習曲線來分析,而是直接憑感覺出發覺得我應該多增加一些資料,這樣模型的擬合效果應該會更好,那就選錯了優化的方向,從曲線上來看,不管你增加多少樣本,誤差是不會降低的。 ### 5.2 模型存在高方差(過擬合)問題 現在假設我們有一個非常高次的多項式模型(特徵很多),並且正則化係數很小時,如果訓練樣本數很少,那麼在訓練集上會過擬合,導致在交叉驗證集上誤差較大(過擬合不能很好的適應新樣本),而當增加樣本數量的時候,因為我們模型有足夠多的特徵,所以不會輕易的過擬合,這樣隨著數量增多,訓練集和交叉驗證集的誤差都會減小: ![](https://dlonng.oss-cn-shenzhen.aliyuncs.com/blog/high_variance.jpg) 簡單總結下就是: - 高偏差(欠擬合)的模型,增大樣本數量不一定對演算法有幫助 - 高方差(過擬合)的模型,增大樣本數量可能提升演算法的效果 這裡也只可能的情況,因為實際的模型可能很複雜,可能會存在一些特殊情況。 ## 六、現在決定下一步的思路 學習完了如何診斷一個演算法是否存在偏差或者方差問題後,我們就可以回答文章開頭提出的問題了,到底如何選擇優化方向: 1. 獲得更多的訓練樣本 - 適用於高方差的模型 2. 嘗試減少特徵的數量 - 適用於高方差的模型 3. 嘗試獲得更多的特徵 - 適用於高偏差的模型 4. 嘗試增加多項式特徵 - 適用於高偏差的模型 5. 嘗試減少正則化程度 $\lambda$ - 適用於高偏差的模型 6. 嘗試增加正則化程度 $\lambda$ - 適用於高方差的模型 知道如何診斷演算法存在的問題後,就可以選擇對應的優化方向進行鍼對性的工作,就不用盲目地選擇優化方向,最後還可能是無用功。 OK!今天就到這,大家下期見:) ![](https://dlonng.oss-cn-shenzhen.aliyuncs.com/yingliu_code/yinliu_c