AI/Machine Learning

[Machine Learning] 로지스틱 회귀 (Logistic Regression)

byunghyun23 2022. 9. 29. 13:31

일반적으로 선형 회귀 분석은 연속형 값을 예측하기에 적합하지만 범주형(분류)으로 예측하기에는 적합하지 않습니다.

선형 회귀 분석은 타겟 데이터의 범위가 무한대이기 때문입니다. 범위가 무한대라는 것은 만일 피처 데이터를 입력으로 두 개의 class(0, 1)로 분류해야 할 때 예측값이 0 또는 1로 제한되어 있다면 가능하지만, 3이라는 값으로 예측하게 된다면 이것은 0과 1로 분류하기는 어렵다는 것을 의미합니다.

 

이러한 문제를 해결하기 위한 방법 중 하나가 바로 로지스틱 회귀입니다.

로지스틱 회귀는 일반적인 선형 회귀 분석에서 출력값에 시그모이드 함수를 사용하여 0과 1사이의 값으로 변환시키는 방법으로, 이진 분류 방법입니다. (다중 분류일 경우에는 소프트맥스 함수를 사용해야 합니다.)

Sigmoid

z는 선형 회귀 모델의 출력입니다.

 

사이킷런의 LogisticRegression을 사용해 보겠습니다.

LogisticRegression의 predict()는 0~1사이로 예측된 값을 0 또는 1로 분류한 결과입니다.

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, confusion_matrix, classification_report

raw_cancer = datasets.load_breast_cancer()

X = raw_cancer.data
y = raw_cancer.target
# X.shape, y.shape: (569, 30) (569,)

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# X_train.shape, X_test.shape, y_train.shape, y_test.shape: (426, 30) (143, 13) (426,) (143,)

std_scaler = StandardScaler()
X_train = std_scaler.fit_transform(X_train)
X_test = std_scaler.transform(X_test)

clf_logistic_l2 = LogisticRegression(penalty='l2')
clf_logistic_l2.fit(X_train, y_train)

pred_logistic = clf_logistic_l2.predict(X_test)
# [0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1
#  0 1 0 0 1 0 1 1 0 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0
#  0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1
#  0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 0]

pred_prob_logistic = clf_logistic_l2.predict_proba(X_test)
# [[9.98638613e-01 1.36138656e-03]
#  [3.95544804e-02 9.60445520e-01]
#  [1.30896362e-03 9.98691036e-01]
#  [1.24473354e-02 9.87552665e-01]
#  ...
#  [8.41453252e-05 9.99915855e-01]
#  [1.58701592e-03 9.98412984e-01]
#  [1.26424968e-03 9.98735750e-01]
#  [9.99999994e-01 5.81805301e-09]]

precision = precision_score(y_test, pred_logistic)
# 0.9666666666666667

conf_matrix = confusion_matrix(y_test, pred_logistic)
# [[50  3]
#  [ 3 87]]

class_report = classification_report(y_test, pred_logistic)
#               precision    recall  f1-score   support
#
#            0       0.94      0.94      0.94        53
#            1       0.97      0.97      0.97        90
#
#     accuracy                           0.96       143
#    macro avg       0.96      0.96      0.96       143
# weighted avg       0.96      0.96      0.96       143

LogisticRegression의 파라미터 penalty는 제약으로서, 'l1', l2' 등을 사용할 수 있습니다.

predict()는 피처 데이터를 0 또는 1로 분류한 결과이고, predict_prob()는 0과 1에 대한 확률입니다.

두 값을 합치면 1입니다.