로지스틱 회귀(Logistic Regression) (1) 이해하고 사이킷런에서 사용해보기
Jan. 17, 2022, 11:52 p.m.
이번에는 퍼셉트론에 이어 제일 유명하고 간단한 회귀 모델인 로지스틱 회귀(Logistic Regression)을 알아보겠습니다.
1. 정의
로지스틱 회귀는 아주 간단하면서도 선형 분류 문제에서 뛰어난 성능을 보이는 모델이에요. 이 모델은 활성화 함수로 시그모이드 함수를 사용하는 것이 특징이라고 볼 수 있습니다.
시그모이드(Sigmoid)는 로짓(Logit) 함수에서 비롯된 함수인데요, 0에서 1사이의 값을 지니는 함수입니다. 수식은 아래와 같습니다.
그래프를 보면 알 수 있듯이, 0에서 1사이의 값을 가지기 때문에 결과값이 조건부 확률을 나타낸다는 특징이 있습니다.
2. 학습
로지스틱 회귀의 학습은 어떻게 진행될까요?
퍼셉트론은 제곱 오차를 비용함수로 사용해서 비용함수가 최소가 되도록 가중치를 훈련하였습니다.
로지스틱 회귀에서는 이 비용함수만 아래와 같은 함수로 바꾸어주면 됩니다.
꽤나 복잡하죠? 이 식은 가능도 L(likelihood)라는 식을 로그를 씌우고 변형한 식입니다. 사이킷런을 사용할 것이기 때문에 그냥 보고 지나가도 됩니다.
이 식은 복잡해보이지만 놀랍게도 가중치를 업데이트하는 방법은 퍼셉트론과 같습니다. 실제로 편미분을 해보면 퍼셉트론의 가중치 업데이트 식과 같아집니다.
3. 사이킷런에서 사용하기
그럼 이제 파이썬 사이킷런 패키지로 로지스틱 회귀를 구현하고 학습시켜볼까요?
import numpy as np
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data[:, [2,3]]
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1, stratify=y)
먼저 사이킷런 내장 훈련데이터중에 자주 쓰는 붗꽃 데이터를 가져옵니다. 가져온 데이터를 전부 훈련하는데 쓰지는 않겠습니다. 왜냐하면 나중에 훈련된 분류기가 제대로 훈련이 잘 되었는지 확인하는데 쓸 데이터를 남겨놔야 하기 때문이죠.
이를 위해서 train_test_split을 불러오겠습니다. 이 함수는 훈련입력값인 X와 정답 레이블인 y를 받아서 입력받은 test_size만큼 랜덤으로 분리하여 줍니다. stratify옵션을 사용하면 분리한 테스트셋과 훈련셋에서 y레이블의 비율이 유지됩니다.
훈련 데이터를 잘 가져왔으면 이제 학습을 시켜보겠습니다!
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(solver='liblinear', multi_class='auto',C=100.0, random_state=78)
from sklearn.preprocessing import StandardScaler as SC
sc = SC()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
lr.fit(X_train_std, y_train)
먼저 사이킷런 선형 분류기 패키지에서 로지스틱 회귀를 가져와 선언하고 전처리 패키지에서 표준화처리기를 가져옵니다.
표준화처리기는 입력데이터를 평균이 0이고 표준편차가 1이 되도록 만들어 분류기 훈련에 있어 값이 안정되도록 합니다.
X_train을 fit()
메서드를 사용해 표준화 시켜준 후 로지스틱회귀 객체의 fit()
메서드를 통해 학습을 진행시켜 줍니다.
학습이 완료되었습니다. 이 모델이 얼마나 좋은 성능을 가지고 있는지 간단하게 정확도를 측정해 볼까요?
아까 분리한 테스트셋을 통해 이 모델의 성능을 측정해 보겠습니다.
lr.score(X_test_std, y_test)
1.0
와, 정확히 분류를 해내는 모델이네요.
그 이유는 붗꽃 훈련 데이터가 이진 분류가 가능한 아주 간단한 문제이기 때문입니다. 이진 분류가 어려운 데이터셋을 훈련할때는 정확도가 이보다 낮을 것입니다.
다음 포스트에서는 규제를 통해 정확도가 낮을 때 로지스틱 회귀 분류기의 성능을 높이는 법을 알아보겠습니다.
사이킷런 scikit-learn 분류 로지스틱회귀