RyanNerd
라덕'Story
RyanNerd
  • 분류 전체보기 (117)
    • Study Note (80)
      • Python (3)
      • R (1)
      • Airflow (7)
      • 통계 (26)
      • Machine Learning (16)
      • Streamlit (9)
      • Django (1)
      • Deep Learning (12)
      • dbt (2)
      • SQL (3)
    • 빅데이터분석기사 (1)
      • 필기 (1)
    • Programmers (28)
      • Python (13)
      • SQL (15)
    • Project (3)
      • Django (3)
    • Mac (2)

블로그 메뉴

  • NaverBlog
  • 홈

최근 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
RyanNerd

라덕'Story

Study Note/Machine Learning

로지스틱 회귀의 양날의 검: Penalty와 C 완벽 이해하기

2025. 12. 22. 13:49

XGBoost 같은 복잡한 모델을 쓰기 전에, 데이터 분석가라면 가장 기본인 로지스틱 회귀(Logistic Regression)를 마스터해야 합니다. 이 모델의 성능을 결정짓는 두 가지 핵심 레버, penalty와 C에 대해 알아봅니다.

 

1. penalty: 어떤 방식으로 규제할까?

모델이 학습 데이터에 너무 과하게 맞춰지는 과적합(Overfitting)을 막기 위해, 모델에게 일종의 '페널티(벌칙)'를 주는 방식입니다.

  • l1 (Lasso):
    • 특징: 중요하지 않은 변수의 가중치를 완전히 0으로 만들어버립니다.
    • 용도: 변수가 너무 많을 때, 자동으로 중요한 변수만 남기고 싶을 때(Feature Selection) 유용합니다.
  • l2 (Ridge):
    • 특징: 가중치를 0으로 만들지는 않고, 0에 가깝게 아주 작게 만듭니다.
    • 용도: 모든 변수를 골고루 반영하면서도, 특정 변수가 너무 튀는 것을 막고 싶을 때 사용합니다. (가장 일반적으로 쓰임)
  • elasticnet:
    • L1과 L2를 적절히 섞어서 쓰는 방식입니다.

2. C: 규제를 얼마나 세게 할까?

C는 규제 강도의 역수(Inverse of Regularization Strength)입니다. 헷갈리기 쉬우니 꼭 기억하세요!

  • C 값이 작을수록 ($0.01, 0.1 \dots$) $\rightarrow$ 규제가 강해집니다.
    • 모델이 단순해집니다. (과소적합 주의)
    • "공부 너무 깊게 하지 마! 핵심만 봐!"
  • C 값이 클수록 ($10, 100 \dots$) $\rightarrow$ 규제가 약해집니다.
    • 모델이 복잡해지고 학습 데이터에 예민해집니다. (과적합 주의)
    • "틀린 거 하나라도 용납 못 해! 꼼꼼하게 다 외워!"

Tip: 보통 C 값은 로그 스케일($0.01, 0.1, 1, 10, 100$)로 변화시키며 최적값을 찾습니다. 기본값(Default)은 1.0입니다.

 

3. [실습] Grid Search로 최적의 Penalty와 C 찾기

노트북 파일에 있는 코드를 활용하여, 최적의 조합을 찾는 예제입니다.

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

# 1. 탐색할 파라미터 그리드 설정
# l1 규제를 쓸 때는 solver를 'liblinear'나 'saga'로 해야 에러가 안 납니다.
params = {
    'penalty': ['l1', 'l2'],
    'C': [0.01, 0.1, 1, 5, 10, 50, 100]  # 규제 강도 변화
}

# 2. 모델 준비
# max_iter=1000: 데이터가 많으면 학습 반복 횟수를 늘려줘야 경고가 안 뜹니다.
lr_model = LogisticRegression(random_state=42, solver='liblinear', max_iter=1000)

# 3. Grid Search 실행
grid_cv = GridSearchCV(lr_model, param_grid=params, cv=5, scoring='accuracy', n_jobs=-1)
grid_cv.fit(X_train, y_train)

# 4. 결과 확인
print(f"최적의 파라미터: {grid_cv.best_params_}")
print(f"최고 정확도: {grid_cv.best_score_:.4f}")

 

Insight

의료 데이터는 변수(Features) 간의 상관관계가 높거나 노이즈가 많은 경우가 흔합니다.

  • 만약 유전자 데이터처럼 변수가 수만 개인데 샘플 수는 적다면?
    • $\rightarrow$ **penalty='l1'**을 써서 진짜 중요한 유전자 몇 개만 남기는 전략이 유효합니다.
  • 일반적인 검진 데이터라면?
    • $\rightarrow$ **penalty='l2'**에 적절한 C 값을 찾아 안정적인 모델을 만드는 것이 정석입니다.

'Study Note > Machine Learning' 카테고리의 다른 글

정확도(Accuracy)의 함정에서 탈출하기: OOB Score와 ROC-AUC 완벽 해설  (0) 2025.12.22
혼자보다 나은 우리: 보팅(Voting) 앙상블로 예측 성능 극대화하기  (0) 2025.12.22
XGBoost의 채점표: eval_metric 종류와 선택 가이드  (0) 2025.12.21
모델 성능을 쥐어짜는 기술: 하이퍼파라미터 튜닝과 베이지안 최적화  (0) 2025.12.21
"모든 변수가 다 중요할까?" 피처 중요도(Feature Importance)로 모델 다이어트하기  (0) 2025.12.20
    'Study Note/Machine Learning' 카테고리의 다른 글
    • 정확도(Accuracy)의 함정에서 탈출하기: OOB Score와 ROC-AUC 완벽 해설
    • 혼자보다 나은 우리: 보팅(Voting) 앙상블로 예측 성능 극대화하기
    • XGBoost의 채점표: eval_metric 종류와 선택 가이드
    • 모델 성능을 쥐어짜는 기술: 하이퍼파라미터 튜닝과 베이지안 최적화
    RyanNerd
    RyanNerd
    라이언 덕후의 일상 스토리~

    티스토리툴바