티스토리 뷰

오늘은 Logistic  regression (로지스틱 회귀)를 정리해 보려고 합니다.  제가 정리하는 모든 머신러닝 딥러닝 내용은 sung kim님의 유튜브 모두의딥러닝 시즌1 강의와 텐서플로로 배우는 딥러닝 책을 기반으로 합니다. :)

https://www.youtube.com/watch?v=BS6O0zOGX4E&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm

 

Linear regression이 선형적인 데이터를 예측하는데 사용되었다면, Logistic  regression은 이진분류를 하는데 사용 됩니다. 메일에서 스팸메일인지 아닌지 구분하는것 처럼 두 가지 케이스로 구분해야 하는 경우에 사용됩니다. 시험 성적의 pass/fail 도 좋은 예가 될 수 있죠 ㅎㅎ

시험성적을 예로 그래프로 나타내보면 어떻게 될까요? x축을 공부한 시간 y축을 pass(1) or fail(0) 으로 둔다고 가정했을 때 아무래도 공부한 시간과 pass는 어느정도 비례할 것입니다. (물론 예외의경우도 간혹 있겠지만요?)

그럼 대략 이런 분포를 보일겁니다. 어느정도 공부 시간을 기점으로 저렇게 pass/ fail이 나뉘겠죠. 물론 공부 시간이 적은사람중에도 pass가 있을수 있고 공부를 많이 했음에도 fail을 받는 경우의 수가 있지만! 지금은 개념을 이해하는거니까 저렇게 나타냅시다! 그럼, 기존의 선형 그래프로는 저러한 이분법적인 경우를 대변할 수 없습니다. 어느 기점 이하에는 0을 어느 기점 이상에서는 1을 즉, 2분법적으로 나타낼 수 있는 그래프가 필요했죠.

그래서 찾아낸 그래프가 바로...! 시그모이드 함수입니다. 시그모이드 함수는 아래와 같이 나타낼 수 있습니다.

이 시그모이드 함수의 형태를 그래프로 한번 살펴볼까요?

어떤가요? 한 기점을 기준으로(여기서는 0) 한쪽으로는 급격히 떨어져 0에 수렴하고 다른 한쪽은 1에 수렴하는 우리의 상황에 적용하기에 아주 알맞은 아름다운 함수죠? ㅋㅋ 

여기서 z에는 우리가 선형회귀에서도 썻었던 wx+b (w = weight, b = bias)를 넣어주게 됩니다.

그럼 이제 로지스틱회귀의 가설 H(x)는 시그모이드 함수의 z에 wx+b를 넣은 1/(1+e^-(wx+b))가 되는 겁니다 ㅎㅎ

이제 모델을 학습시키기 위해서는 코스트함수를 구해야 하는데..! 가설의 형태가 바뀐 만큼 저번 선형회귀에서 사용했던 MSE를 사용하긴 어렵습니다 ㅜㅡㅜ 그러나..! (우리는 답을 찾을것이다 늘 그랬듯이..  ㅋㅋ 어디서 나온말인지 기억 하시나요? ) 아무튼 이를 해결 할 다른 방법이 있는데요. 

바로바로! 아래의 함수 입니다. 

y가 1일때는 -log(H(x))를, y 가 0일때는 -log(1-H(x))를 사용하는 것이죠. 그럼 실제로 이게 제대로 코스트함수의 역할을 하는지 확인을 해봐야 겠죠? 

그전에 코스트함수의 역할을 다시 상기시켜 봅시다. 코스트함수는 내 예측값이 정답(label)과 근사할수록 작게 나와야 하고 정답(label)과 차이가 많이 날 수록 그 값이 커져야 합니다. 왜냐면 우리는 코스트 함수를 작게 함으로써 학습을 시키는거니까요! 

다시 돌아와서, 각각의 함수의 그래프를 살펴봅시다. x축은 가설 y축은 코스트입니다. 

-log(H(x))

먼저 y =1 일때의 코스트함수 -log(H(x))를 살펴보면 위와 같습니다. 정답에 가까워 질수록 함수가 0에 수렴하고 정답과 멀어질수록 무한대에 수렴하니까 코스트 함수로 정말 적절한 함수죠? 

-log(1-H(x))

y가 0일때의 코스트함수 -log(1-H(x))를 살펴보면 마찬가지로 0이라는 정답에 가까워지면 코스트가 0에 수렴하고 정답과 멀어질수록 무한대에 수렴하네요 이것도 합격!

이제 각각의 0과 1이라는 경우에 따라 나누었던 함수를 하나의 함수로 표현을 해보면!

Cost function = -ylog(H(x)) - (1-y)log(1-H(x))가 됩니다. 복잡해보일수도 있는데, 전혀 복잡하지 않습니다

위 함수에 각각 y = 1, y = 0을 대입해보면 아까 봤던 0과 1일때의 함수가 도출되게 됩니다 ㅎㅎ 

이제 이 비용함수를 Gradient decent algorithm을 통해 비용을 낮추도록 학습을 시키면 끝!!! 

그럼 실전으로 돌아와 코드를 돌려 봅시다~

코드를 살펴보면, 트레이닝 데이터로 다음과 같이 설정했습니다. x 데이터의 경우 각각 일주일에 몇이 몇시간씩 공부했는지? 라고 생각을하고 y데이터의 0은 fail 1은 pass라고 생각합시다.

이제 플레이스 홀더를 만들고, 우리가 구할 w와 b를 변수로 선언해줍시다.  가설의 시그모이드 함수의경우 주석처리해놓은것처럼 자체적으로 구성해도 되지만, 텐서플로에서 제공하므로 텐서플로에서 제공하는 sigmoid함수를 쓰겠습니다!  predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)의 경우 가설이 0.5보다 크면 1 아니면 0으로 캐스팅 하겠다는 의미입니다. 이제 세션을 열고, 학습을 시키고 그과정을 프린팅 해보면 

매 스탭마다 비용함수가 작아지는것과, 각각의 경우에서 예측값과 정확도를 볼 수 있습니다. 

세번째의 경우 0.66255로 예측해서 0.5보다 큼으로 1로 도출을 했네요? 원래는 0이 정답인데 말이죠.

6개중에 하나를 틀려서 정확도가 0.8333%로 나오네요 ㅎㅎ.. 

이것으로 logistic회귀에 대한 정리를 마치고! Softmax classifer 내용으로 돌아오겠습니다 :)

댓글
링크
최근에 올라온 글
최근에 달린 댓글