건프의 소소한 개발이야기

[ML - Matlab/Octave] Logistic Regression 본문

개발 이야기/Machine Learning 이야기

[ML - Matlab/Octave] Logistic Regression

건강한프로그래머 2016. 4. 27. 00:46

안녕하세요, 건프입니다.


이번엔 ML 에서 Linear Regression 을 넘어서 Logistic Regression 에 대해서 익혀봅니다.


Linear 의 기법으로 접근하는 것은, 대상을 연속하는 선의 관점으로  바라보는 것이고,

Logistic 은 문자 그대로, 1 또는 0, 불 대수 논리로 접근하는 것을 의미합니다. 대표적인 사용법이 시험에 대한 "합격/불합격" 을 판단하는 함수를 만들 수 있겠네요.


1. 데이터를 로드하고, 데이터를 Feature 와 Result 로 구분하는 작업이 필요합니다.

첫번째 열은 시험1 의 점수

두번째 열은 시험2의 점수

세번째 열은 합격과 불합격을 각각 1, 0 으로 나눠놓은 데이터 입니다.


2. 데이터를 나눴으니, 그래프를 그려봅시다.

그래프를 그리기 위해서는, y  데이터가 1 또는 0 인 데이터로 분리하여 X 데이터에 접근해야 할텐데, 어떠한 방법이 있을까요?

우선 이렇게 접근해봅니다.


이렇다면, 각각의 row 가 이것이 1인지 0인지를 알려줍니다. 하지만 우리는 y = 1 인 X의 index 값이 필요합니다.

그렇다면 이렇게 하시면 됩니다.


좋습니다. 이렇게 원하는 y값이 존재하는 X의 index 를 구할 수 있으니, 그래프를 그리러 가봅시다.



위의 그래프를 그린 함수는 다음과 같이 구성되어 있습니다.

function plotData(X, y)

% PLOTDATA Plots the data points X and y into a new figure 

%   PLOTDATA(x,y) plots the data points with + for the positive examples

%   and o for the negative examples. X is assumed to be a Mx2 matrix.


% Create New Figure

figure; hold on;


% Instructions: Plot the positive and negative examples on a

%               2D plot, using the option 'k+' for the positive

%               examples and 'ko' for the negative examples.

%

  pos = find(y==1);

  neg = find(y==0);

  plot(X(pos,1), X(pos,2), 'k+', 'LineWidth', 2, 'MarkerSize', 7);

  plot(X(neg,1), X(neg,2), 'o', 'MarkerFaceColor', 'y', 'MarkerSize', 7);

  

hold off;


end


3. 이제 계수값(세타값) 을 초기화 하고, cost 함수를 구해서, gradient 식을 정립하고, 최적의 세타값을 구하는 작업이 남았습니다.

다만, Linear 에서는 다르게, Logistic 에서는 h 값이 아무리 크더라도 1을 넘지 않아야하고(1에 무수히 근접해야하고), 아무리 작아도 0을 넘지 않아야 합니다(0에 무수히 접근해야 하고).

이를 가장 적합하게 실현하는 모델함수가 바로 sigmoid 라고 합니다



Logistic 의 Hypothesis Function 을 만들기에 제격이군요!

function g = sigmoid(z)

% SIGMOID Compute sigmoid functoon

%   J = SIGMOID(z) computes the sigmoid of z.

  g = zeros(size(z));

  [a b] = size(z);

% Instructions: Compute the sigmoid of each value of z (z can be a matrix,

%               vector or scalar).


  for i =1:a

    for j=1:b

     g(i,j) = 1/(1+exp(-z(i,j)));

    end

  end


end

우리는 이제 h 를 구할때 

h = sigmoid(X*theta); 

이런식으로 접근하면 됩니다.


4. costFunction 을 구해봅시다.

costFunction 을 구하기 위해서는 Logistic 에서 어떤 방법으로 cost 함수를 모델링 하는지 알아둘 필요가 있습니다.

하지만 이부분은 그렇게 어렵지 않아요.

한번 가정해봅시다. 

y 값이 1 인 데이터를 예상했을때, h 값이 1에 가깝게 나왔다면, 제대로 예상한 것이죠? 그렇다면 cost는 0에 가까워져야 합니다.

반대로, h 값이 0에 가깝게 나왔다면, 완전히 반대로 예상한 것이므로 cost 는 무한의 값을 가지게 만드는 것이 맞습니다.

이를 표현하기에 적합한 함수를 여러분이 찾는다면 어떤 모델함수를 가져오시겠습니까?


여러 함수가 가능하겠지만, 많은 학자들이 연구한 결과 다음의 모델함수가 대부분 적합하다는 결론을 내린 모양입니다.


바로 로그함수(log)를 사용하는 겁니다. 수식은 위의 자료와 같습니다.

위 논리를 이해하셨다면, y = 0일 경우도 유추 가능합니다.


이렇게 하고 costFunction 을 구해봅시다.

이 함수는 다음 두개를 리턴합니다. 

[cost, grad]

function [J, grad] = costFunction(theta, X, y)

% COSTFUNCTION Compute cost and gradient for logistic regression

%   J = COSTFUNCTION(theta, X, y) computes the cost of using theta as the

%   parameter for logistic regression and the gradient of the cost

%   w.r.t. to the parameters.


% Initialize some useful values

m = length(y); % number of training examples

J = 0;

grad = zeros(size(theta));

% Instructions: Compute the cost of a particular choice of theta.

%               You should set J to the cost.

%               Compute the partial derivatives and set grad to the partial

%               derivatives of the cost w.r.t. each parameter in theta

%

% Note: grad should have the same dimensions as theta

%


  h = sigmoid(X*theta);

  J = (1/m)*sum((-y).*log(h)-(1-y).*log(1-h));


  grad = (1/m)*(transpose(X)*(h-y));


end





5. 이제 최적의 theta를 구해봅시다.

Logistic 에서는 costFunction 에서 구해낸 cost 와 grad 를 이용해서 빌트인(Built in) 최적화함수를 호출해주면 됩니다.

바로 fminunc 함수입니다.

이 함수는 인자로 costFunction 을 직접넘기고, options 를 적용해준뒤에 호출하면

최적의 theta 와 rowest cost value 등등을 넘겨줍니다. 유용하네요. 사용법입니다.



이렇게하면 우리는 최적의 theta 값과 cost 값을 얻을 수 있습니다.



이렇게 boundaryGraph 도 구할 수 있습니다.




6. 이제 예측해봅시다.


첫번째 시험을 45점, 두번째 시험을 85점 맞은 학생의 합격확률을 구할 수 있겠죠?


7. Training Set 의 예측도를 확인할 수 도 있습니다.

function p = predict(theta, X)

% PREDICT Predict whether the label is 0 or 1 using learned logistic 

% regression parameters theta

%   p = PREDICT(theta, X) computes the predictions for X using a 

%   threshold at 0.5 (i.e., if sigmoid(theta'*x) >= 0.5, predict 1)


m = size(X, 1); % Number of training examples

p = zeros(m, 1);


%               your learned logistic regression parameters. 

%               You should set p to a vector of 0's and 1's

%

h = sigmoid(X*theta);

p = (h >= 0.5);

end








엄청나게 사진도 많고, 코드도 많았는데요,

큰 줄기를 잡으시길 바랍니다.

디테일한 코드를 원하시는 분이 계실까하여, 제 개인 github 주소 연결해드리겠습니다.


https://github.com/SSUHan/AndrewNgML/tree/master/machine-learning-ex2/ex2



작은 도움이라도 되었길 바랍니다 :)

Happy Coding




Comments