이번 포스팅에서는 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/13 - [Deep Learning/[Books] Do it! 정직하게 코딩하며 배우는 딥러닝 입문] - [모델 구축] 로지스틱 손실함수와 오류 역전파 이해하기
'Deep Learning > [Books] Do it! 정직하게 코딩하며 배우는 딥러닝 입문' 카테고리의 다른 글
[데이터 전처리] 스케일 조정 (2) | 2020.07.30 |
---|---|
[모델 구축] 이진분류 로지스틱 회귀모델 구현하기 - 심화 (0) | 2020.07.27 |
[모델 평가] 훈련데이터셋 나누기 (feat.train_test_split()) (5) | 2020.07.20 |
[데이터 탐색] 데이터 탐색에 유용한 함수 2탄 - boxplot(), unique() (2) | 2020.07.16 |
[모델 구축] 로지스틱 손실함수와 오류 역전파 이해하기 (0) | 2020.07.13 |