머신러닝

로지스틱 회귀 (Logistic Regression)

jeongpil 2021. 3. 15. 03:02

*해당 포스팅은 핸즈온 머신러닝(2판) 교재를 공부하며 작성한 글입니다.

 

 

안녕하세요! 오늘은 머신러닝의 로지스틱 회귀에 대해 알아보겠습니다.

 

1. 로지스틱 회귀란?

2. 로지스틱 회귀의 비용 함수

3. 로지스틱 회귀를 이용한 분류 실습

 

1. 로지스틱 회귀란?

 

로지스틱 회귀는 샘플이 특정 클래스에 속할 확률을 추정되는 데 사용됩니다.

 

추정 확률이 50%가 넘으면 모델은 그 샘플이 해당 클래스에 속한다고 예측하고 아니면 클래스에 속하지 않는다고 예측합니다. 

 

 

이진 분류기라고 불리는 로지스틱 회귀는 실제로 분류에 많이 사용됩니다.

 

로지스틱 회귀는 시그모이드 함수를 기반으로 합니다.

 

 

시그모이드 함수

 

 

시그모이드 함수는 0에서 1 사이의 값만 가집니다.

 

y값이 0.5미만일 때는 0(음성 클래스)라고 예측하고 0.5 이상일 때는 1(양성 클래스)라고 예측합니다.

 

 

2. 로지스틱 회귀의 비용 함수

 

선형 회귀에서 사용한 비용 함수를 로지스틱 회귀에 사용하면 그래프가 아래와 같이 non-convex 형태로 나타납니다.

 

 

 

 

그래프가 non-convex일 경우 최솟값을 찾을 때 경사 하강법을 이용할 수 없습니다.

 

전역 최솟값이 아닌 지역 최솟값에서 멈출 수 있기 때문입니다.

 

따라서, 이를 매끈한 convex 형태로 만들어주기 위한 작업이 필요합니다.

 

이를 로그를 통해 해결할 수 있습니다. 

 

 

Cost에 대해 살펴보면

 

y=1일 때, H(x)=1 이면 Cost=0 이고 H(x)=0이면 Cost는 무한대에 가까워집니다.

 

y=0일 때, H(x)=0 이면 Cost=0 이고 H(x)=1이면 Cost는 무한대에 가까워집니다.

 

( y는 실제값, H(x)는 예측값입니다. )

 

 

따라서 이를 합쳐서 식으로 표현하면 다음과 같습니다. 

 

 

 

 

이는 하나의 훈련 샘플에 대한 비용 함수이고

 

전체 훈련 세트에 대한 비용 함수는 모든 훈련 샘플의 비용을 평균한 것입니다.

 

그 식은 다음과 같습니다.

 

 

로지스틱 회귀 비용 함수

 

 

이 비용 함수는 매끈한 볼록 함수이므로 경사 하강법을 적용하여 전역 최솟값을 찾을 수 있습니다.

 

 

 

3. 로지스틱 회귀를 이용한 분류 실습

 

이제 로지스틱 회귀를 분류 문제에 적용해보겠습니다.

 

데이터는 사이킷런에 내장된 유방암 데이터셋을 이용했으며 로지스틱 회귀를 이용하여 종양의 크기에 따라 악성(1)인지 아닌지(0) 예측해보겠습니다.

 

 

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

#유방암 데이터
cancer_data = load_breast_cancer()

 

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

scaler=StandardScaler()
cancer_data_scaled=scaler.fit_transform(cancer_data.data)

#훈련세트와 테스트세트로 분리
X_train, X_test, y_train, y_test = train_test_split(cancer_data_scaled,cancer_data.target, test_size=0.2, random_state=42)

 

#평가지표로 accuracy와 roc곡선에 기반한 auc스코어 사용
from sklearn.metrics import accuracy_score, roc_auc_score

lr_clf=LogisticRegression()
lr_clf.fit(X_train,y_train)
lr_pred=lr_clf.predict(X_test) #예측값

print('accuracy:{:0.4f}'.format(accuracy_score(y_test,lr_pred)))
print('roc_auc:{:0.4f}'.format(roc_auc_score(y_test,lr_pred)))

accuracy:0.9737

roc_auc:0.9697

 

#예측값
lr_pred

 

정확도는 약 0.97이 나왔으며 roc auc 값도 약 0.97이 나왔습니다.

 

 

이렇게 로지스틱 회귀에 대해 알아보았습니다.