Standford 機器學習應用的建議及機器學習系統的設計

        前幾講學習了很多機器學習的算法,但是在實際的應用中會遇到很多過擬合和欠擬合的問題,這些問題都會導致測試結果不理想。用什麼方法解決這些問題,是本講研究的主題。

舉一個房價預測的例子,如果學習了一個模型,發現測試結果非常不理想(有非常大的誤差),那麼接下去該怎麼辦?下面有幾種解決方法:

1、 獲取更多的樣本,來訓練模型       

2、 試着用更少的特徵來構建特徵向量

3、 特徵向量中添加其他的特徵           

4、 特徵向量中添加已有特徵的多次項

5、 增加regularization中的lambda          

6、 減少regularization中的lambda           

        但是我們不能盲目地去選取裏面的某個方法,這樣會浪費不必要的時間,比如用更多的樣本,數據的獲得往往是非常艱難的,會花上很多時間去收集數據,也許會發現,用更多的數據沒有得到更好的結果。所以出現問題後,我們要首先去診斷,到底是什麼導致了很大的誤差,再針對問題去採取相應的措施。

 

一、評估模型

        把數據集分成兩部分(訓練數據和測試數據),往往在已有的數據集中訓練數據分70%,測試數據分30%,學習的過程就是最小化訓練誤差,但是訓練誤差小,不一定測試誤差就小,這就是泛化能力。我們要追求的就是使模型具有很強的泛化能力。

在邏輯迴歸的例子中可以這樣定義測試誤差:

 

 

二、模型的選擇

        在線性迴歸的例子中,我們可以選取下面的多種模型中的一個作爲模型擬合出不同的曲線,定義d=degreeof polynomial,即模型的最高項多項式的係數,

 

 

        對每一個模型訓練之後會學習得到10theta向量,對每一個向量用測試集進行驗證,當然也會得到不同的測試結果如下圖:

 

        比如說d=5的時候測試誤差是最小的,那麼我們就認爲d=5這個模型具有最強的泛化能力,爲了測試這個模型預測準確率如何,就必須用新的樣本(不能再用這個測試樣本),因爲這個模型本來就是根據這個測試樣本的誤差最小得到的,再用這個樣本測試定會得到很小的誤差,但是對其他數據性能如何我們不得而知。

        因此需要將數據分成三部分:訓練數據,交叉驗證數據,測試數據。訓練數據用來學習模型,交叉驗證數據來驗證不同的模型的交叉驗證誤差,選擇交叉驗證誤差最小的那個模型。然後用測試數據來驗證模型預測的準確率(這裏的測試數據不要和上面的測試數據搞混了,上面的測試數據其實就是交叉驗證數據)。這三部分數據劃分如下:分別佔60%20%20%

 

線性迴歸中,他們的誤差定義如下:

 

 

 

三、診斷biasvariance

        模型欠擬合就是會有很高的bias,如果過擬合就有很高的variance,如下圖:

 

        隨着d的增加,訓練誤差會越來越小,因爲多次項次數越高,擬合的越精確,訓練數據上的誤差當然越小。對於測試誤差,d小的時候是欠擬合,誤差當然大,中間慢慢減小,超過一定程度後就變成了過擬合,誤差當然也就增大。誤差變化如下:

 

        解決過擬合的方法就是regularizationregularization有沒有好的效果關鍵是lambda的選取,lambda過小會過擬合,lambda過大會欠擬合。

 

 

 

        那麼應該怎麼樣選取這個lambda值呢?當然是選測試誤差最小時候的lambda!如下圖所示,根據不同的lambda學習出來的模型,在交叉驗證數據集上得到了相應的誤差,選取交叉驗證誤差最小的那個lambda就行了。

 

        那麼隨着lambda增大,訓練誤差和測試誤差又是怎麼樣變化的呢?對於訓練誤差,lambda很小的時候,是過擬合,當然訓練誤差很小,隨着lambda的增大,越來越不能精確的擬合訓練數據,所以訓練誤差不斷增加,直到欠擬合。對於測試誤差,lambda小的時候是過擬合,測試誤差很大,lambda到中間某個值的時候誤差到最小,lambda很大的時候是欠擬合,測試誤差又變大。但往往測試誤差比訓練誤差要大,因爲模型是根據訓練數據學習出來的。變化關係如下圖。

 

 

 

四、學習曲線

        這條曲線是關於測試誤差和訓練樣本個數關係的。如果訓練樣本很少,如下圖右邊上面的例子,模型會很容易的擬合所有樣本,訓練誤差小,隨着樣本個數增多,模型越難越擬合所有的樣本,因此訓練誤差逐漸升高。對於測試誤差,樣本個數少訓練出來的模型當然不具有代表性,測試誤差小,樣本數增多測試誤差會逐漸減小。最後無論是測試誤差還是訓練誤差都會收斂到一個閾值。

 

        看下面這個例子,樣本數很多的時候,訓練誤差和測試誤差都很大,這個模型是欠擬合,於是增加樣本不能對測試誤差有一個很好的改進,

 

        如果模型是過擬合的,增多樣本會降低過擬合的程度,試想,如果樣本無限多,這樣擬合出來的模型是否就是一個精確的模型呢?所以highvariance的時候,增加樣本的數量是有幫助的。樣本越多可以得到越精確的模型。微博上看到google翻譯之所以比別的翻譯做的好,是因爲它有海量數據的支撐,這些數據使得它比其他公司準確率搞了5個百分點,而提高一個百分點,需要1年的研究。Google的數據幫助google贏得了5年的時間。

 

回到剛纔的例子,對應的方法可以解決什麼樣的問題呢?

 

        用複雜的模型,比如有很高次項數的模型或者神經網絡,往往會趨向於過擬合,但是可以用regularization來防止過擬合,增加訓練樣本的方法也可以得出非常令人滿意的模型。

 

五、誤差的度量

        在腫瘤預測的例子中,假設只有0.5%的人得了腫瘤,那麼我的模型一直預測y=1的話,也測得所有腫瘤的樣本,這樣明顯不太合理。

        現在讓y=1定義爲我們想要檢測的rare class(這個非常重要)。

定義precison=預測爲正類的正類樣本數/(預測爲正類的樣本數)

Recall = 預測爲正類的正類樣本數/實際爲正類的樣本數

如下圖:

 

        根據上面這個例子,設得沒得腫瘤爲正類,那麼precision=0.5%  recall=100%,用precisionrecall兩個量可以衡量模型的好壞,precisionrecall都很高才是好的模型。

 

        有上面三個模型的準確率和召回值,如何選擇哪個模型最好呢?明顯用平均值的方法會選到第三個,然而第三個模型是不理想的。常用的定義方法是F1scoreF1score定義爲2PR/(P+R),所以根據這個值,上面算法1是最理想的模型。

 

總結:在應用當中,遇到測試誤差很大的時候,要學會去分析,通過話LearningCurve可以看出是過擬合的問題還是欠擬合的問題,然後在對症下藥,該增加樣本增加樣本,該調整lambda調整lambda,該改變feature改變feature

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章