로지스틱 회귀가 작동하는 가장 기본적인 메카니즘은 로지스틱 함수 (Logistic Function) 또는 시그모이드 함수 (Sigmoid Function)라고 불리는 특별한 모형을 기반으로 한다. 이러한 로지스틱 함수는 분류의 기준값(0 또는 1)을 가질 확률에 대해 비선형적으로 표현하는데, 아래 그림과 같이 일정 수준을 지나면서 확률값을 급격하게 상승시켜 가급적 양극단의 값을 갖도록 하는 특징이 있다.
분류 문제에서는 예측하고자 하는 범주를 목표 집단이라 하고 보통 ‘1’로 표현하는데, 로지스틱 함수는 목표 집단 ‘1’에 속할 확률을 계산한다. 즉, 로지스틱 회귀분석은 확률에 기반하여 분류를 수행하는 분석 모형이라고 할 수 있다. 로지스틱 회귀함수의 Y값은 목표 집단에 속할 확률로서 분류 기준값 (Cut-Off-Value)을 기준으로 0.5보다 크면 ‘클래스 1’(목표 집단)로 분류하고, 0.5보다 작으면 ‘클래스 0’으로 분류하게 된다.
[그래프 1] 로지스틱 함수
로지스틱 회귀의 주요 특징은 로지스틱 회귀분석이 이루어지는 분류 프로세스에 잘 나타나있다. 아래 그림에서 보듯이 로지스틱 회귀에서는 독립변수 각각에 가중치(계수 )가 부여되어 선형 결합이 이루어지고, 이러한 선형 결합이 다시 로지스틱 함수를 통해 비선형적으로 변형되어 결국 목표집단(‘1’)에 속할 확률을 추정하게 된다. 여기에서 가중치 는 w나 로 표현하기도 한다.
[그림 1] 로지스틱 회귀분석의 분류 프로세스
로지스틱 회귀의 장단점을 정리하면 다음과 같다.
[표 5-1] 모형의 장단점
장점 | 학습 속도가 매우 빠르다. |
구현하기 쉽고, 결과 해석이 수월하다. | |
온라인 학습, 오프라인 학습(배치 학습) 모두 가능하다. | |
단점 | 복잡한 상황에 유연하게 대처하지 못한다. |
선형성, 독립변수의 가우시안 분포에 대한 가정 등이 필요하다. |
[1] 오즈, 오즈비, 로짓변환
로지스틱 회귀는 오즈 (Odds), 오즈비 (Odds Ratio), 그리고 로짓 (Logit)이라는 수학적 개념을 기반으로 작동한다.
오즈는 어떤 사건이 발생할 확률과 발생하지 않을 확률의 비율로서 목표 집단에 속할 확률을 p로 정의할 때, 목표 집단에 속할 확률을 비목표 집단에 속할 확률 비율로 나눈 값을 의미한다.
따라서, p가 1이라면 오즈는 이고, p가 0이면 오즈는 0이 되기 때문에 오즈의 구간은 0~이다. 그런데, 이 오즈를 독립변수들의 관계식으로 표현하면,
와 같은 지수함수 (Exponential Function)로 표현되는데, 이러한 비선형 지수함수는 계산이 복잡하고, 해석이 쉽지 않으므로 간단한 선형 방정식 형태로 변환하는 것이 바람직하다. 로지스틱 회귀분석에서는 아래와 같이 오즈함수에 자연로그를 취하여 선형 방정식 형태로 변환하는 것을 로짓변환 (Logit Transform)이라고 한다.
이렇게 오즈를 선형 방정식 형태로 변환함에 따라 계산과 해석이 용이해지는 장점이 있다.
로지스틱 회귀에서 각 독립변수가 종속변수에 미치는 영향의 정도는 오즈비라는 개념으로 해석해야 한다. 오즈비는 엄밀히 말해 두 가지 개별적인 사건에 대한 개별 오즈의 비율을 의미하는데, 로지스틱 회귀 관점에서 오즈비는 모든 독립변수가 고정된 상태의 오즈와 특정 독립변수를 1단위 변화시켰을 때 오즈의 비율을 나타낸 것이다. 즉, 오즈비는 나머지 독립변수를 모두 고정시킨 상태에서 한 독립변수를 1단위 증가시켰을 때 변화하는 종속변수의 효과를 의미한다.
예를 들어 아래의 수식과 같이 x1을 한 단위 증가시키고 오즈비를 구하면 e1이 나오는데, 이를 x1의 오즈비라 한다.
따라서, 추정된 독립변수의 계수 값(β)에 대한 효과는 오즈비인 eβ의 값으로 해석해야 한다. 만약 오즈비(e1)의 값이 1.058이 나왔다면, x1이 1단위 증가할 때 목표 집단에 속할 확률이 속하지 않을 확률에 비해 1.058배 증가한다는 의미이고, e1 값이 0.5가 나왔다면 x1이 1단위 증가할 때 목표 집단에 속할 확률이 속하지 않을 확률에 비해 0.5배로 50% 감소한다는 의미로 해석할 수 있다.
[2] 비용 함수
비용 함수 (Cost Function)란 모형을 통해 도출된 예측값과 실제값 사이의 격차 및 오류의 정도를 나타내는 함수이다. 따라서, 모형을 학습시킨다는 것은 알고리즘이 비용 함수의 값이 최소가 될 수 있도록 최적의 계수값을 도출해낸다는 의미이다. 로지스틱 회귀에서의 비용 함수는 다음과 같이 표현된다.
로지스틱 회귀에서 사용하는 비용 함수 최소화 알고리즘은 경사하강법이며, 이는 인공신경망이나 딥러닝 모형도 마찬가지이다. 경사하강법에 대한 자세한 설명은 이후 인공신경망과 딥러닝을 논의할 때 다루도록 한다. 우리가 사용할 Scikit-Learn 라이브러리의 LogisticRegression( ) 함수는 학습용 데이터 세트를 학습시키면 비용 함수가 최소가 되도록 계수를 자동으로 찾아준다.
[3] 소프트맥스 함수
로지스틱 회귀은 주로 이분형 분류 예측에 사용되지만, 세 개 이상의 집단으로 분류하는 다항 분류 문제에도 적용할 수 있다. 로지스틱 회귀이 다항 분류에 적용될 때에는 로지스틱 함수로서 시그모이드 함수 대신 소프트맥스 함수 (Softmax Function)라는 모형을 사용하게 된다. 소프트맥스 함수의 일반적인 모형은 다음과 같다.
여기에는 k는 분류될 각 범주 혹은 클래스를 의미하고, sk(x)는 샘플 x에 대한 각 클래스의 점수를 의미한다. 따라서, exp(sk(x))j=1kexp(sj(x))는 샘플 x에 대한 각 범주의 점수가 주어졌을 때 이 샘플이 특정 클래스 k에 속할 추정 확률을 의미한다.
일반적인 이항 로지스틱 회귀에서는 목표집단에 속할 확률을 계산하여 분류 기준값(0.5)보다 크면 목표집단(클래스 1)에 분류하지만, 다항 로지스틱 회귀에서는 각 클래스에 속할 확률을 계산하고, 그 중 가장 높은 확률값을 갖는 클래스로 분류하게 된다. 가령, 다항 로지스틱 회귀모형이 고객들을 세 가지 구매금액대 클래스 0, 1, 2 중 하나로 분류 예측을 한다고 했을 때, 소프트맥스 함수가 특정 고객에 대한 ‘클래스 0’, ‘클래스 1’, ‘클래스 2’에 속할 확률을 각각 0.5, 0.3, 0.2로 계산했다면 해당 고객은 가장 큰 확률을 갖는 클래스인 ‘클래스 0’으로 분류된다.
연습
연습으로는 가장 기본적인 로지스틱 회귀를 이용한 이항 분류 예측을 진행해보겠다.
1) 변수 지정 및 전처리
우선 데이터를 불러온 뒤, 로지스틱 회귀분석 모형에 이용할 독립변수와 종속변수를 지정하고 모형 학습 및 평가를 위한 데이터 분할, 그리고 표준화 및 데이터 샘플링 등의 전처리 과정을 거친다.
#1. 모듈 및 함수 불러오기
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
#2. 데이터 불러오기
df = pd.read_csv('Ashopping.csv', encoding = 'cp949')
#3. 변수 지정(독립변수/종속변수)
X = df[['A', 'B', 'C']]
Y = df['S']
#4. 데이터 분할(학습용/평가용 데이터 세트)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
#5. 표준화
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
print(X_train)
• 데이터 균형화
이전 게시글에서 설명한 것과 같이 종속변수의 범주 간 비율이 큰 차이가 나는 불균형성 데이터 세트를 그대로 학습하면 모형이 대부분의 샘플을 다수의 클래스로 예측하는 예측의 편이가 발생한다. 따라서, 범주 간의 비율을 맞춰주는 데이터 균형화 작업이 필요한데 여기에서는 오버 샘플링 방식을 통해 이항 (두개의 집단) 비율을 5:5로 맞추고자 한다.
#1. 모듈 및 함수 불러오기
from imblearn.over_sampling import SMOTE
from collections import Counter
#2 오버 샘플링
smote = SMOTE(random_state=0)
X_train_over, Y_train_over = smote.fit_sample(X_train, Y_train)
#3. 결과 출력
print('Original dataset shape %s' % Counter(Y))
print('sampled dataset shape %s' % Counter(Y_train))
print('Resampled dataset shape %s' % Counter(Y_train_over))
2) 모형 학습 및 예측
#1. 모듈 및 함수 불러오기
from sklearn.linear_model import LogisticRegression
#2 모형 생성
model = LogisticRegression(C=1, random_state=0)
#3 모형 학습 및 예측
model.fit(X_train_over, Y_train_over)
Y_pred = model.predict(X_test)
print('평가용 데이터 세트에 대한 예측값\n', Y_pred)
규제항 ‘C’외에도 LogisticRegression( ) 함수는 다양한 인자를 가지고 있다. LogisticRegression( ) 함수에 대한 자세한 설명은 아래 URL에서 확인할 수 있다.
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
3) 모형 평가
이제 모형이 예측한 값과 실제 값을 비교하여 모형을 평가해볼텐데 정확도, 정밀도, 재현율, F1 스코어를 사용할 것이다.
• 정확도 평가
print(‘학습용 데이터 세트 정확도: {:.3f}’.format(model.score(X_train_over, Y_train_over)))
print(‘평가용 데이터 세트 정확도: {:.3f}’.format(model.score(X_test, Y_test)))
• 정밀도, 재현율, F1 스코어 평가
조금 더 정확한 모형 성능 평가를 위해 classification_report 모듈의 classification_report( ) 함수를 이용하여 정밀도, 재현율, F1 스코어를 구해보자. classification_report( ) 함수는 정확도 외에 정밀도, 재현율, F1 스코어를 한 번에 출력해준다.
#1. 모듈 및 함수 불러오기
from sklearn.metrics import classification_report
#2. 정밀도, 재현율, F1 스코어 출력
print(classification_report(Y_test, Y_pred))
4) 이항 로지스틱 회귀계수 출력
생성된 로지스틱 회귀분석 모형의 상세한 형태를 보기 위해 model 객체의 coef_속성으로 로지스틱 회귀계수를 출력한다.
print('A 회귀계수: {0:.3f}, B 회귀계수: {1:.3f}, C 회귀계수: {2:.3f}'.format(model.coef_[0,0], model.coef_[0,1], model.coef_[0,2]))
▶ 로지스틱 회귀계수는 model 객체의 coef_ 속성을 통해 출력한다. 이항 분류 모형에서 coef_속성은 (1, n_features) 형태의 이차원 배열인 행렬을 반환한다. 본 실습에서는 독립변수가 세 개이므로 (1, 3) 형태의 이차원 행렬이 반환되었다. A, B, C에 대한 회귀계수는 각각 행렬의 첫 번째 행에 저장되어 있어 [0,1], [0,2], [0,3]을 통해 첫 번째 행의 첫 번째 열, 두 번째 열, 세 번째 열의 값을 차례로 출력한다. 그리고 print( ) 함수 속 플레이스 홀더({ }) 내의 콜론(:) 앞에 반환 위치를 첫 번째(0), 두 번째(1), 세 번째(2)로 지정하여 A, B, C의 계수 값을 차례대로 매칭하여 출력하였다.
This post was written based on what I read and studied the book below.
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791195511747
댓글