1. 程式人生 > >Andrew Ng機器學習程式設計作業:Regularized Linear Regression and Bias/Variance

Andrew Ng機器學習程式設計作業:Regularized Linear Regression and Bias/Variance

作業檔案:

machine-learning-ex5

 

1. 正則化線性迴歸

在本次練習的前半部分,我們將會正則化的線性迴歸模型來利用水庫中水位的變化預測流出大壩的水量,後半部分我們對除錯的學習演算法進行了診斷,並檢查了偏差和方差的影響。

1.1 視覺化資料集 

x表示水位變化,y表示水流量。整個資料集分成三個部分

  • 模型的訓練集,用來從X,y中學習引數。
  • 交叉驗證集,從Xval, yval中決定正則化引數
  • 測試集,用來預測的樣本,從資料集為 Xtest, ytest。

繪製的影象如圖1

1.2 正則化線性迴歸的代價函式。

代價函式如下:

lambda是正則化引數。注意我們不應該正則化theta0,因為其代表偏置值。

在linearRegCostFunction.m檔案中完成程式碼。對於theta初始化為[1;1].我們的輸出值應該為303.993

linearRegCostFunction.m內程式碼:

J = 1/2/m*sum((X*theta-y).^2)+lambda/2/m*sum(theta(2:end).^2);

1.3 正則化線性迴歸梯度

正則化的梯度表示為:

在 linearRegCostFunction.m中新增計算梯度的程式碼,對於theta初始化為[1;1],我們應該看到結果

 梯度值為[-15.30; 598.250] 

linearRegCostFunction.m檔案中程式碼:

J = 1/2/m*sum((X*theta-y).^2)+lambda/2/m*sum(theta(2:end).^2);
grad = 1/m*(X'*(X*theta-y));
grad(2:end) = grad(2:end)+lambda/m*theta(2:end);

1.4 擬合線性迴歸

我們將使用 fmincg優化器來求解引數值。將lambda的值設定為0,因為只有兩個引數,不會有過度擬合情況。增大lambda的值只會懲罰theta的值。用求解的引數值繪圖如圖2所示。

如圖所示視覺化最佳擬合是一種可能的方式除錯學習演算法。但是視覺化資料和模型通常不是容易的。下面部分我們將實現一個函式來產生學習曲線,來幫助我們除錯我們的學習演算法,即使我們的資料不容易視覺化。

2. 偏差和方差

在機器學習中一個重要的概念是方差偏差的權衡。有高偏差的模型一般比較簡單不夠擬合數據。有高方差的資料一般會過度擬合訓練集。在這一節我們將會在學習曲線上繪製訓練與測試誤差來診斷偏差和方差問題。

2.1 學習曲線

現在我們將實現程式碼繪製學習曲線,來幫助我們除錯學習演算法。我們的任務是完learningCurve.m 檔案中的程式碼,可以返回下訓練集和交叉驗證集的誤差向量。

繪製學習曲線我們需要獲得不同大小訓練集的訓練誤差與交叉驗證誤差。獲得不同大小的訓練集我們可以使用X(1:i,:),y(1:i),i表示訓練集的大小。將這些資料給前面實現的trainLinearReg函式來獲得引數theta的值。在通過theta來獲得訓練誤差與交叉驗證誤差。訓練誤差定義為

注意:訓練誤差是不包括正則化項的,我們可以將lambda的值設定為 0.對於訓練集誤差我們應該使用不同大小的訓練集。對於交叉驗證誤差,我們應該使用所有的交叉驗證資料集。

learningCurve.m 檔案中程式碼:

for i = 1:m
     theta = trainLinearReg(X(1:i,:), y(1:i), lambda);
     error_train(i) =  linearRegCostFunction(X(1:i,:), y(1:i),theta,0);
     error_val(i) = linearRegCostFunction(Xval, yval,theta,0);
end

執行程式碼執行結果如圖3所示

 

 3 多項式迴歸

我們線性迴歸模型的一個問題是,模型對於資料二維太簡單了,不能夠好的擬合數據(有高偏差)。在這一部分練習,我們將通過新增更多特徵來解決這個問題。對於多項式迴歸我們的假設函式是這個形式:

 

 對於此的多項式迴歸。我們得到一個線性迴歸模型,其中特徵是原始值的各種冪

現在我們將使用對資料集已經存在的特徵x使用更高次冪來獲得更多特種。我們的任務是完成polyFeatures.m的程式碼,通過這個函式對映m*1的原始資料矩陣X成為m*p的的資料矩陣。如第1列是原始資料的1次冪,第2列是原始資料的2次冪。

polyFeatures.m檔案中程式碼

 X_poly(:,i) = X.^i;

3.1學習多項式迴歸

我們使用前面完成的線性迴歸模型來學習多項式迴歸引數。

在這節練習我們將使用8階多項式,如果直接使用結果將很差,因為如果x=40那x8次冪的特徵是就是40的8次冪。因此我們需要先進行特徵規範化。作業已經幫我們實現了。執行作業中的程式碼結果如圖4圖5所示

通過圖4我們可以看到,多項式已經很好的擬合數據點,獲得了很小的訓練誤差。但是此多項式太複雜了在甚至極端情況下水流量下降了。因此此多項式迴歸模型過度擬合訓練集,因此不能很好的泛化。

3.2 可選練習:調整正則化引數

這一節我們可以觀察正則化引數的影響。可以設定lambda的值為1或者100.

結果如圖6圖7所示

通過圖7我們可以看到lambda =1 訓練誤差與交叉驗證誤差都處於一個低值。因此沒有高偏差和高方差問題。對與lambda = 100如圖8所示,可以看到不能很好擬合數據。

 

 3.3 使用交叉訓練集選擇lambda的值

從之前練習我們可以看到lambda的值會對多項式迴歸模型有顯著影響。

在這一節我們會實現自動選擇labmbda的值的函式。具體來說,通過交叉驗證集來測試那個lambda的值是最合適的。我們可以通過測試機來評估我們的模型對未知的資料的表現如何。我們的任務是完成validationCurve.m檔案的程式碼。我們應該使用trainLinearReg函式,來使用不同的lambda的值訓練模型。我們將測試的lambda的值是:{0, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1, 3, 10}.

在完成程式碼後我們應該會看到如圖9所示的影象。

validationCurve.m檔案程式碼:

for i = 1:length(lambda_vec)
     theta = trainLinearReg(X, y, lambda_vec(i));
     error_train(i) =  linearRegCostFunction(X, y,theta,0);
     error_val(i) = linearRegCostFunction(Xval, yval,theta,0);
end

 

 3.4 可選練習:計算測試集誤差

之前我們已經計算交叉驗證集誤差與訓練集誤差,為了更好的瞭解模型的表現,使用測試集評估最終的模型是非常有必要的。

我們已經獲得當lambda = 3時測試集誤差為3.8599

theta = trainLinearReg(X_poly, y, 3);
linearRegCostFunction(X_poly_test, ytest,theta,0)