로지스틱 회귀 개요
안녕하세요
시험을 보면 점수가 중요합니다. 하지만 점수보다 더중요한게 있죠 바로 합격과 불합격입니다.
몇시간 공부해서 점수 예측이 아닌 합격 불합격 예측을 하고자할때 쓰이는 회귀가 로지스틱 회귀 입니다.
로지스틱 회귀 정의
다음과 같은 표가있다고 해봅시다.
이걸 그래프로 나타내 봅시다. 합격을 1 불합격을0 이라고 해봅시다.
이 표를 그래프로 나타내면 직선으로는 나타낼수 없습니다.
다음과 같이 s자형태가 됩니다.
이 점들을 선으로 그어보면 다음과 같습니다.
회귀란 데이터에 가장 적절한 선을 찾는 과정입니다. 로지스틱 회귀도 마찬가지로 적절한 선을 찾는 그런 과정인데요
저 s자 그래프선을 가장 적절하게 나타내는 선을 찾는 과정이 로지스틱 회귀입니다. 그리고 이 그래프 선을 나타내는함수가 바로 시그모이드 함수입니다.
시그모이드 함수
시그모이드 함수 식입니다.
$$ y = \frac{1}{1+e^-(ax+b)} $$
이식을 통해 알수있듯이 결국 a값과 b값을 찾아야 됩니다.
시그모이드 함수는 a값이 커질때 경사가 커지고 a값이 작아질때 경사가 작아집니다.
파란색은 a값이 5 b값이 1일때 그래프이고
빨간색은 a값이 2 b값이 1일때 그래프 입니다.
보시면 a값이 높은 파란색이 상대적으로 a값이 낮은 빨간색 보다 경사가 더 높은걸 알수있습니다.
b값에 의미는 그래프의 좌우이동을 의미합니다.
가운데 그래프가 a = 2 b = 0일때 그래프이고
왼쪽 파란색이 a = 2 b = + 1
오른쪽 초록색이 a = 2 b = -1 일때 그래프입니다.
b값에 의해 좌우이동이 된걸 확인할수있습니다.
오차 공식
그렇다면 a와 b값과 오차는 어떠한 관계를 가지는지 확인해봅시다.
먼저 a값의 변화로 인한 오차 그래프를 살펴봅시다.
a값이 커지면 오차는 작아지고 a값이 작아지면 오차는 커집니다.
하지만 a값이 계속 작아진다고해도 오차가 계속 커지지않습니다. 반면에 a값이 계속 커진다해도 오차가 무한대로 작아지지 않습니다.
시그모이드 함수식에 a값이 커지면 그만큼 분모의 값이 커지는걸 알수있습니다. 따라서 y의 값은 점점더 떨어지는걸 확인할수 있습니다. 하지만 계속 커져도 오차는 계속 작아지지도 않고 커지지도 않다라는걸 확인할수있습니다.
이번엔 b값에 변화에 따른 그래프를 살펴봅시다.
b값이 커지면 오차도 커지도 b값이 작아져도 오차가 커집니다. 거의 2차함수와 유사한 그래프가 나옵니다.
그렇다면 이 둘을 합친 오차공식은 어떻게 될까요? 경사하강법을 이용하면 됩니다.
시그모이드 함수를 살펴보면 y값이 0과 1사이 입니다. 실제값이 1일때 예측값이 0에 가까워 지면 오차가 커집니다. 반대로 실제값이 0일때 예측값이 1에 가까워지는 경우에도 오차는 커집니다.
이때 교차 엔트로피 오차함수가 쓰입니다.
식은 다음과 같습니다.
$$ -{y logh + (1-y)log(1-h)} $$
선형회귀에서는 평균 제곱 오차함수를 썼지만 로지스틱 회귀에서는 교차 엔트로피 오차함수를 씁니다.
텐서플로로 로지스틱 회귀모델 구현
이제 파이썬과 텐서플로로 로지스틱 회귀모델을 구현해봅시다.
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
x = np.array([2,4,6,8,10,12,14])
y = np.array([0,0,0,1,1,1,1])
model = Sequential()
model.add(Dense(1,input_dim=1,activation='sigmoid'))
model.compile(optimizer='sgd',loss='binary_crossentropy')
model.fit(x,y,epochs=5000)
plt.scatter(x,y)
plt.plot(x,model.predict(x),'r')
plt.show()
hour = 7
prediction = model.predict([hour])
print("%.f시간을 공부할 경우, 합격 예상 확률은 %.01f%%입니다." %(hour,prediction * 100))
라이브러리를 설정해주고 배열을 설정해둔다음
활성화 함수로 시그모이드 함수를 설정하였습니다. 그다음 옵티마이저로 교차 엔트로피 함수를 설정한다음 에포크를 5000으로 설정했습니다. 실행하면 다음과 같은 결과를 얻습니다.
7시간 공부할경우 합격할 확률은 59%라고 합니다.
'Coding > AI' 카테고리의 다른 글
다층퍼셉트론이란 무엇인가 (0) | 2023.10.11 |
---|---|
인공지능의 시작 퍼셉트론 아달리안 (0) | 2023.10.10 |
Tensorflow로 선형회귀를 구현해보자 (0) | 2023.10.08 |
다중선형회귀란 무엇인가 (0) | 2023.10.07 |
경사하강법이란 무엇인가 (0) | 2023.10.04 |