前言
在我們構建完機器學習模型,經常會遇到訓練得到模型無法正確預測,這之后我們往往會采取下面的一些方案:
- 增加訓練數據
- 減少特征的個數
- 增加更多的特征
- 增加多項式特征(X1*X2 ...)
- 增大lambda的值
- 減小lambda的值
若是不了解模型具體的問題所在,而根據隨便拿出一個方案去試錯,這往往都是既費力又費心,往往個把月過去了仍然在進行模型的調試。
CV 數據集 [數據集處理]
將一個數據集先按下面進行划分:
- Training set: 60%
- Cross validation set: 20%
- Test set: 20%
計算模型誤差 [誤差計算]
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種情況:
樣本
根據上面誤差計算部分得來的Training set和cv set得到相應圖片
High bias:Jcv與Jtrain非常接近,加入過多樣本,對模型的優化沒作用
High variance:Jcv遠大於Jtrain,增加樣本,可以對模型進行優化
多項式特征
多項式特征的選擇的多少往往也會給我們帶來很大的麻煩,過多的多項式特征會使模型過擬合,而過少的多項式特征會使模型欠擬合。
那么我們該如何進行多項式的選擇,下面便引入解決方案:
- 使用training set訓練每一個多項式,得出相應的theta值。
- 使用cv set獲得誤差最小的多項式。
- 最后使用test set對多項式進行評估。
lambda
正規化的引入,就是為了防止過擬合,而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則是全部進行使用。如【計算模型誤差的代碼部分】。