로지스틱 회귀 분류(Logistic regression classification)
로지스틱 회귀를 이용한 대상 분류 방법
분류 알고리즘(classification algorithm) 중에서 굉장히 정확도가 높은 모델로 알려져 있음
바로 실제 문제에 적용이 가능
- 뉴럴 네트워크와 딥 러닝의 중요한 요소임
선형 회귀 분석 되돌아보기
아래 표와 같은 데이터에 대하여 회귀 분석을 해보자.
- 시간(\(x_1\))과 참석 횟수(\(x_2\))를 가지고 시험 성적(\(y\))을 예측하려고 한다.
- 시험 성적을 예측하는 것이 회귀 분석(regression)이다.
- 선형 회귀 분석(Linear Regression Analysis) 방법
- 가설식(hypothesis)을 만든다. \(H(\mathbf{X})=\mathbf{X}\mathbf{W} + \mathbf{b}\)
- cost(loss) 함수를 계산한다. \(\textrm{cost(loss)}(\mathbf{W}, \mathbf{b})=\frac{1}{m}\sum_{i=1}^m((\mathbf{W}\mathbf{X} - \mathbf{b} ) - \mathbf{Y})^2\)
- cost(loss) 함수가 최소가 되는 weight와 bias를 경사 하강법으로 찾는다. $$W=W-\alpha\frac{\partial}{\partial W}\textrm{cost(loss)}$$
분류(classification) 문제
스팸 메일 탐지(spam mail detection) : 스팸(spam) 또는 정상(ham)
페이스북 피드(facebook feed) : 친구들이 작성한 글을 타임라인에서 보여주기(show) 또는 감추기(hide)
- 이전에 '좋아요'를 눌렀던 글을 참고로 해서 보여줄지 말지를 결정
신용카드 비정상 거래 탐지(credit card fraudulent transaction detection) : 정상 거래(legitimate) 또는 비정상 거래(fraud)
- 이전에 사용했던 거래내역들의 형태를 보고 탐지
분류(classification) 문제를 기계적으로 학습을 시켜보자
분류 문제를 기계적으로 학습시키기 위해서는 분류 대상(category)을 '0'과 '1'으로 인코딩한다!
스팸(1) 또는 정상(0)
- 보여주기(1) 또는 감추기(0)
- 정상 거래(0) 또는 비정상 거래(1)
최근들어서는 굉장히 많은 곳에서 사용하기 때문에 중요!!
- 의료용 사진 판독 : 양성 종양인지 악성 종양인지 분류
주식 거래 : 이전의 주식 매매 패턴을 학습하여 살건지 팔건지 판단
로지스틱 회귀 분석 개념
- 공부한 시간을 토대로 시험에 합격(1)할 것인지 불합격(0)할 것인지 분류해보자.
- 합격/불합격 2가지로 분류(binary classification)하는 문제
선형 회귀 모델로 분석한다고 해보자.
- 선형 회귀 모델(\(H(x)=Wx+b\))을 만들면 아래 그림처럼 직선이 만들어진다.
- 0.5를 잡아서 왼쪽에 있으면 불합격, 오른쪽에 있으면 합격으로 분류할 수 있다.
그러나 이 모델은 문제가 있다!!!
- 예를 들어 50시간을 공부한 사람이 있다고 해보자.
일반 선형 모델에서는 50시간을 공부하면 결과값이 높게 나타날 것이지만 결과는 0과 1로 2가지이기 때문에 50시간을 공부한 사람의 값은 1이기 때문에 그래프 아래에 놓이게 된다.
- 이 사람에 맞춰서 다시 모델을 그리게 되면 기울기가 더 낮아지는 그래프가 그려질 수 밖에 없다.
- 0.5의 점선을 더 오른쪽으로 늘려보면 어떤 사람들은 기준보다 낮아져서 불합격으로 처리될 수 있다.
또 다른 문제
- 우리는 \(y\)의 값이 0 또는 1이라는 것을 알고있다. 그러나 가설식 \(H(x)=Wx+b\)는 0보다 작거나 1보다 클 수가 있다.
예를 들어, 데이터 \(\mathbf{x}=[1, 2, 5, 10, 11]\)을 가지고 학습을 통해 \(W=0.5\), \(b=0\)이라는 값을 얻었다고 해보자. 그러면 결과값은 \(0<H(x)<1\)이 될 것이다.
- 이 모델로 100시간을 공부한 사람을 모델에 적용해보자. \(H(100)=0.5\times 100=50\)이 나온다. 1보다 엄청 크기 때문에 모양이 좋지 않다.
따라서 우리는 결과값이 0부터 1사이에 있는 새로운 함수를 찾아야만 한다. 그래서 찾은 것이 sigmoid 또는 logistic 함수 \(g(z)\)(식 (1))이다.
\begin{eqnarray}g(z)=\frac{1}{1+e^{-z}}\tag{1}\end{eqnarray}
로지스틱 회귀 분류 모델
가설식(Hypothesis)
이제 우리는 \(z=Wx+b\)라고 하고, 가설식을 \(H(x) = g(z)\)로 하면 된다. 그러면 로지스틱 회귀 모델의 가설식은 식 (2)와 같다.
\begin{eqnarray}H(\mathbf{X})=\frac{1}{1+e^{-(\mathbf{W}^\intercal\mathbf{X}+\mathbf{b})}}\tag{2}\end{eqnarray}
cost(loss) 함수
- 선형 모델 \(H(x)=Wx+b\)일 때의 cost(loss) 함수는 식 (3)과 같으며 이를 그래프로 표현하면 아래 그림과 같다.
- 이 cost(loss) 함수의 장점은 경사 하강법을 사용할 때 어느 점에서 시작하던지 우리는 항상 최저점에 도달할 수 있다는 것이다.
\begin{eqnarray}\textrm{cost}(W,b)=\frac{1}{m}\sum_{i=1}^m\big(H(x_i) -y_i\big)^2\end{eqnarray}
그러나 로지스틱 회귀 분류 모델에서는 sigmoid 함수를 사용하기 때문에 가설식이 식 (2)처럼 된다. cost(loss) 함수의 그래프를 그려보면 아래 그림과 같이 구불구불하게 그려진다.
- 선형 모델에서는 어느 점에서 시작하던지 경사 하강법으로 최저점에 도달할 수 있다.
로지스틱 모델에서는 시작하는 점에 따라서 극소점이 달라지기 때문에 최저점에 도달하는 것이 어렵다. 그래서 cost(loss) 함수도 변형해야만 한다.
로지스틱 회귀 분류 모델의 cost(loss) 함수는 식 (3)과 같다.
\begin{eqnarray}\textrm{cost}(W,b)=\frac{1}{m}\sum\mathfrak{c}(H(x),y)\tag{3}\end{eqnarray}
\begin{eqnarray}\mathfrak{c}\left(H\left(x\right), y\right)=\left\{\begin{array}{ll}-\log H(x) &\textrm{if $y=1$}\\-\log(1-H(x))&\textrm{if $y=0$}\end{array}\right.\tag{4}\end{eqnarray}
cost(loss) 함수의 의미는 실제의 값과 예측한 값이 같으면 작아지고, 다르면 값이 커지도록 하는 것이다. 이렇게 되도록 가설식의 weight와 bias를 조정하는 것이다.
- 이제 \(y=1\)일 때를 생각해보자.
예측값이 \(H(x)=1\)로 맞았을 때의 cost(loss) 함수값을 계산해보자.
- cost(loss) 함수는 \(g(z)=-\log z\)이기 때문에 \(\textrm{cost}(1)=-\log 1=0\)이다.
- 예측값이 \(H(x)=0\)으로 틀렸을 때의 cost(loss) 함수값을 계산해보자.
cost(loss) 함수는 \(g(z)=-\log z\)이기 때문에 \(\textrm{cost}(0)=-\log 0=\infty\)로 값이 커져 벌을 줄 수가 있다.
- 이제 \(y=0\)일 때를 생각해보자.
예측값이 \(H(x)=0\)으로 맞았을 때의 cost(loss) 함수값을 계산해보자.
- cost(loss) 함수는 \(g(z)=-\log(1- z)\)이기 때문에 \(\textrm{cost}(1)=-\log (1-0)=-\log 1=0\)이다.
- 예측값이 \(H(x)=1\)로 틀렸을 때의 cost(loss) 함수값을 계산해보자.
- cost(loss) 함수는 \(g(z)=-\log (1-z)\)이기 때문에 \(\textrm{cost}(1)=-\log (1-1)=-\log 0=\infty\)로 값이 커져 벌을 줄 수가 있다.
- 이 새로운 cost(loss) 함수의 2가지 경우의 그래프를 결합하면 우리가 원하는 convex 함수를 만들 수 있게 되는 것이다.
\(\mathfrak{c}(H(x),y)\) 함수는 식 (4)처럼 \(y\) 값에 따른 if 조건문이 있기 때문에 코딩하려면 힘이든다. 그래서 코딩하기 쉽도록 if 조건문이 없는 형태로 정의하면 식 (5)와 같으며, \(y\) 값에 따라 식을 전개를 해보면 식 (5)는 식 (4)와 같다는 것을 알 수 있다.
\begin{eqnarray} \mathfrak{c}(H(x),y)&=&-y\log H(x)-(1-y)\log(1-H(x))\tag{5}\\&=&\left\{\begin{array}{ll}-1\times \log H(x) - (1-1)\times \log (1-H(x) )&\textrm{if \(y=1\)}\\-0\times \log H(x) - (1-0)\times \log(1-H(x))&\textrm{if \(y=0\)}\end{array}\right.\\&=&\left\{\begin{array}{ll}- \log H(x) - 0\times \log (1-H(x)) &\textrm{if \(y=1\)}\\- 1\times \log(1-H(x))&\textrm{if \(y=0\)}\end{array}\right.\\&=&\left\{\begin{array}{ll}- \log H(x) &\textrm{if \(y=1\)}\\- \log(1-H(x))&\textrm{if \(y=0\)}\end{array}\right.\end{eqnarray}
최종적으로 cost(loss) 함수는 식 (6)과 같다.
\begin{eqnarray}\textrm{cost}(W) = -\frac{1}{m}\sum_{i=1}^m\big(y_i\log H(x_i)+(1-y)\log (1-H(x_i))\big)\tag{6}\end{eqnarray}
경사 하강법(Gradient Descent Algorithm)
이제 cost(loss) 함수 식 (6)의 최소값을 구하기 위해 경사 하강법을 사용해보자.
- 기울기를 구하기 위해 식 (6)을 식 (7)과 같이 미분한다.
- 식 (7)을 계산하는 것은 복잡하다. 그러나 컴퓨터가 알아서 해주니 개념만 알고 있으면 된다.
\begin{eqnarray}W=W-\alpha\frac{\partial}{\partial W}\textrm{cost}(W)\tag{7}\end{eqnarray}
식 (6)의 코드는 다음과 같다.
import tensorflow as tf # cost(loss) 함수 cost = -tf.reduce_mean(Y*tf.log(hypothesis) + (1-Y)*tf.log(1-hypothesis))
- 식 (7)의 코드는 다음과 같다.
import tensorflow as tf # 경사 하강법 a = tf.Variable(0.1) # learning rate = alpha optimizer = tf.train.GradientDescentOptimizer(a) train = optimizer.minimize(cost)
'모두를 위한 머신러닝' 카테고리의 다른 글
Lesson 5 : Multinomial Classification: Softmax classification (0) | 2017.05.19 |
---|---|
Lesson 4 연습 : Logisitc Regression Classification (0) | 2017.04.19 |
Lesson 3 연습 : Multi-variable Linear Regression (1) | 2017.04.16 |
Lesson 3 : Multi-variable Linear Regression (0) | 2017.04.16 |
Lesson 2 연습 : Linear Regression의 Hypothesis와 cost의 개념 (0) | 2017.04.11 |