Logistic Regression


로지스틱 회귀분석이란?

로지스틱 회귀분석 모델은 로지스틱 함수에서 이진 분류 문제를 풀기 위해 발전되었다. 이 모델은 주로 예/아니오 처럼 두 가지 범주로 결과가 나뉘는 경우에 사용된다.

  • 확률 추정 : 로지스틱 회귀는 주어진 데이터가 특정 클래스에 속할 확률을 추정한다. 0과 1 사이의 값으로, 예측된 확률이 특정 임계값(일반적으로 0.5) 이상인 클래스와 아닌 클래스로 분류한다.
  • 시그모이드 함수 : 로지스틱 회귀는 시그모이드 함수(또는 로지스틱 함수)를 사용하며 입력 데이터의 선형 조합을 0과 1사이의 확률 값으로 변환한다. 시그모이드 함수는 S자 형태의 곡선을 그리며, 이 함수는 선형 조합의 결과를 확률로 매핑한다.
  • 최대 우도 추정 : 로지스틱 회귀 모델은 최대 우도 추정(Maximum Likelihood Estimation) 방법을 사용하여 모델 파라미터를 추정한다. MLE는 주어진 데이터에 대해 관측된 결과의 확률을 최대화하는 파라미터 값을 찾는 과정이다.
  • 이진 분류 : 로지스틱 회귀는 기본적으로 이진 분류를 위해 설계되었지만 다중 클래스 분류 문제에도 적용될 수 있다.

로지스틱 회귀분석의 장점

  • 해석하기 용이하다. 각 특성의 가중치를 분석해 어떤 특성이 결과에 더 큰 영향을 미치는지 이해할 수 있다.
  • 결과의 확률을 제공하여 단순 분류 뿐 아니라 불확실성을 평가할 수 있다.
  • 다양한 유형의 데이터에 적용할 수 있으며 비선형 관계를 모델링 할 수도 있는 등 유연성을 가진다.

로지스틱 회귀분석의 한계

  • 기본적으로 선형 관계를 가정하기에 복잡한 비선형 관계를 모델링하기 위해선 추가적인 기법이 필요하다.
  • 중요하지 않거나 상관관계가 높은 특성이 포함되어 있으면 모델의 성능이 저하될 수 있다.
  • 특성의 수가 많거나 모델이 복잡할 경우 오버피팅이 발생할 수 있다.

이론

오즈(Odds)

특정 사건이 발생할 확률과 그 사건이 발생하지 않을 확률 간의 비율

\[odds = \frac{P(Y=1)}{1-P(Y=1)}\]

로그변환(Logit)과 시그모이드

로지스틱 회귀에서 종속 변수의 $\log(odds)$를 독립 변수들의 선형 조합으로 모델링한다. 오즈는 0 이상의 값만 존재하지만, 로그 변환으로 값의 범위를 실수 전체로 확장시켜 종속변수와 독립 변수 사이의 관계를 선형 방정식으로 표현할 수 있다. 이때 logit은 logistic과 probit을 합친 단어로 다음과 같이 정의된다.

\[L=\log(Odds)=\ln\frac{p}{1-p}\]

Odds는 그 값이 1보다 큰지가 결정의 기준이고, logit은 0 보다 큰지가 결정의 기준이다. 또한 logit함수와 sigmoid함수는 서로 역함수 관계를 가진다.

\[\begin{align*} \text{Logit}(p) &= \ln\left(\frac{1}{1-p}\right) = L, \\ \frac{p}{1-p} &= \exp(L), \\ \frac{1}{p} - 1 &= \frac{1}{\exp(L)}, \\ p &= \frac{\exp(L)}{1+\exp(-L)} = \frac{1}{1+\exp(-L)} = \text{Sigmoid}(L), \\ \therefore\quad \text{Logit}(p) &= L,\quad \text{Sigmoid}(L) = p. \end{align*}\]

로지스틱 회귀에서 시그모이드 함수는 입력 데이터의 선형 조합을 확률 값으로 변환하는 데 사용된다. 그 예로, 로지스틱 회귀 모델에서는 데이터의 특성과 가중치의 선형 조합을 계산하고, 시그모이드 함수의 입력으로 사용해 0과 1사이의 값을 얻는다.

LogisticRegression 클래스

Scikit-learn의 로지스틱 회귀 모델을 사용하여 모델을 조정하고 훈련할 수 있다.

from sklearn.linear_model import LogisticRegression
import numpy as np
# 로지스틱 회귀 모델 생성
model = LogisticRegression()
#모델 훈련
model.fit(X,y)

x_data = np.linspace(-1.2, 1.2, 100).reshape(-1,1)
pred = model.predict_proba(x_data)[:,1]

LogisticRegression()에서 사용하는 주요 파라미터는 다음과 같다.

   
penalty 정규화 종류. ‘l1’, ‘l2’, ‘elasticnet’, ‘none’ 중 선택. 기본값은 ‘l2’.
dual 이중 또는 원시 방법 선택. 기본값은 False.
tol 최적화 중단을 위한 허용 오차. 기본값은 1e-4.
C 정규화 강도의 역수. 값이 작을수록 강한 정규화. 기본값은 1.0.
fit_intercept 모델에 절편(상수 항) 포함 여부. 기본값은 True.
intercept_scaling 절편에 적용되는 스케일링 팩터. fit_intercept가 True일 때 사용.
class_weight 클래스 불균형을 처리하기 위한 가중치. 기본값은 None.
random_state 난수 발생기 시드. 결과 재현성을 위함.
solver 최적화 문제를 해결하기 위한 알고리즘. ‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’ 등 선택 가능.
max_iter 최적화를 위한 최대 반복 횟수. 기본값은 100.
multi_class 다중 클래스 분류 전략. ‘auto’, ‘ovr’, ‘multinomial’ 중 선택.
verbose 로그 출력 상세도.
warm_start 이전 호출의 솔루션을 재사용하여 피팅을 초기화 여부. 기본값은 False.
n_jobs 병렬 처리를 위한 CPU 코어 수. 기본값은 None (1개 코어 사용).

statsmodel을 활용한 분석

import statsmodel.api as sm

X_con = sm.add_constatn(X) #상수항 추가
sm_model = sm.Logit(y, X_con) #모델 생성
result = sm_model.fit()
print(result.summary())

Optimization terminated successfully.
         Current function value: 0.490686
         Iterations 6
                           Logit Regression Results                           
==============================================================================
Dep. Variable:                      y   No. Observations:                  300
Model:                          Logit   Df Residuals:                      298
Method:                           MLE   Df Model:                            1
Date:                Fri, 17 Jan 2025   Pseudo R-squ.:                  0.2921
Time:                        14:09:15   Log-Likelihood:                -147.21
converged:                       True   LL-Null:                       -207.94
Covariance Type:            nonrobust   LLR p-value:                 3.005e-28
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const          0.0837      0.146      0.574      0.566      -0.202       0.369
x1             2.1228      0.254      8.343      0.000       1.624       2.622
==============================================================================

각각의 결과는 다음과 같이 해석할 수 있다.

(Pseudo) R-squared : 모형이 데이터에 잘 맞는 정도(얼마나 선형적인가)를 보여주는 지표이다. 1에 가까울수록 모델의 설명력이 높고, 0.4 이상이면 괜찮은 모델이라 할 수 있다.

coef(coeffcient, 계수) : 데이터로부터 얻은 계수의 추정치이다. 위 수식을 기준으로 y = 0.0837 + 2.1228x의 수식이 만들어 짐으로 해석할 수 있다.

p>|z| (p-value, 유의 확률) : 독립변수의 유의 확률을 의미하며 95%의 신뢰도를 가져야 유의미하다고 판단된다. 따라서 유의확률이 0.05보다 작으면 독립 변수가 종속 변수에 영향을 미치는 것이 유의미하다고 보면 된다.

간략하게 정리하면 R-squeared가 0.4이상, p-value0.05 보다 작으면 유의미한 결과라고 볼 수 있다.




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • [CS231n]Exercise1.5 - Features
  • [CS231n]Exercise1.4 - Two Layer Net
  • [CS231n]Exercise1.3 - Softmax
  • [CS231n]Exercise1.2 - Support Vector Machine