본문 바로가기
데이터 분석/데이터 분석

[데이터 분석] 로지스틱 회귀분석 (Logistic Regression)

by thomasito 2021. 7. 19.
반응형

로지스틱 회귀분석 : 모 아니면 도

 로지스틱 회귀는 선형 회귀 방식을 '분류'에 적용한 알고리즘이다. 쉽게 말하면 선형회귀 분석에서 Target 으로 잡는 데이터가 모 아니면 도라고 생각하면 이해하기 편하다. 예를 들면 종양 데이터를 근거로 종양인지(Y=1) 아닌지(N=0)를 판단하는 문제에 적용할 수 있다. 로지스틱 회귀는 시그모이드 함수를 기반으로 하는데 시그모이드 함수는 X 값이 아무리 커지거나 작아져도 1이나 0 값 만을 반환하는 함수이다.

 

시그모이드 함수 (출처:위키피디아)
 

  로지스틱 회귀는 이처럼 선형 회귀 방식을 기반으로 하되 시그모이드 함수를 이용하여 '분류'를 수행하는 회귀이다. 지도학습의 대장인 '회귀'와 '분류'가 합쳐진 로직이다. 하지만 잊지 말자 로지스틱 회귀에서 '회귀'는 도구이고 '분류'가 목적이라는 점을!

 

[Step 1] 데이터 전처리 (Preprocessing)

 사이킷런은 다양한 데이터셋을 제공하는데 오늘은 유방암 데이터를 분석해보도록 하겠다. 이 데이터의 경우는 타겟 데이터가 1, 0 으로 제공되어 있기 때문이다. 필요한 라이브러리를 가져오고 load_breast_cancer() 함수를 실행시켜 데이터를 가져온다.

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression

cancer = load_breast_cancer()

 데이터는 아래와 같이 저장되어 있다. feature_names 는 데이터의 피처(독립변수)를 의미하고 target 은 데이터의 타겟(종속변수)를 의미한다. 해당 데이터에 대한 설명은 DESCR 을 참고하면 된다. 

 판다스 데이터 프레임으로 이쁘게 만들어 주자. 데이터를 그대로 가져오면 컬럼에 피처이름이 전혀 안 적혀있다. 보기 쉽게 타겟 데이터도 컬럼으로 추가해준다. 왼쪽의 수많은 피처 데이터와 오른쪽에 타겟 데이터를 한 눈에 쉽게 볼 수 있다. 

cancer_df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
cancer_df['target'] = cancer.target

 

[Step 2] Train, Test 데이터 분류 후 학습

 선형 회귀 계열의 로지스틱 회귀는 데이터의 정규 분포도에 따라 예측 성능 영향을 받을 수 있으므로 데이터에 먼저 정규 분포 형태의 표준 스케일링(Standard Scaler)을 적용해 보겠다. 아래 모든 피처 데이터들이 평균이 0, 분산이 1인 데이터로 이쁘게 변환되었다.

# StnadardScaler()로 평균이 0, 분산 1로 데이터 분포도 변환
scaler = StandardScaler()
data_scaled = scaler.fit_transform(cancer.data)

print(data_scaled)
print(cancer.target)

cancer_standardized_df = pd.DataFrame(data_scaled,columns=cancer.feature_names)
cancer_standardized_df['target'] = cancer.target

 train_test_split 함수를 통해서 훈련데이터와 테스트 데이터를 분리한 후 모델을 학습시키고 X_test 를 넣어서 예측 값들을 출력해본다. 0번 인덱스는 0(N), 1번 인덱스는 1(Y)와 같은 방식으로 예측 값이 도출되었다.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(data_scaled, cancer.target,
                                                   test_size=0.3, random_state=0)

# 로지스틱 회귀를 이용해 학습 및 예측 수행
lr_clf = LogisticRegression() 
lr_clf.fit(X_train, y_train) # 학습
lr_preds = lr_clf.predict(X_test) # 예측
print(lr_preds)

[Step 3] 정확도 성능 평가

 Accuracy ROC_AUC 지표를 통해 예측의 성능이 얼마나 뛰어난지 평가해보자. Accuracy 는 97%, ROC_AUC도 97%의 예측률을 보여주고 있다. 

from sklearn.metrics import accuracy_score, roc_auc_score

# 정확도와 roc_auc 측정
print('accuracy: {:0.3f}'.format(accuracy_score(y_test, lr_preds)))
print('roc_auc: {:0.3f}'.format(roc_auc_score(y_test, lr_preds)))

 모 아니면 도를 판단하는 로지스틱 회귀분석은 간결하면서도 예측력이 높은 모델을 제공한다. 이론적인 내용은 추후에 다루어 보도록 하겠다. ^^

반응형

댓글