본문 바로가기
Tensorflow

Logistic Regression with Tensorflow 2.0 (1)

by 청양호박이 2020. 2. 5.

Logistic Regression(논리회귀) 모델링방법은 독립변수의 선형결합을 통해서 결과가 나올 가능성을 예측하는 기법입니다. 이는 지금까지 봤었던 Linear Regression(선형회귀)와 동일하게 독립변수와 종속변수의 관계를 hypothesis(가설)라는 구체적인 함수로 모델링 한다는 점에서는 동일합니다. 

 

하지만 종속변수가 Linear Regression에서는 연속형이고, Logistic Regression에서는 범주형의 형태를 띈다는 차이가있습니다. 따라서 간단하게 종속변수가 예를들어 0,1의 범주일경우 binary classification(이진분류)이라고도 불리우는 이유입니다.

  • Linear Regression 종속변수 유형 : 24, 178, 712, 36
  • Logistic Regression 종속변수 유형 : (0, 1), (True, False), (0, 1, 2, 3), (서울, 인천, 부산)

 

 

1. 특징


이전에 알아본 Linear Regression은 아래와 같은 분포를 띄며, 가장 Loss가 적은 hypothesis를 모델링합니다. 따라서 hypothesis(가설)은 직선으로 표현이 가능합니다.

그렇다면 Logistic Regression은 어떤분포를 띌까요??

다음과 같이, 어떤 독립변수에도 0, 1의 label을 가집니다. 이 문제를 Linear Regression의 Hypothesis로 모델링을 하게되면, 아래 그림과 같이 결과가 1보다크고 0보다 작은 경우가 많이 발생하고 결국 어마어마한 Loss의 발생으로 끝나게 됩니다.

따라서 우리에게는 어떤경우에도 결과가 0~1사이의 값으로 나오는 새로운 hypothesis가 필요합니다.

 

 

2. hypothesis (가설)


앞서 이야기했던 바와 같이, Logistic Regression의 경우는 label이 0,1의 범주형으로 분류됩니다. 따라서 입력되는 독립변수에 대해서 1이나올확률 or 0이나올확률로 그 모델의 정확도를 판단할 수 있습니다.

 

이렇게 앞에 썰을 좀 푸는 이유는... hypothesis를 세우는데 정의를 말하기 전에 story로 설명을 해보고자 함 입니다. 사실 어떤 문제를 푸는데 어려운 문제의 경우 특정한 답이 없기 때문에, 정말 예측하지 못한 부분에서 그 해결책을 발견할 수 있습니다. 저도 알고리즘 문제를 풀때보면, 정말 이건 연관성이 없는것 같은데... 적용을 해보면 너무나 정답을 도출하는 방법인 경우도 있으니까요... 

 

Logistic Regression의 모델링을 위해서 많은 수학자들은 고심을 했었겠죠?? Linear Regression의 가설도 적용해보고 다른 여러가지를 적용해 보았을 것 입니다. 그 중에서 독립변수가  범주형이고 label의 값에 도달하기 위한 확률로 모델을 정의하고자 하는 사람이 있었습니다. 이 사람은 Odds를 가지고 가설을 세우기 시작했습니다.

 

Odds란...

「도박이나 통계에서 말하는 승률을 표현하는 숫자 식을 말함」

 

이런 Odds는 아래와 같이 정의됩니다. 

Odds = P / (1 - P)

기준 : P(y=1 | x) 는 독립변수 x에 대해서 y가 1일 확률

 

이 함수의 모양은 우상향으로 올라가는 볼록함수의 모양을 가지게 되는데, 이때 여기에 Log를 취하게 됩니다. 그리고 이를 logit이라고 부르고 f(x) = W * x + b 와 같다고 정의하게됩니다. 

 

정리하면, 

ln(Odds) = ln(P / (1 - P)) = f(x)

P / (1 - P) = np.exp(f(x))

P = (1 - P) x np.exp(f(x))

P + P x np.exp(f(x)) = np.exp(f(x))

P(1 + np.exp(f(x))) = np.exp(f(x))

P = 1 / (1 + np.exp(-f(x)))

 

Sigmoid Function - 「hypothesis = P = 1 / (1 + np.exp(-f(x)))

 

가 됩니다. 이게 어떻게 생겼는지 한번 그려보겠습니다. 

import numpy as np
import matplotlib.pyplot as plt

def hypothesis(x):
    return 1 / (1 + np.exp(-x))

x = np.arange(-10, 10, 0.1, dtype=np.float32)

plt.plot(x, hypothesis(x))
plt.show()

이 모양은 위에 가정한 바와 같이, 독립변수 입력에 대해서 항상 0< <1 사이의 값을 갖는 분포를 가집니다. 이를 sigmoid 함수라고 합니다. 결국 Logistic Regression의 hypothesis는 sigmoid함수입니다.

 

 

3. Loss (손실, 비용, 오차)


이번에도 Linear Regression에서 구한 방식과는 다르게 접근해 봅니다. Loss는 다른말로 하면, Model의 정확도를 나타내는 척도라고 할 수 있습니다. Linear Regression의 경우에는 Model의 결과와 실제 정답지와 비교하여 오차를 계산하고 그 집합의 MSE를 구해서 Loss를 판단했었습니다. 반면 Logistic Regression은 확률인만큼... 정답지가 1일 경우 Model에서 1이 나올 확률을 극대화하고, 0일 경우 Model에서 0이 나올 확률을 극대화하는 Model을 도출하는 것을 정확도의 척도로 정의하겠습니다.

 

Model의 최종정확도는 결국 각 독립변수들의 결과 확률들의 곱으로 표현이 가능하고, 식으로 나타내면...

 

argmax ∏ P(y=1 | x,w) * ∏ P(y=0 | x,w)

argmax ln( ∏ P(y=1 | x,w) * ∏ P(y=0 | x,w) ) 

∴ log를 취해서 결과의 방향성은 차이가 없지만 곱을 합으로 만드는 매직으로 사용

argmax ∑ ln P(y=1 | x,w) + ∑ ln P(y=0 | x,w)

argmax ∑ ln P(y=1 | x,w) + ∑ ln (1 - P(y=1 | x,w))

argmax ∑ y * ln h(x) + (1-y) * ln (1 - h(x))

- argmin ∑ y * ln h(x) + (1-y) * ln (1 - h(x))

(Gradient Descent에서 Loss가 최소인 경우를 구해야 하기 때문에 - 를 곱해줌)

 

∑ (n array summation) ∏(n array product)

 

「결국 Loss = E(w) = - ∑ y * ln h(x) + (1-y) * ln (1 - h(x))」

 

이렇게 도출이 됩니다. 이를 Cross Entropy 함수라고 부릅니다.

 

 

4. optimizer (최적화)


GDA (Gradient Descent Algorithm)등의 optimizer를 적용하려면 E(w)의 기울기를 구해야하고 결국 E(w)의 미분식을 알아야 합니다. 결국 Tensorflow나 Keras를 통해서 구현한다면, 자동으로 구해지겠지만 궁금하시는 분도 있을 것 같아서 보자면...

 

우선 sigmoid(x) = 1 / (1 + np.exp(-f(x)))의 미분은 sigmoid(x) * (1 - sigmoid(x))가 됩니다.

그럼 본격적으로 main인 E(w)를 미분해 보면... 아래와 같습니다.

 

∂w (- ∑ y * ln h(x) + (1-y) * ln (1 - h(x)))

 

왠지 정식적인 수식입력이 어려워서 말로 풀어쓰다보니... 잘 안보이네요...ㅠㅠ 

방식은 (w미분을) 순차적으로 이동하면서 적용하고 chain rule을 적용해서 단계적으로 미분을 진행해 보겠습니다.

 

- ∑ y * ∂w (ln h(x)) + (1-y) * ∂w (ln (1 - h(x)))

- ∑ y * ∂w h(x) / h(x) + (1-y) * ∂w (1 - h(x)) / (1 - h(x))

- ∑ y * h(x) * (1 - h(x)) * ∂w f(x) / h(x) - (1-y) * h(x) * (1 - h(x)) * ∂w f(x) / (1 - h(x))

- ∑ y * (1 - h(x)) * x - (1-y) * h(x) * x

- ∑ (y - yh(x) - h(x) + yh(x) ) * x

∑ (h(x) - y) * x

 

「결국 Gradient = ∂E(w) = ∑ (h(x) - y) * x

 

어라 이 모습은... 어디서 많이 본 기억이 나지 않으신가요?? Linear Regression의 Gradient와 동일한 형태입니다. 이제 이를 통해서 W new = W old - learning_rate * Gradient로 구하면 됩니다.

 

 

 

5. Summary


Hypothesis (가설) : Sigmoid Function - 「hypothesis = P = 1 / (1 + np.exp(-f(x)))」 

 

Loss (손실, 비용, 오차) : 「Loss = E(w) = - ∑ y * ln h(x) + (1-y) * ln (1 - h(x))」

 

Optimizer (최적화) 

     Gradient : 「Gradient = ∂E(w) = ∑ (h(x) - y) * x

     GDA : W new = W old - learning_rate * Gradient

 

다음에는 기존과 유사하게 Numpy, Tensorflow 2.0, Keras를 통해서 각각 모델링을 진행해 보겠습니다.

 

-Ayotera Lab-

댓글