026 로지스틱 회귀 상세
키워드: 로지스틱 회귀, lr
개요
로지스틱 회귀(Logistic Regression)는 이름과 달리 분류 알고리즘입니다. 해석력이 높고 빠르며, 기준선(baseline) 모델로 자주 사용됩니다.
실습 환경
- Python 버전: 3.11 권장
- 필요 패키지:
pycaret[full]>=3.0
로지스틱 회귀 원리
선형 결합을 시그모이드 함수로 변환:
z = w₀ + w₁x₁ + w₂x₂ + ... + wₙxₙ
P(y=1|x) = 1 / (1 + e^(-z))
확률이 0.5 이상이면 클래스 1, 미만이면 클래스 0.
PyCaret에서 로지스틱 회귀
from pycaret.classification import *
from pycaret.datasets import get_data
# 026 데이터 로드
data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)
# 026 로지스틱 회귀 모델 생성
lr = create_model('lr')
주요 하이퍼파라미터
# 026 C: 정규화 강도 (작을수록 강한 정규화)
lr_c1 = create_model('lr', C=1.0) # 기본값
lr_c01 = create_model('lr', C=0.1) # 강한 정규화
lr_c10 = create_model('lr', C=10.0) # 약한 정규화
# 026 penalty: 정규화 유형
lr_l1 = create_model('lr', penalty='l1', solver='saga') # Lasso
lr_l2 = create_model('lr', penalty='l2') # Ridge (기본)
lr_en = create_model('lr', penalty='elasticnet', solver='saga', l1_ratio=0.5)
# 026 max_iter: 최대 반복 횟수
lr_iter = create_model('lr', max_iter=1000)
# 026 class_weight: 클래스 가중치
lr_balanced = create_model('lr', class_weight='balanced')
정규화 비교
from pycaret.classification import *
from pycaret.datasets import get_data
data = get_data('credit')
clf = setup(data, target='default', session_id=42, verbose=False)
# 026 L2 정규화 (Ridge)
print("=== L2 (Ridge) ===")
lr_l2 = create_model('lr', penalty='l2', C=1.0)
# 026 L1 정규화 (Lasso)
print("\n=== L1 (Lasso) ===")
lr_l1 = create_model('lr', penalty='l1', solver='saga', C=1.0)
# 026 Elastic Net
print("\n=== Elastic Net ===")
lr_en = create_model('lr', penalty='elasticnet', solver='saga', l1_ratio=0.5, C=1.0)
계수 해석
from pycaret.classification import *
from pycaret.datasets import get_data
import pandas as pd
import numpy as np
data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)
# 026 모델 학습
lr = create_model('lr', verbose=False)
# 026 계수 추출
feature_names = get_config('X_train').columns
coefficients = lr.coef_[0]
# 026 계수 DataFrame
coef_df = pd.DataFrame({
'feature': feature_names,
'coefficient': coefficients,
'abs_coefficient': np.abs(coefficients)
}).sort_values('abs_coefficient', ascending=False)
print("특성별 계수:")
print(coef_df)
# 026 계수 해석
# 026 - 양수 계수: 해당 특성이 증가하면 양성 클래스 확률 증가
# 026 - 음수 계수: 해당 특성이 증가하면 양성 클래스 확률 감소
# 026 - 절댓값이 클수록 영향력이 큼
오즈비 (Odds Ratio)
import numpy as np
# 026 오즈비 = exp(계수)
odds_ratio = np.exp(coefficients)
or_df = pd.DataFrame({
'feature': feature_names,
'odds_ratio': odds_ratio
}).sort_values('odds_ratio', ascending=False)
print("오즈비:")
print(or_df)
# 026 오즈비 해석:
# 026 - OR > 1: 해당 특성 1단위 증가 시 양성 확률 증가
# 026 - OR < 1: 해당 특성 1단위 증가 시 양성 확률 감소
# 026 - OR = 2: 양성 오즈가 2배 증가
튜닝
from pycaret.classification import *
from pycaret.datasets import get_data
data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)
# 026 기본 모델
lr = create_model('lr', verbose=False)
base_results = pull()
# 026 자동 튜닝
tuned_lr = tune_model(lr, optimize='AUC')
tuned_results = pull()
print(f"기본 AUC: {base_results['AUC'].mean():.4f}")
print(f"튜닝 AUC: {tuned_results['AUC'].mean():.4f}")
커스텀 그리드 서치
custom_grid = {
'C': [0.001, 0.01, 0.1, 1, 10, 100],
'penalty': ['l1', 'l2'],
'solver': ['saga'],
'max_iter': [1000]
}
tuned_lr = tune_model(lr, custom_grid=custom_grid, optimize='AUC')
시각화
from pycaret.classification import *
from pycaret.datasets import get_data
data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)
lr = create_model('lr', verbose=False)
# 026 ROC 곡선
plot_model(lr, plot='auc')
# 026 혼동 행렬
plot_model(lr, plot='confusion_matrix')
# 026 특성 중요도 (계수 기반)
plot_model(lr, plot='feature')
# 026 결정 경계 (2차원)
plot_model(lr, plot='boundary')
장단점
장점:
- 빠른 학습과 예측
- 확률 출력 (잘 보정됨)
- 계수 해석 가능
- 과적합에 강건 (정규화)
- 기준선 모델로 적합
단점:
- 선형 결정 경계만 가능
- 비선형 관계 포착 어려움
- 특성 간 상호작용 수동 추가 필요
언제 사용하나?
# 1. 기준선 모델로 시작
lr = create_model('lr')
# 2. 해석력이 중요할 때 (의료, 금융)
# 026 계수와 오즈비로 의사결정 설명 가능
# 3. 데이터가 선형 분리 가능할 때
# 026 특성과 타겟 사이에 선형 관계가 있을 때 효과적
# 4. 빠른 프로토타이핑
# 026 대용량 데이터에서도 빠름
정리
- 로지스틱 회귀는 해석 가능한 분류 알고리즘
- C 파라미터로 정규화 강도 조절
- L1/L2/ElasticNet 정규화 지원
- 계수와 오즈비로 특성 영향력 해석
- 기준선 모델로 항상 먼저 시도
다음 글 예고
다음 글에서는 결정 트리 분류 상세를 다룹니다.
PyCaret 머신러닝 마스터 시리즈 #026