Machine Learning

[머신러닝#3] 지도 학습 - 로지스틱 회귀(Logistic Regression)

j.d 2023. 6. 29. 10:53

이번 시간에 이야기해볼 지도 학습 머신러닝 모델은 로지스틱 회귀입니다.

 

로지스틱 회귀

 

로지스틱 회귀 모델은 분류에 사용될 수 있는 회귀 알고리즘입니다.

 

어떤 상황을 가정해 봅시다.

 

만약 종속변수의 값이 0과 1로만 이루어져 있는 이진분류 상황에서 회귀분석을 쓸 수 있을까?

 

일반적인 회귀분석으로는 No! 입니다.

만일 데이터를 넣어서 모델을 실행시키면 위와 같은 결과가 나올 것입니다.

 

따라서 분류의 목적에 맞게 회귀 모델을 변형시켜 줄 필요성이 있습니다. 

 

여러분은 어떤 방식이 떠오르시나요??

※ 간단한 답이니 잠시 멈추고 생각해 보세요. 답이 떠오르시지 않으셔도 됩니다^^

 

답은 간단합니다.

 

회귀분석 값을 시그모이드 함수로 감싸주는 것입니다.

 

시그모이드 함수는 딥러닝의 활성화 함수로 다들 잘 알고 계시겠지만 그래프를 한번 살펴보겠습니다.

$$f(x)=\frac{1}{1+e^{-x}}$$

시그모이드 함수는 y 값이 0과 1 사이로 이루어진 함수입니다. 

 

따라서 회귀분석의 값을 시그모이드의 x값으로 넣는다면 y값은 모두 0과 1사이로 나올 것입니다.

※ 이러한 접근 방식은 나중에도 자주 쓰이니 잘 알아두시면 좋을 것 같습니다.

 

그래서 식을 다시 변형하면 아래와 같습니다. 

Logistic Regression model estimated probability

사실 변형 시키는 과정에서 $logit$이라는 개념이 등장하는데 우리는 시그모이드를 바로 적용시켰기 때문에 깊게 안 들어가도 될 것 같습니다. 

※ 시그모이드가 도출되는 과정에서 등장하는 개념이니 필요하신 분들은 찾아보시면 바로 이해되실 겁니다. 

 

이렇게 도출된 값을 threshold에 따라 나누어 주면 분류 모델 완성입니다!

 

$$y\left\{\begin{matrix}
1 &  \sigma (x)\geq 0.5\\
0 &  \sigma (x)<  0.5\\
\end{matrix}\right.$$

일반적으로 threshold는 0.5를 기본값으로 설정하지만 필요에 따라 변경할 수 있습니다.

 


python으로 모델을 실행시켜 보도록 하겠습니다.

 

iris 데이터를 분류해 보도록 하겠습니다.

 

그런데 여기서 의아하신 분들이 있을 겁니다.

 

iris 데이터의 종속변수는 3가지 종류의 범주형 데이터인데 이진 분류로 배운 로지스틱 회귀가 적용될까? 의문이 드실 수 있습니다.

 

이진 분류 모델을 다중 분류 문제에 적용시키는 방법은 여러 가지 있지만 대표적인 방법을 소개해드리겠습니다.

※ 기회 되면 나중에 자세히 다뤄보도록 하겠습니다.

 

One vs All 

OvA(One Versus All) 또는 OvR(One Versus the Rest)라고 불리는 방식은 특정 범주만을 학습하는 이진 분류기를 훈련시켜 각 분류기의 결정 점수 중 가장 높은 것을 클래스로 선택하는 방법입니다.

 

위의 데이터에서는 3개의 분류기를 훈련시킬 것입니다.

다중 클래스 분류 작업에 이진 분류 알고리즘을 선택하면 사이킷런이 알고리즘에 따라 자동으로 OvR 또는 OvO를 실행합니다.

 

따라서 이진 분류기도 다중 분류 문제에 적용 가능하다는 것을 알아 두시면 좋을 것 같습니다.

 

먼저 데이터를 불러오겠습니다.

import seaborn as sns
iris = sns.load_dataset('iris')  

X = iris.drop('species', axis=1) 
y = iris['species']
type(y[0])

여기서 y의 값은 문자형입니다. 

 

이를 범주형으로 변환시켜 주는 작업이 필요합니다.

from sklearn.preprocessing import LabelEncoder
classle = LabelEncoder()
y = classle.fit_transform(iris['species'].values)
type(y[0])

그리고 학습 데이터와 테스트 데이터로 분리해 주고 표준화를 진행합니다.

from sklearn.model_selection import train_test_split

#학습과 테스트 데이터넷으로 각각 70%, 30%의 비율로 나눔
X_train,X_test,y_train,y_test=train_test_split(X,y, test_size=0.3, random_state=1, stratify=y) 

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)

전처리된 데이터에 모델을 적용시켜 줍니다.

from sklearn.linear_model import LogisticRegression
Logit = LogisticRegression(C=200, random_state=1)  #C=1/λ, 디폴트:L2정규화
Logit.fit(X_train_std, y_train)
y_train_pred = Logit.predict(X_train_std)
y_test_pred = Logit.predict(X_test_std)

마지막으로 성능을 확인시켜 줍니다.

※ 여기서는 간단하게 accuracy만 확인해 보았습니다.

from sklearn.metrics import accuracy_score
print(accuracy_score(y_train,y_train_pred))  
print(accuracy_score(y_test,y_test_pred))

이 데이터에서는 상당히 좋은 수치가 나온 것을 확인할 수 있습니다.

 

추가적으로 confusion matrix도 확인할 수 있습니다.

from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test, y_test_pred))


이번 시간에는 머신러닝의 지도 학습 알고리즘 중 하나인 로지스틱 회귀에 대해서 알아보았습니다.

회귀 알고리즘이지만 특이하게 분류에 사용할 수 있는 알고리즘입니다.

 

포스팅 내용 중  다른 생각이 있는 분 혹은 수정해야 할 부분이 있으시면 댓글을 통해 그 의견을 나눠보면 너무 좋을 것 같습니다.