본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 로지스틱 회귀가 분류인 3가지 이유와 실무 해결 방법 7가지

by Papa Martino V 2026. 4. 8.
728x90

로지스틱 회귀(Logistic Regression)
로지스틱 회귀 (Logistic Regression)

 

데이터 과학과 머신러닝의 세계에 입문할 때 가장 먼저 마주하는 역설 중 하나가 바로 '로지스틱 회귀(Logistic Regression)'라는 이름입니다. 이름에는 '회귀'가 붙어 있는데, 정작 현업에서는 '분류' 알고리즘으로 사용됩니다. 왜 이런 모순적인 이름이 붙었는지, 그리고 실제 파이썬(Python) 환경에서 이를 어떻게 고도로 정제하여 활용할 수 있는지 심층적으로 분석합니다.


1. 회귀라는 이름을 가졌으나 분류로 쓰이는 본질적 이유

로지스틱 회귀가 '회귀'인 이유는 모델의 수학적 구조가 선형 회귀(Linear Regression)를 기반으로 하기 때문입니다. 하지만 결과적으로 '분류'인 이유는 출력값이 특정 클래스에 속할 확률을 계산하고, 이를 임계값(Threshold)에 따라 이진 결정으로 변환하기 때문입니다.

수학적 메커니즘: 시그모이드 함수($\sigma$)

선형 회귀의 출력 $z = w^T x + b$는 $-\infty$에서 $+\infty$까지의 범위를 가집니다. 이를 확률 값인 $0$과 $1$ 사이로 압축하기 위해 로지스틱 함수(Logistic Function)를 적용합니다.

$$\sigma(z) = \frac{1}{1 + e^{-z}}$$

이 식을 통해 도출된 $y$값은 "입력 $x$가 클래스 1에 속할 확률"을 의미하게 됩니다. 따라서 수학적 도구는 '회귀'를 사용하지만, 최종 목적지는 '분류'인 셈입니다.


2. 선형 회귀 vs 로지스틱 회귀 비교 분석

두 알고리즘의 명확한 차이점을 이해하는 것은 모델 선택의 기준이 됩니다.

항목 선형 회귀 (Linear Regression) 로지스틱 회귀 (Logistic Regression)
종속 변수 타입 연속형 숫자 (예: 집값, 온도) 범주형 데이터 (예: 스팸 여부, 암 판정)
출력 범위 제한 없음 ($-\infty, \infty$) 0 ~ 1 사이의 확률값
최적화 함수 최소제곱법 (Ordinary Least Squares) 최대 우도 추정법 (Maximum Likelihood Estimation)
결정 경계 존재하지 않음 (직선 추세선) 로짓 변환을 통한 선형/비선형 결정 경계
오차 측정 MSE (Mean Squared Error) Cross-Entropy Loss (Log Loss)

3. 실무자를 위한 파이썬(Python) 활용 Example 7가지

이 섹션에서는 실무에서 로지스틱 회귀를 단순 호출하는 수준을 넘어, 성능을 극대화하고 문제를 해결하는 7가지 핵심 기법을 코드로 제시합니다.

Example 1: Scikit-learn을 이용한 기본 이진 분류 구현

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# 샘플 데이터 생성 (0: 정상, 1: 불량)
X = np.array([[1.2, 0.5], [2.3, 1.5], [0.8, 0.2], [3.1, 2.8], [0.5, 0.1]])
y = np.array([0, 1, 0, 1, 0])

# 모델 초기화 및 학습
model = LogisticRegression()
model.fit(X, y)

# 예측 확률 확인
probs = model.predict_proba([[1.5, 0.9]])
print(f"클래스별 확률: {probs}")

Example 2: 다중 분류(Multinomial)를 위한 One-vs-Rest 설정

# 데이터가 3개 이상의 클래스일 경우
model_multi = LogisticRegression(multi_class='multinomial', solver='lbfgs')
# solver='lbfgs'는 다중 분류에서 소프트맥스 회귀를 구현할 때 효율적입니다.

Example 3: 규제(Regularization)를 통한 과적합(Overfitting) 해결

# L2 규제(Ridge) 강도 조절 (C값이 작을수록 규제가 강함)
model_l2 = LogisticRegression(penalty='l2', C=0.01)

# L1 규제(Lasso) - 특성 선택(Feature Selection) 효과
model_l1 = LogisticRegression(penalty='l1', solver='liblinear', C=1.0)

Example 4: 클래스 불균형(Imbalanced Data) 해결을 위한 가중치 부여

# 희귀 질병 데이터처럼 1의 비중이 매우 적을 때 class_weight 사용
model_balanced = LogisticRegression(class_weight='balanced')
model_balanced.fit(X_train, y_train)

Example 5: 임계값(Threshold) 조정을 통한 재현율(Recall) 최적화

# 기본 0.5가 아닌 0.3으로 임계값 낮추기 (더 공격적인 분류)
y_probs = model.predict_proba(X_test)[:, 1]
y_custom_pred = (y_probs >= 0.3).astype(int)

Example 6: Statsmodels를 활용한 통계적 유의성 검정 (P-value 확인)

import statsmodels.api as sm

# 통계적 해석을 위해 상수항 추가
X_const = sm.add_constant(X)
logit_model = sm.Logit(y, X_const)
result = logit_model.fit()

print(result.summary()) # 변수별 P-value와 Odds Ratio 확인 가능

Example 7: Pipeline을 이용한 스케일링과 모델링 통합

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

# 경사하강법 기반 solver 사용 시 스케일링은 필수
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('logistic', LogisticRegression(solver='saga', max_iter=10000))
])
pipeline.fit(X_train, y_train)

4. 결론: 왜 실무에서 로지스틱 회귀를 고집하는가?

딥러닝과 복잡한 앙상블 모델(XGBoost, LightGBM)이 난무하는 시대에도 로지스틱 회귀가 사랑받는 이유는 '해석 가능성(Interpretability)' 때문입니다. 특정 변수가 결과에 미치는 영향을 오즈비(Odds Ratio)로 명확히 설명할 수 있다는 점은 금융, 의료 등 신뢰성이 중요한 분야에서 대체 불가능한 가치를 지닙니다. 결국 로지스틱 회귀는 선형 회귀의 안정적인 수치 예측 능력과 분류 알고리즘의 결정 능력을 결합한 가장 '가성비 좋은' 알고리즘이라 할 수 있습니다.


5. 출처 및 참고 문헌

  • Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning. Springer.
  • Scikit-learn Documentation: sklearn.linear_model.LogisticRegression
  • Python Data Science Handbook by Jake VanderPlas.
728x90