👩‍💻LEARN : ML&Data/Book Study

[모두의 딥러닝] #2-6. 로지스틱 회귀 모델

쟈니유 2023. 2. 11. 22:33
728x90

로지스틱 회귀, 결론만 생각하면 y가 범주형으로 나뉘는 (참과 거짓 등)걸 예측하는 것인데 이걸 수학적으로 이해하려니 쉽지가 않다. 

시그모이드 함수는 그냥 존재만 알고 이해할 생각을 안하던 함수인데 ...! 이해를 안하고 그냥 하려니까 찝찝한데 이해하기가 쉽지 않다..... 

 


#2-6. 로지스틱 회귀 모델 

 

1. 정의 

데이터를 설명하는 적절한 선을 그려가는 과정이나, 참(1)과 거짓(0) 사이를 구분하는 s 자 형태의 선을 그어주는 과정이다 

 

2. 시그모이드 함수 

  • 시그모이드 함수를 이용하여 로지스틱 회귀를 푸는 공식 
  • a = 그래프의 경사도를 결정 
  • b = 그래프의 좌우이동을 의미 

 

 

  • a값과 b값에 따라 오차가 변함 
    • a에 따라 변화하는 오차
      • a가 작아지면 수평선에 가까운 그래프가 되어 오차가 무한대로 커짐
      • a가 커지면 기울기가 확 늘어난 그래프가 되나 그렇다고 오차가 아예 사라지거나 커지진 않음 
    •  b값에 따라 변화하는 오차 
      • b가 너무 작거나 클 경우 오차는 커짐 (적정선을 찾아야 함) 

 

 

3. 오차공식 

  • 경사하강법을 사용할 예정이나 기존 선형외귀에서 사용했던 평균제곱오차를 사용할 수 없음
  • 시그모이드 함수의 특징으론 y가 0~1 사이에 있어 실제 y와 예측y의 오차가 커지는 경우는 [0,1] [1,0] 일때임 이를 공식으로 만드는 함수는 로그함수이므로 오차를 확인하기 위해 로그함수를 사용해야 함 

 

4. 로그함수 

  • y = a**x의 역함수인 log(a)x (이하 log h)는 기존 a**x의 그래프와 대칭되는 형태로 나타남 
  • logh에서 전체 혹은 x에 +-, 이동을 가감하며 그래프를 만들 수 있음 

  • -logh : 실제 값이 1일 때 사용
    • 예측값이 1일때 오차가 0이며 예측값이 0 에 가까워질수록 오차가 커짐 
  • -log(1-h) : 실제 값이 0 일때 사용 
    • 예측값이 0일때 오차가 없고 1에 가까울수록 오차가 커짐 
  • 위 두 가정을 종합하면 아래와 같은 식으로 해결할 수 있음 
    • 이 식을 손실함수 중 교차 엔트로피 오차 함수라고 함 
  • 교차 엔트로피 오차 함수 

y가 1일 경우 A만 살아남고 0일경우 B만 살아남는 식

 

5. 텐서플로에서 실행하는 로지스틱 회귀 모델 

 

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')) #시그모이드 함수

#교차엔트로피오차 함수를 사용해보자 (sgd=경사하강법, loss=오차계산법의미)

model.compile(optimizer='sgd', loss='binary_crossentropy')

#그래프로 확인해보기

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))

1/1 [==============================] - 0s 83ms/step 7 시간을 공부할 경우 합격예상확률은 4.3% 입니다.

 

여기까지는 학습을 안시켜서...그랬다. (앞에 깜박하고 ...)

model.fit으로 학습을 시켜보자... 근데 예시엔 epochs 5000이었는데 그냥 귀찮아서 2000으로 돌려봤다 

model.fit(x,y,epochs = 2000)

7 시간을 공부할 경우 합격예상확률은 63.6% 입니다.

 

오 내가 아는 시그모이드함수에 가까워짐. 5000번 돌리면 훨씬 가까워지긴 할것같다