로지스틱 회귀(Logistic Regression)

import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
import matplotlib.pyplot as plt

아래와 같은 데이터가 있다고 생각해보겠습니다. 독립변수 x는 0-9까지의 값이 입력되어 있고 종속변수 y는 연속된 수치 형태의 값이 아닌 0,1의 이항변수로 되어 있습니다. 데이터를 통해 보니 0-4까지는 0, 5-9까지는 1을 리턴하는 형태입니다. 예를 들어서 체력 테스트를 하는데 턱걸이 0-4까지는 0(불합격), 5-9까지는 합격(1) 이라고 가정해보겠습니다.

이러한 문제를 선형회귀의 형태로 분석해본다면 어떻게될까요? 분석이 가능할까요?
가능해보기도 합니다. 먼저 데이터를 시각화 해보겠습니다.

x = [[1],[2],[3],[4],[0],[5],[6],[7],[8],[9]]
y = [0,0,0,0,0,1,1,1,1,1]
line = np.linspace(0,1,num=10)
yline = np.linspace(0.5,0.5,num=10)

plt.scatter(x,y)
plt.plot(line)
plt.plot(yline)

데이터를 시각화 해보면 위와 같은 형태의 그래프가 표시됩니다. 그리고 이러한 데이터라면 선형회귀로도 가능할듯 보입니다. 0-4, 5-9의 데이터를 중간에 주황색 선을 0.5를 기준으로 입력되는 데이터가 0.5 보다 크면 1을 출력하고 작으면 0을 출력하게 하면 될것같습니다.
이러한 기본 컨셉을 가지고 선형회귀를 통해서 해당 내용을 구현해보겠습니다.

from sklearn.linear_model import LinearRegression
linear = LinearRegression().fit(x,y)
predict = linear.predict([[50]])
print(predict)
# 7.39393939

위와 같은 모델을 구현하고 테스트 해보니 0-9까지의 턱걸이 갯수로는 예측이 비교적 잘되는듯 보입니다. 하지만 어떤 사람이 와서 턱걸이를 50회 혹은 그 이상을 하게되면 예측치가 합격(1)/불합격(0)을 벗어서나 7이라는 숫자가 나오게됩니다. 더 큰 숫자를 입력하면 예측치가 더 높게 나오겠죠.

이렇게되면 이 모델은 사용할 수가 없습니다.
만약 이럴 때에 턱걸이를 아무리 많이 해도 합격과 불합격으로만 결과치를 표시하고 싶다면 어떻게 하는게 좋을까요?

이럴 때에 사용하는 것이 로지스틱 회귀입니다. 같은 데이터로 sklearn의 로지스틱회귀(LogisticRegression) 패키지를 사용해서 모델을 만들어보면 50이라는 큰 숫자를 입력해도 합격을 의미하는 1이라는 값을 보여주게됩니다.

from sklearn.linear_model import LogisticRegression
logistic = LogisticRegression().fit(x,y)
predict = logistic.predict([[50]])
print(predict)
# 1

이러한 것을 가능하게 해주는 것은 Hypothesis가 기존의 선형회귀 모델과 다른 특별한 형태를 가지기 때문입니다. 이것을 Sigmoid라고 부릅니다.

이 함수에서 보면 z의 값은 선형회귀의 Wx+b의 값, 즉 선형회귀에서의 출력값을 사용합니다. 수식에 따라서 출력은 0-1 사이의 실수 값을 리턴하게 되고 0.5를 기준으로 작으면 0을 크면 1을 출력해줄 수 있게됩니다.

그렇다면 최적화는 어떻게 하게될까? 선형회귀에서는 MSE(Mean Square Error)를 사용하지만 로지스틱에서는 아래와 같은 Cross-Entropy를 사용합니다.

https://towardsdatascience.com/cross-entropy-for-classification-d98e7f974451

위의 식은 두개의 식을 하나로 합친 것입니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다