brunch

You can make anything
by writing

C.S.Lewis

by 라인하트 Jan 19. 2021

머신러닝 옥타브 실습(5-2): 댐의 방수량 예측

   온라인 강의 플랫폼 코세라의 창립자인 앤드류 응 (Andrew Ng) 교수는 인공지능 업계의 거장입니다. 그가 스탠퍼드 대학에서 머신 러닝 입문자에게 한 강의를 그대로 코세라 온라인 강의 (Coursera.org)에서 무료로 배울 수 있습니다. 이 강의는 머신러닝 입문자들의 필수코스입니다. 인공지능과 머신러닝을 혼자 공부하면서 자연스럽게 만나게 되는 강의입니다. 


Programming Exercise 5: 

Regularized Linear Regression and Bias v.s. Variance (정규화된 선형 회귀와 편향/분산)


2. Bias-variane (편향과 분산) 


   An important concept in machine learning is the bias-variance tradeoff. Mod- els with high bias are not complex enough for the data and tend to underfit, while models with high variance overfit to the training data.

   In this part of the exercise, you will plot training and test errors on a learning curve to diagnose bias-variance problems.


   머신 러닝에서 중요한 개념은 편향과 분산 트레이드오프입니다. 편향이 높은 모델은 데이터 셋에 과소 적합하는 경향이 있는 반면에 분산이 높은 모델은 학습 데이터에 과적합하는 경향이 있습니다. 

   실습은 편향과 분산 문제를 진단하기 위해 학습 곡선에 학습 및 테스트 오차를 표시합니다. 



2.1 Learning curves


   You will now implement code to generate the learning curves that will be useful in debugging learning algorithms. Recall that a learning curve plots training and cross validation error as a function of training set size. Your job is to fill in learningCurve.m so that it returns a vector of errors for the training set and cross validation set.

   To plot the learning curve, we need a training and cross validation set error for different training set sizes. To obtain different training set sizes, you should use different subsets of the original training set X. Specifically, for a training set size of i, you should use the first i examples (i.e., X(1:i,:) and y(1:i)).

   You can use the trainLinearReg function to find the θ parameters. Note that the lambda is passed as a parameter to the learningCurve function. After learning the θ parameters, you should compute the error on the training and cross validation sets. Recall that the training error for a dataset is defined as



   In particular, note that the training error does not include the regularization term. One way to compute the training error is to use your existing cost function and set λ to 0 only when using it to compute the training error and cross validation error. When you are computing the training set error, make sure you compute it on the training subset (i.e., X(1:n,:) and y(1:n)) (instead of the entire training set). However, for the cross validation error, you should compute it over the entire cross validation set. You should store the computed errors in the vectors error train and error val.

   When you are finished, ex5.m wil print the learning curves and produce a plot similar to Figure 3. In Figure 3, you can observe that both the train error and cross validation error are high when the number of training examples is increased. This reflects a high bias problem in the model – the linear regression model is too simple and is unable to fit our dataset well. In the next section, you will implement polynomial regression to fit a better model for this dataset.


   이번 실습에서 학습 알고리즘 디버깅에 유용한 학습 곡선을 생성하는 코드를 구현합니다. 학습 곡선은 학습  셋의 크기에 대한 함수로 학습 오차와 교차 검증 오차를 표시합니다. 학습 셋 및 교차 검증 셋에 대한 오차 벡터를 반한하는 learningCurve.m 파일을 작성합니다. 

   학습 곡선을 그리려면 학습 셋의 크기가 증가함에 따른 학습 및 교차 검증 셋 오차가 필요합니다. 학습 셋의 크기를 얻기 위해서는 학습 셋 X를 하위 셋으로 구분해야 합니다. 예를 들어, 학습 셋의 크기가 i개인 경우 처음부터 i개까지의 하위 셋으로 지정하기 위해  X(1:i, :)와 y(1:i))를 사용합니다. 

   trainLinearReg.m 파일은 최적의 파라미터 θ(theta)를 계산합니다. lambda는 learningCurve 함수의 파라미터로 전달합니다. 파라미터 θ를 학습한 후 학습 및 교차 검증 셋에서 오차를 계산합니다. 데이터 셋의 학습 오차는 다음과 같이 정의합니다.


  특히, 학습 오차에 정규화 항을 포함하지 않습니다. 정규화 항을 포함하지 않는 학습 오치와 교차 검증 오차를 계산하는 방법은 lambda를 0으로 설정하는 것입니다. 학습 셋 오차를 계산할 때 전체 데이터 셋이 아닌 하위 셋을 (X(1:n,:), y(1:n))을 대상으로 계산합니다. 그러나 교차 검증 오차는 전체 교차 검증 셋에 대해 계산합니다.  계산된 오차는 변수 error_train과 error_val에 저장합니다.

   완료하면 ex5.m 파일은 학습 곡선을 그림 3과 유사한 그림을 그립니다. 그림 3에서 학습 예제의 수가 증가할수록 학습 오차와 교차 검증 오차가 모두 높습니다. 모델이 높은 편향 문제를 가진다는 것을 반영합니다. 선형 회귀 모델은 너무 단순하고 데이터셋에 잘 맞출 수 없습니다. 다음 섹션에서 데이터 셋에 더 나은 모델을 맞추기 위해 다항 회귀를 구현합니다.


<해설>


(1) 데이터 업로드 및 기본 변수 설정


clear ;             % 옥타브 프로그램에 모든 변수를 제거

close all;         % 터미널 이외의 창을 닫음

clc                   % 터미널을 깨끗이 정리 


load ('ex5data1.mat');    % 옥타브 프로그램으로 데이터 업로드 

[m,n] = size(X);     % 학습 예제의 수와 피처의 수를 정의


X = [ones(m,1) X];


(2) learningCurve.m 파일 분석


function [error_train, error_val] =learningCurve(X, y, Xval, yval, lambda)

%LEARNINGCURVE Generates 학습 곡선을 그리기 위한 학습 및 교차 검증 셋 오차 계산

%

%   [error_train, error_val] = LEARNINGCURVE(X, y, Xval, yval, lambda) 

%          학습 곡선을 그리기 위한 학습 셋 및 교차 검증 셋 오차를 반환 

%          error_train와 error_val 변수를 반환

%          error_train(i):  i 예제에 대한 학습 오차 

%          error_val(i):  i 예제에 대한 교차 검증 오차 

%          1에서 m까지의 데이터 셋 크기에 대한 학습 오차와 테스트 오차를 계산

%       더 큰 데이터셋에서도 함수는 동작하도록 작성

%


%  학습 예제의 수 

m = size(X, 1);


% 두 값을 반환 

error_train = zeros(m, 1);

error_val   = zeros(m, 1);


% ====================== YOUR CODE HERE ======================

% Instructions: 

%               error_train과 error_val 값을 반환  

%               학습 예제 i에 대한 오차 error_train(i)과 error_val(i) 

%

% Note: 

%       학습 예제에 대한 학습 오차를 평가 (예,  X(1:i, :) and y(1:i)).

%.     교차 검증 오차는 전체 교차 검증 셋 (Xval과 yval을 평가 

%

% Note: If you are using your cost function ()

%       학습 오차와 교차 검증 오차를 계산하기 위해 linearRegCostFunction.m 을 사용할 때 

%       lambda = 0로 설정 

%       파라미터 theta를 학습할 때는 lambda를 사용 

%

% Hint: 

%       For 루프를 생성

%       for i = 1:m

%           % 학습 예제를 사용하여 학습 / 교차 검증 오차를 계산  X(1:i, :) and y(1:i)

%           % 오차는 error_train(i) and error_val(i)에 저장

%           ...

%       end


% ---------------------- Sample Solution ----------------------





% -------------------------------------------------------------


% ===================================================================


end



(3) trainLinearReg() 함수로 파라미터 theta를 계산


   고급 최적화 함수 fmincg()을 활용하여 theta를 계산합니다. trainLinearReg(X, y, lambda) 함수는  fmincg() 함수를 호출하고 theta를 반환합니다. 

   

lambda = 0;


for i = 1:m

   theta = trainLinearReg(X(1:i, :), y(1:i, :), lambda);

end



(4) 학습 오차 error_train(i)와 error_val(i)를 계산


   학습 셋의 수가 1,2,3,..., m으로 증가할 때 학습 곡선의 학습 오차는 누적됩니다.  error_train(i)는 하위 학습 셋 (X(1:i, :), y(1:i, :))에 대한 오차를 누적하고, error_val(i)는 교차 검증 셋 (Xval, yval)에 대한 오차를 누적합니다. 즉, 학습 셋 오차는 하위 학습 셋에 대해 누적하고 교차 검증 셋은 전체 셋에 대해 누적합니다.  


   오차를 계산하기 위해 linearCostFunction.m 파일을 사용합니다. linearCosetFunction.m 파일은 비용 Cost와 기울기 grad를 반환합니다. 비용 Cost는 가설 hθ(x)와 실제값 y 사이의 오차의 제곱입니다. 또한, 교차 검증 셋은 전체 셋에 대해 theta의 변화에 따른 값을 누적합니다. 


Xval = [ones(size(Xval,1) ,1) Xval]


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



(5) 학습 곡선의 동작 결괄루 확인 


clear ;             

close all;        

clc                


load ('ex5data1.mat');    

[m,n] = size(X);  


X = [ones(m,1) X];

Xval = [ones(size(Xval,1) ,1) Xval]


lambda = 0


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



(6) 학습 곡선 그리기 


   학습 오차 error_rain 벡터와 교차 검증 오차 error_val 벡터를 학습 셋의 크기를 기준으로 작성합니다. 


plot(1:m, error_train, 1:m, error_val);                    

title('Learning curve for linear regression')

legend('Train', 'Cross Validation')

xlabel('Number of training examples')

ylabel('Error')

axis([0 13 0 150])



<정답>


function [error_train, error_val] =learningCurve(X, y, Xval, yval, lambda)

%LEARNINGCURVE Generates 학습 곡선을 그리기 위한 학습 및 교차 검증 셋 오차 계산

%

%   [error_train, error_val] = LEARNINGCURVE(X, y, Xval, yval, lambda) 

%          학습 곡선을 그리기 위한 학습 셋 및 교차 검증 셋 오차를 반환 

%          error_train와 error_val 변수를 반환

%          error_train(i):  i 예제에 대한 학습 오차 

%          error_val(i):  i 예제에 대한 교차 검증 오차 

%          1에서 m까지의 데이터 셋 크기에 대한 학습 오차와 테스트 오차를 계산

%          더 큰 데이터셋에서도 함수는 동작하도록 작성

%


%  학습 예제의 수 

m = size(X, 1);


% 두 값을 반환 

error_train = zeros(m, 1);

error_val   = zeros(m, 1);


% ====================== YOUR CODE HERE ======================

% Instructions: 

%               error_train과 error_val 값을 반환  

%               학습 예제 i에 대한 오차 error_train(i)과 error_val(i) 

%

% Note: 

%       학습 예제에 대한 학습 오차를 평가 (예,  X(1:i, :) and y(1:i)).

%.     교차 검증 오차는 전체 교차 검증 셋 (Xval과 yval을 평가 

%

% Note: If you are using your cost function ()

%       학습 오차와 교차 검증 오차를 계산하기 위해 linearRegCostFunction.m 을 사용할 때 

%       lambda = 0로 설정 

%       파라미터 theta를 학습할 때는 lambda를 사용 

%

% Hint: You can loop over the examples with the following:

%

%       for i = 1:m

%           % 학습 예제를 사용하여 학습 / 교차 검증 오차를 계산  X(1:i, :) and y(1:i)

%           % 오차는 error_train(i) and error_val(i)에 저장

%           ...

%       end

%


% ---------------------- Sample Solution ----------------------


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


% -------------------------------------------------------------


% ===================================================================


end



<결과 확인>


옥타브 프로그램에 다음과 같이 입력합니다.


lambda = 0;

[error_train, error_val] = learningCurve([ones(m, 1) X], y, [ones(size(Xval, 1), 1) Xval], yval, lambda);



plot(1:m, error_train, 1:m, error_val);

title('Learning curve for linear regression')

legend('Train', 'Cross Validation')

xlabel('Number of training examples')

ylabel('Error')

axis([0 13 0 150])



매거진의 이전글 머신러닝 옥타브 실습(5-1): 댐의 방수량 예측
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari