Yet Never Lose Faith

- Good to Great , Jim Collins

How To Preprocess Image Data 자세히보기

Deep Learning/[Books] Do it! 정직하게 코딩하며 배우는 딥러닝 입문

[모델 구축] 이진분류 로지스틱 회귀모델 구현하기 - 기본

Kellyyyy 2020. 7. 23. 08:00

 

이번 포스팅에서는 python을 사용하여 로지스틱 회귀모델을 구현해본다. 

 


로지스틱 회귀모델 구조

 

  훈련단계 예측단계
기능 최적의 가중치와 절편을 찾음. 예측값 계산, 향후 성능평가에 사용.
사용 데이터세트 훈련세트 테스트세트

 

 

머신러닝 모델 구현로직은 크게 훈련단계와 예측단계로 나눌 수 있다. 훈련단계는 최적의 가중치와 절편을 찾는 로직인데, 입력데이터로 훈련세트를 사용한다. 예측단계는 훈련단계에서 찾은 가중치와 절편을 사용하여 예측을 실행하는 단계이다. 이때 출력된 예측값은 모델의 성능을 평가하는데 사용한다. 입력데이터로는 테스트세트를 사용한다. 로지스틱 회귀모델의 구조를 살펴보고, 각 단계에서 어떤 함수들이 필요한지 정리해보자.

 

 

로지스틱회귀모델의 구조

 

 

로지스틱 회귀모델은 선형함수, 활성화함수, 임계함수로 이루어져 있다. 선형함수는 가중치와 절편으로 이루어진 1차함수이고, 무한대 범위의 Z값을 출력한다. 활성화함수는 선형함수 출력값인 Z값을 입력 받아 0~1의 범위의 값 a를 출력한다. 훈련단계와 예측단계 모두 활성화함수 단계까지는 동일한데, 활성화함수 이후에 a를 처리하는 방식이 다르다. 훈련단계에서는 활성화함수의 출력 a를 타깃과 비교하여 가중치를 업데이트하는 역전파를 진행한다. 반면, 예측단계에서는 활성화 함수의 출력 a를 임계함수의 입력으로 전달하여 0 또는 1의 예측값을 출력한다.

 

 

  훈련단계 예측단계
기능 최적의 가중치와 절편을 찾음.
예측값 계산, 향후 성능평가에 사용.
활성화함수 이후 역전파 계산, 가중치와 절편 업데이트 임계함수 계산, 예측값 출력
사용 데이터세트 훈련세트 테스트세트

 

 


LogisticNeuron

 

import numpy as np

class LogisiticNeuron : 

  # (1) 직선방정식 계산
  def linear(self, x) :
    z = np.sum(x * self.w) + self.b
    return z

  # (2) 활성화함수 계산  
  def activation(self, z) :
    a = 1 / (1 + np.exp(-z))
    return a

  # (3) 오류역전파 계산
  def backprop(self, x, err) :
    w_grad = x * err
    b_grad = 1 * err
    return w_grad, b_grad

  # (4) 훈련메소드
  def fit(self, x, y, epochs=100) :
    self.w = np.ones(x.shape[1])
    self.b = 0
    for i in range(epochs) :
      for x_i, y_i in zip(x,y) :
        z = self.linear(x_i)
        a = self.activation(z)
        err = -(y_i - a)
        w_grad, b_grad = self.backprop(x_i, err)
        self.w -= w_grad
        self.b -= b_grad
        
  # (5) 예측메소드
  def predict(self, x) :
    z = [self.linear(x_i) for x_i in x]
    a = self.activation(np.array(z))
    return a > 0.5

 

 

(1) 직선방정식 : 입력데이터를 받아 Z를 출력한다.

(2) 활성화함수(시그모이드 함수) : Z를 입력받아 0~1 범위의 a로 변환한다.

(3) 역전파함수 : a와 타깃을 비교하여 가중치, 절편 변화량을 계산한다.

(4) 훈련메소드 : 모든 훈련세트 샘플에 대해 (1)~(3) 계산을 진행하고 이 과정을 100회(epochs = 100) 반복하는 훈련을 진행하는 메소드이다.

(5) 예측메소드 : 모든 테스트세트 샘플에 대해 (1)~(2) 계산을 진행하고 출력값 a에 대해 0.5이상이면 true, 0.5이하면 false를 출력한다.


훈련 및 성능평가

 

# 모델 훈련
neuron = LogisiticNeuron()
neuron.fit(x_train, y_train)

# 모델 성능 평가
np.mean(neuron.predict(x_test) == y_test)
# 0.82456

 

필요한 함수들을 모두 생성했으니 훈련과 성능평가를 진행해보자. LogisticNeuron 객체를 하나 생성하고 fit()을 호출하여 훈련세트에 대해 모델을 학습시켰다. 훈련이 끝난 후에는 predict()를 호출하여 예측값을 구하고 타깃과 비교, 정답률을 출력했다. 정확도는 82% 정도가 나왔는데 아주 훌륭하진 않다. 사실 이렇게 계산 로직을 직접 구현해서는 높은 성능을 얻긴 힘들다. 사이킷 런에서는 이 모든 계산과정을 구현해놓은 패키지들이 많으니 실전에서는 패키지 사용을 권한다. 구체적인 사용방법은 다음 포스팅에서 다뤄보겠다.

 

 

[Reference.]

도서

- Do it! 정직하게 코딩하며 배우는 딥러닝 입문, 박해선 지음, 이지스퍼블리싱

 

[Recommended Post]

2020/07/20 - [Deep Learning/[Books] Do it! 정직하게 코딩하며 배우는 딥러닝 입문] - [모델 평가] 훈련데이터셋 나누기 (feat.train_test_split())

2020/07/09 - [Deep Learning/[Books] Do it! 정직하게 코딩하며 배우는 딥러닝 입문] - [모델 선정] 이진분류 알고리즘 3가지 (퍼셉트론, 아달린, 로지스틱 회귀)

2020/07/13 - [Deep Learning/[Books] Do it! 정직하게 코딩하며 배우는 딥러닝 입문] - [모델 구축] 로지스틱 손실함수와 오류 역전파 이해하기