본문 바로가기

ML with SckitLearn

로지스틱 회귀 : Logistic Regression, 시그모이드(sigmoid)를 이용한 분류 회귀

반응형

로지스틱 회귀는 선형 회귀 방식을 분류에 적용한 알고리즘입니다. 즉, 로지스틱 회귀는 분류에 사용됩니다. 로지스틱 회귀 역시 선형 회귀 계열입니다. 회귀가 선형인가 비선형인가는 독립변수가 아닌 가중치(weight) 변수가 선형인지 아닌지를 따릅니다.

 

로지스틱 회귀가 선형 회귀와 다른 점은 학습을 통해 선형 함수의 회귀 최적선을 찾는 것이 아니라 시그모이드(Sigmoid) 함수 최적선을 찾고 이 시그모이드 함수의 반환 값의 확률에 따라 분류를 결정한다는 것입니다.

 

 

많은 자연, 사회 현상에서 특정 변수의 확률 값은 선형이 아니라 위의 시그모이드 함수와 같이 S자 커브 형태를 가지게 됩니다. 만약 1이 Yes이고 0이 No를 나타내는 데이타값이 있다면 회귀를 적용하면 데이터가 모여 있는 곳으로 선형 회귀 선을 그릴 수 있습니다.

 

하지만 이 회귀 라인은 0과 1을 제대로 분류하지 못하고 있습니다. 하지만 시그모이드를 통한 S자 커브 형태라면 좀 더 정확하게 0과 1에 대해 분류를 할 수 있음을 알 수 있습니다.

 

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, roc_auc_score
from sklearn.model_selection import GridSearchCV

cancer = load_breast_cancer()
sclar = StandardScaler()
data_scled = sclar.fit_transform(cancer.data)

X_train, X_test, y_train, y_test = train_test_split(data_scled, cancer.target, test_size=0.3, random_state=0)

lr_clf = LogisticRegression()
lr_clf.fit(X_train, y_train)
lr_pred = lr_clf.predict(X_test)

print('accuracy_score\n', accuracy_score(y_test, lr_pred))
print('roc_auc_score\n', roc_auc_score(y_test, lr_pred))

선형 회귀 계열의 로지스틱 회귀는 데이터의 정규 분포도에 따라 예측 성능에 영향을 받을 수 있으므로 데이터에 먼저 정규 분포 형태의 표준 스케일링을 적용한 뒤에 train_test_split을 하는게 좋습니다.

 

accuracy_score
 0.9766081871345029
roc_auc_score
 0.9715608465608465

정확도와 ROC-AUC값은 상기와 같이 예측이 됩니다. 

 

LogisticRegression 클래스의 주요 하이퍼파라미터로 penalty와 C가 있습니다. penalty는 규제(Regulation)의 유형을 설정하며 L2혹은 L1을 설정하면 됩니다.  C는 규제의 강도를 조절하는 alpha값의 역수로 값이 작을수록 규제 강도가 크게 됩니다.

 

GridSearchCV를 통해 최적의 하이퍼파라미터를 추정해 봅니다.

params={'penalty': ['l2'],
        'C': [0.01, 0.1, 1, 1, 5, 10]}
grid_clf = GridSearchCV(lr_clf, param_grid=params, scoring='accuracy', cv=3)
grid_clf.fit(data_scled, cancer.target)

print(grid_clf.best_params_, grid_clf.best_score_)
{'C': 1, 'penalty': 'l2'} 0.975392184164114
반응형