在咱們構建完機器學習模型,常常會遇到訓練獲得模型沒法正確預測,這以後咱們每每會採起下面的一些方案:機器學習
如果不瞭解模型具體的問題所在,而根據隨便拿出一個方案去試錯,這每每都是既費力又費心,每每個把月過去了仍然在進行模型的調試。函數
將一個數據集先按下面進行劃分:學習
1.線性迴歸,直接使用代價函數便可,以下:測試
for i = 1:m %依次遞增的數據量進行訓練模型 theta = trainLinearReg(X(1:i,:), y(1:i), lambda); %train數據集的測試,使用時去除lambda error_train(i) =linearRegCostFunction(X(1:i,:), y(1:i), theta, 0); %cv數據集的測試 error_val(i) = linearRegCostFunction(Xval, yval, theta, 0); end
2.logistic迴歸,引出0-1錯分率:
優化
欠擬合:高誤差,Jcv近似於Jtrain。
過擬合:高方差,Jcv遠大於Jtrain。
這2個問題是機器學習中最經典的錯誤狀況,不少現象也是由它們一手操辦的,來看看下面的3種狀況:3d
根據上面偏差計算部分得來的Training set和cv set獲得相應圖片
調試
High bias:Jcv與Jtrain很是接近,加入過多樣本,對模型的優化沒做用
code
High variance:Jcv遠大於Jtrain,增長樣本,能夠對模型進行優化
blog
多項式特徵的選擇的多少每每也會給咱們帶來很大的麻煩,過多的多項式特徵會使模型過擬合,而過少的多項式特徵會使模型欠擬合。
那麼咱們該如何進行多項式的選擇,下面便引入解決方案:
圖片
正規化的引入,就是爲了防止過擬合,而lambda對擬合程度有着很大影響。如果沒有lambda則會出現過擬合現象;而如果lambda過大則會出現欠擬合現象。
那怎麼選擇一個較好的lambda呢?
方法相似於多項式特徵的選取,稍有不一樣的就是本身要定義lambda集合。
測試代碼段
for i = 1:length(lambda_vec) lambda = lambda_vec(i); theta = trainLinearReg(X, y, lambda); %評估時切記不可在cv set和test set中加入lambda值 error_train(i) = linearRegCostFunction(X, y, theta, 0); error_val(i) = linearRegCostFunction(Xval, yval, theta, 0); end
測試結果:
不少狀況下由於特徵不少,咱們每每很難將數據展示出來,而可視化的數據每每給咱們的分析帶來了很大的幫助;learning curve的繪製無疑是一大助手,learning curve一般是由training set和cv set的偏差繪製出來的,中間最重要的就是將training set使用遞增的方式進行訓練,而cv set則是所有進行使用。如【計算模型偏差的代碼部分】。