본문 바로가기
Data Science/머신러닝

Logistic Regression(Classification) 나만의 정리

by 코딩은 잼있어 2020. 6. 28.
728x90

Logistic Regression - Classification

1. Logistic Regression(Classification) 개념

  • 어떠한 input의 결과의 선택지가 2개만 존재하는 경우에, 둘중 하나를 결정하는 문제를 이진 분류(Binary Classification)라고 한다. 이러한 이진 분류 문제를 풀기위한 대표적인 알고리즘이 Logistic Regression(로지스틱 회귀)라고한다.

  • input에 따른 output이 2가지로 나뉘는 Pass(1) or Fail(0) 인 Training Data를 이용해 learning 학습을 진행시킨 System을 이용하여 Test Data의 input의 output(Pass(1) or Fail(0)) 을 예측하는 시스템

이진분류 (Binary Classification)

  • 앞서 선형회귀챕터의 경우 공부시간과 성적 간의 관계를 직선의 방정식으로 표현한다는 가정하에, 가중치 W와 바이어스 b를 찾아 데이터를 가장 잘 표현하는 직선을 찾았다. 하지만, 둘 중 하나의 선택지 중에서 정답을 고르는 경우 직선으로 표현하는건 적절하지 않다.
score(x) result(y)
45 불합격
50 불합격
55 불합격
60 합격
65 합격
70 합격
  • 위 표를 그래프로 표현하면 아래 그래프처럼 표현이 가능하다

img

2. 비용 함수(Cost function)

  • 분류 시스템(Classification)에서의 최종 출력값은 sigmoid 함수에 의해 논리적으로 0 또는 1을 가지기 때문에, 연속 값을 갖는 선형회귀(linear regression)와는 다른 손실함수가 필요함!
  • 선형회귀에서는 비용함수를 구하기 위한 가설(Hypothesis)을 H(x) = Wx + b를 사용하지만, 로지스틱회귀의 경우에는 결과값이 0 또는 1이니까 H(x) = Wx + b가 아닌 결과가 0 or 1로 나오는 시그모이드 함수를 이용해야함!!

(1) 시그모이드 함수

시그모이드 함수에 H(x) = Wx + b을 대입하여 가설(Hypothesis)을 정의해보자

img

앞선 선형회귀에서는 가중치 W는 직선의 기울기를 의미했지만, 여기서는 그래프의 경사도를 결정한다. W가 커지면 경사도가 커지고, W가 작아지면 경사도가 작아진다.

반면, b의 경우 값에 따라서 그래프가 이동하는 것을 보여준다.

시그모이드 함수란 ???

img

  • sigmoid 함수란 어떠한 입력값에 대해 출력값이 0~ 1사이의 값을 가지는 함수이다
  • sigmoid 함수의 실제 계산값(sigmoid(z))은 결과가 나타낼 확률을 의미함. 다시말해서 sigmoid(z)이 0.5보다 크면 0보단 1이 될 확률이 더 높음!! 반면에 0.5보다 작으면 0이 될 확률이 높다!!

이러한 특징때문에 Classification하는데 용이하게 쓰임

즉 , 시그모이드 함수를 가설로 정의하자img을 사용해서

  1. 0.5보다 크면 출력 값 H(c) = 1을 정의하고
  2. 0.5보다 작으면 H(x) = 0 으로 정의하여
  3. Classification시스템을 구현할수 있다!!

(2) 손실함수(cross-entropy)

  • Logistic Regression 에서는 경사하강법을 잘못 사용할경우 잘못된 최소값에 빠질수도있다. 아래 그래프처럼 경사하강법을 사용할경우 기울기가 0인 지점이 비용함수가 최소지만, 로지스틱회귀인 경우 기울기가 0인지점이 여러개가 될수있다. 이는 cost가 최소가 되는 가중치 W를 찾는다는 비용함수의 목적에 맞지 않다.
참고!!

비용함수 == 손실함수 == 목적함수, 모두 같은말

img

  • 가중치 W를 최소로 만드는 새로운 비용함수를 만들어야한다. 유도과정은 알필요 없고, 결과식만 알면 됨!!

결과적으로 로지스틱 회귀에서 찾아낸 비용함수는 아래와 같습니다.

Cross Entropy 함수라고 한다.

img

여기서 H(x)는

img

결국 목적은???

Cross Entropy 함수의 최소값을 갖는 W와 b를 찾는것!!

3. Classification 에서의 W, b 계산 프로세스

정리!!!

img

우선 임의의 직선 z = Wx + b를 가정한뒤에,

  1. z = Wx + b를 Classification 위한 결과를 0 or 1출력을 위해 H(x) = sigmoid(z)의 결과를 출력
  2. H(x)를 활용하여 손실함수(cross-entropy)를 계산한다
  3. 그 손실함수가 최소값인지 판단한다. 만약 최소값이면 ==> 학습을 종료하고 W, b를 저장한다.
  4. 최소값이 아니라면 가중치 W와 바이어스 b를 업데이트하고 다시 1~3번과정을 반복한다.

4. simple logistic regression 예제

img

  1. 학습데이터
  2. W,b를 랜덤으로 계속해서 정의
  3. 오차를 구하기 위한 손실함수(훈련을 반복적으로 계속해서 시킬경우 오차는 줄어듬)

img

  1. 미분을 위한 함수

img

  1. 계속해서 학습을 진행하면서 W, b를 갱신해나간다.. 만약에 10001보다 더 많은 횟수를 훈련시킬경우 오차율은 점점 낮아지고 W, b의 값의 신뢰도는 높아진다

출력값

img

10000번을 훈련시킬경우 오차율은 0.62까지 떨어질정도로 낮아짐

이때 3, 10, 13, 17시간 공부시 13시간의 y값이 0.53이 되어, 이때부터 합격함을 알수있다.

5. 케라스로 로지스틱회귀를 구현해보자!!

import numpy as np
from keras.models import Sequential # 케라스의 Sequential()을 임포트
from keras.layers import Dense # 케라스의 Dense()를 임포트
from keras import optimizers # 케라스의 옵티마이저를 임포트
# 1. 훈련데이터
#숫자 10 미만은 0, 10이상은 1
X=np.array([-50, -40, -30, -20, -10, -5, 0, 5, 10, 20, 30, 40, 50])
y=np.array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1])

# 2. 모델 설정
# 옵티마이저는 경사하강법 sgd를 사용합니다.
# 손실 함수(Loss function)는 binary_crossentropy(이진 크로스 엔트로피)를 사용합니다.
# 주어진 X와 y데이터에 대해서 오차를 최소화하는 작업을 200번 시도합니다.
model=Sequential()
# 시그모이드 함수를 사용하기 위해 activation='sigmoid'
model.add(Dense(1, input_dim=1, activation='sigmoid'))
sgd=optimizers.SGD(lr=0.01)
# 이진 분류 문제에 크로스 엔트로피 함수사용을 위해 loss='binary_crossentropy'
model.compile(optimizer=sgd ,loss='binary_crossentropy',metrics=['binary_accuracy'])
# 전체데이터에 대한 훈련횟수는 epochs=200
# 임의의 W, b를 200번 넣으면서 손실함수가 최소인 W, b를 찾아낸다.
model.fit(X,y, batch_size=1, epochs=200, shuffle=False)
# 3. plt 출력
import matplotlib.pyplot as plt
plt.plot(X, model.predict(X), 'b', X,y, 'k.')
plt.show()

# 4. testdata로 결과 예측
print(model.predict([1, 2, 3, 4, 4.5]))
print(model.predict([11, 21, 31, 41, 500]))

img

img

200번의 훈련결과 손실함수 loss는 0.0881이가 되고, 이를 바탕으로

testdata의 예측결과값을 출력하면 11부터 0.5가 넘는 결과를 볼수있다.

728x90