로지스틱 회귀를 실무에서 해석하는 법: logit, 최대우도, 오즈비
로지스틱 회귀의 logit 변환, 최대우도 추정, 오즈비 해석과 정규화·확률 보정·임계값 운영 방법을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
확률을 선형 모형의 언어로 다루는 방식
로지스틱 회귀는 이진 분류에서 사건이 발생할 확률을 추정하는 표준 기법이다. 확률 자체가 아니라 확률의 오즈를 변환한 값을 선형 예측자와 연결하므로, 출력 범위를 0과 1 사이에 유지하면서 계수의 의미도 해석할 수 있다.
사건 확률을 (p)라고 하면 logit 함수는 다음과 같다.
[ logit(p) = log(p / (1 - p)) ]
선형 예측자 (\eta = x^T\beta)와 결합하면 확률은 시그모이드 함수로 계산된다.
[ p = \sigma(\eta) = 1 / (1 + exp(-\eta)) ]
이 구조는 확률 경계를 보장하고, 각 계수가 로그 오즈를 어떻게 선형적으로 바꾸는지 보여 준다.
계수는 최대우도 추정으로 구한다
회귀 계수 (\beta)는 베르누이 분포의 우도를 최대화하는 방식으로 추정한다. 로그우도는 볼록함수이며 전역해가 존재한다. 뉴턴-랩슨(IRLS), L-BFGS, SGD 같은 최적화 방법을 사용할 수 있다.
완전 분리(perfect separation)가 나타나면 우도가 비한정적으로 증가하는 문제가 생길 수 있다. 이때는 정규화 항을 적용해 문제를 완화한다. L1/L2 정규화는 과적합을 억제하고, L1은 희소성을 유도하는 데도 쓰인다.
목적함수와 미분 항은 다음처럼 정리할 수 있다.
- 목적함수: (logL(\beta) = \Sigma[y_i log \sigma(x_i^T\beta) + (1 - y_i) log(1 - \sigma(x_i^T\beta))])
- 그래디언트: (g = X^T(y - p))
- 헤시안: (H = -X^TWX), 여기서 (W)는 (p(1-p)) 대각행렬
- 뉴턴-랩슨(IRLS): (\beta_{t+1} = \beta_t - H^{-1}g)
- 수렴 기준: (||g||) 또는 (logL) 개선율
L2 정규화는 MAP 관점에서 가우시안 사전분포에 대응하며, 수치 안정성과 일반화에 기여한다. 수렴이 잘되지 않으면 스텝 크기를 줄이고, 헤시안 대각 가중이나 피처 스케일링 상태를 다시 확인한다.
오즈비가 제공하는 설명 가능성
특징 (j)의 계수 (\beta_j)를 지수화한 (exp(\beta_j))는 해당 특징이 1단위 증가할 때 오즈가 몇 배로 달라지는지를 뜻한다. 범주형 변수는 기준 범주와 비교한 오즈의 배수로 읽는다.
신뢰구간은 예를 들어 95% CI로 표현할 수 있으며, 효과의 불확실성과 통계적 유의성을 평가하는 근거가 된다. 리스크가 1.5배 증가한다는 식의 설명은 정책이나 업무 의사결정에서 직접적인 언어가 된다.
다만 다중공선성이 있으면 계수 분산이 커질 수 있다. VIF를 이용해 확인하거나 정규화를 적용해 완화할 수 있다.
데이터와 운영 조건에 따라 달라지는 구성
로지스틱 회귀는 다중범주 로짓(Softmax), 혼합효과 로짓, Firth 보정처럼 확장할 수 있다. 클래스 불균형이 있으면 class_weight, 샘플 가중치, 임계값 튜닝을 함께 적용한다.
예측 확률을 실제 의사결정에 쓰려면 확률 보정도 중요하다. Platt 또는 Isotonic 보정, 임계값 최적화, 드리프트 모니터링을 운영 체계에 넣을 수 있다. 모델 카드와 설명 리포트는 거버넌스 및 규제 준수에도 도움이 된다.
승인, 진단, 반응 예측에 쓰이는 이유
신용 승인과 부도 예측에서는 소득·부채·신용기록으로 부도 확률을 추정하고, 오즈비를 통해 규제 친화적인 설명을 제공할 수 있다. 거절과 승인 임계값은 PD 목표와 자본 비용을 기준으로 조정한다.
의료 진단 보조에서는 바이오마커와 스코어로 질병 확률을 계산하고, 오즈비로 위험 인자의 기여도를 정량화한다. 교정 곡선은 임상 의사결정의 문턱값을 설정하는 데 사용한다.
마케팅 캠페인에서는 히스토리와 세그먼트 특징으로 전환 확률을 예측하고, 채널 및 오퍼의 효과를 오즈비로 비교한다. 예산 제약 아래에서는 최대 기대 수익을 목표로 임계값을 조정할 수 있다.
전자상거래 이탈·재방문 분석에서는 세션과 제품 피처로 이탈 확률을 산출한다. 인과적 단서를 확보하기 위한 상호작용항을 설계하고, A/B 실험 결과와 결합해 정책을 업데이트한다.
제조 불량 탐지에서는 공정 파라미터로 불량 확률을 계산한다. 공정 변경 전후의 오즈비 차이를 통해 영향을 검증하고, 경계값은 공정 비용과 스크랩 비용 함수에 맞춘다.
성능 지표만으로 끝나지 않는 모델 운영
보정·정규화·피처 엔지니어링을 적용하면 기본선 대비 AUC 25%p 개선을 기대할 수 있다. 잘 교정된 확률로 컷오프를 최적화하면 기대 비용을 1020% 절감할 수 있다.
단순하고 경량인 모델은 환경에 따라 추론 지연 10ms 미만, 대량 배치 스루풋 10만 rps 수준을 달성할 수 있다. 오즈비 중심의 설명은 신뢰와 컴플라이언스를 강화하며, 특징과 결과의 연결 구조가 분명해 데이터 품질 이슈도 찾기 쉬워진다.
학습부터 모니터링까지의 흐름
완전 분리에는 정규화 강화, 특징 병합·축소, Firth 보정을 적용할 수 있다. 다중공선성은 상관 피처 제거, VIF 기반 선택, 릿지 규제로 다룬다. 클래스 불균형에는 class_weight, 리샘플링, 결정 임계값 재설정을 적용하며, 교정이 좋지 않으면 Isotonic/Platt 보정과 데이터 스큐 개선을 검토한다.
다른 분류 모형과의 선택 기준
| 모델 | 성능 | 확장성 | 일관성 | 안정성 | 운영 편의 |
|---|---|---|---|---|---|
| 로지스틱 회귀 | 선형 경계에 강점, 비선형 데이터에서는 한계 | 희소·고차원에 우수, 온라인 학습 가능 | 해석 용이, 확률 교정 우수 | 완전 분리 시 불안정, 정규화로 개선 | 배포·설명·감사 용이 |
| 프로빗 회귀 | 로지스틱과 유사 성능 | 유사 확장성 | 계수 해석이 z-스케일로 덜 직관 | 유사 안정성 | 구현·도구 지원 상대적으로 적음 |
| 결정트리/부스팅 | 비선형·상호작용에서 우수 | 부스팅은 연산 비용 큼 | 해석성 낮음(부스팅), 교정 필요 | 과적합 위험, 튜닝 필요 | 배포 복잡, 모니터링 부담 |
Python에서 확률, 오즈비, 임계값 계산하기
전제조건은 Python 3.10+, scikit-learn 1.4+, statsmodels 0.14+, numpy/pandas 최신 환경이다. 아래 예시는 학습, 확률 예측, 오즈비와 95% CI 계산, 임계값 최적화를 다룬다.
# 환경: Python 3.10+, scikit-learn 1.4+, statsmodels 0.14+
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, log_loss
import statsmodels.api as sm
# 1) 데이터 로드
data = load_breast_cancer()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.Series(data.target, name="target") # 1=malignant(양성), 0=benign(음성) 여부는 데이터셋 설명 참고
# 2) 학습/검증 분할(계층추출)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, stratify=y, random_state=42)
# 3) 전처리(스케일링)
scaler = StandardScaler()
X_tr_s = scaler.fit_transform(X_tr)
X_te_s = scaler.transform(X_te)
# 4) 로지스틱 회귀 학습(scikit-learn)
clf = LogisticRegression(
penalty="l2", C=1.0, solver="lbfgs", max_iter=1000,
class_weight="balanced", n_jobs=-1
)
clf.fit(X_tr_s, y_tr)
p_te = clf.predict_proba(X_te_s)[:, 1]
print("AUC:", roc_auc_score(y_te, p_te))
print("LogLoss:", log_loss(y_te, p_te))
# 5) 오즈비와 신뢰구간(statsmodels)
# 주의: statsmodels는 상수항 필요, 스케일된 피처 사용
X_tr_s_const = sm.add_constant(X_tr_s, has_constant="add")
logit_model = sm.Logit(y_tr.values, X_tr_s_const)
res = logit_model.fit(disp=False)
coef = pd.Series(res.params, index=["const"] + data.feature_names.tolist())
or_ = np.exp(coef) # 오즈비
ci = res.conf_int() # 계수 CI
ci.columns = ["2.5%", "97.5%"]
or_ci = np.exp(ci)
or_table = pd.concat([or_, or_ci], axis=1)
or_table.columns = ["OR", "OR 2.5%", "OR 97.5%"]
print(or_table.head(10)) # 상위 10개만 표시
# 6) 임계값 최적화(Youden's J: TPR - FPR 최대)
from sklearn.metrics import roc_curve
fpr, tpr, thr = roc_curve(y_te, p_te)
j = tpr - fpr
best_idx = np.argmax(j)
best_thr = thr[best_idx]
print("Best threshold (Youden J):", best_thr)
y_pred = (p_te >= best_thr).astype(int)
print("Positive rate at best thr:", y_pred.mean())
완전 분리가 의심되면 L2 강화(C↓), 피처 병합, Firth 보정(statsmodels의 LogitResults.fit_regularized 또는 별도 패키지)을 검토한다. 스케일링은 최적화 안정성과 수렴 속도를 개선하고 정규화 효과를 일관되게 만든다. Reliability curve와 Brier score로 확률 품질을 확인하고 필요하면 Isotonic을 적용한다. 보고서에는 오즈비와 95% CI, 다중 비교 보정(FDR), 상호작용항(예: x1:x2)의 해석을 함께 기록한다.