← 모델 목록
수업 실습 2026-08-31 · tabular-classification
선형 모델 계열 (로지스틱 회귀)

LogisticRegression (scikit-learn)

로지스틱 회귀 구독 이탈 예측 (ML 미니대회 분류 트랙 · 최종 제출)
모델
피처의 선형 결합을 시그모이드로 확률로 바꾸는 이진 분류 모델. 여기서는 강한 L2 규제(C 0.01)와 balanced 가중치
사용 목적
수업 ML 미니대회 분류 트랙에서 CatBoost 튜닝이 한계에 부딪힌 뒤, 시간 분할·5-fold 두 검증에서 모두 앞선 모델로 최종 제출하려고 사용
코드
mnmms/mldl
가중치
없음
cv5_auc78.8%
time_split_auc78.8%
학습 시간없음
추론 CPU / GPU측정 안 함

데이터

  • 대회 제공 train 90,000 · 양성 10.71%
  • 검증: 시간 분할(2025-09 이후) · 5-fold CV
  • 제출: test 25,000 확률값

학습

  • C 0.01 · class_weight balanced
  • 부트스트랩 10개 평균으로 최종 제출
  • CPU · 학습 시간 [미확인]

결과

  • 시간 분할 AUC 0.78808 (CatBoost 0.78476)
  • 5-fold AUC 0.78769 (CatBoost 0.78404)
  • 리더보드 점수 [미확인]

배운 점

  • 두 검증 방식 모두에서 CatBoost보다 일관되게 좋음
  • 블렌드보다 단독이 나음
  • 파생변수는 ±0.0003 노이즈라 채택 안 함
개요용도 의도한 용도: 미니대회 분류 트랙 최종 제출 ( customer_id, churn_probability ) 대상 사용자:…

용도

  • 의도한 용도: 미니대회 분류 트랙 최종 제출 (customer_id, churn_probability)
  • 대상 사용자: 해당 없음 (학습용)
  • 의도하지 않은 용도: 실제 구독 이탈 예측 (합성 데이터)

모델 정보

항목 값
베이스 모델 직접 구현 (처음부터 학습)
크기 · 변형 LogisticRegression(C=0.01, class_weight='balanced', max_iter=1000)
리비전 scikit-learn 1.9.0 (uv.lock 기준)
아키텍처 입력 53열(표준화 숫자 22 + 원-핫 범주)의 선형 결합 → 시그모이드. 최종 제출은 부트스트랩(복원 추출) 10번 학습한 모델의 확률 평균
학습 방식 처음부터 학습
프롬프트 · 에이전트 구성 해당 없음
데이터결정 트리 카드 와 같은 데이터·전처리입니다. 단, 시간 분할 검증에서는 결측 중앙값을 학습 구간(2025-09-01 이전)으…

결정 트리 카드와 같은 데이터·전처리입니다. 단, 시간 분할 검증에서는 결측 중앙값을 학습 구간(2025-09-01 이전)으로만 계산합니다.

항목 값
확보 방식 공개 데이터셋 그대로 (수업 대회 제공 합성 데이터)
출처 mini-competition/participant/classification/train.csv, test.csv
직접 수집 내용 해당 없음
이용 조건 확인 해당 없음 (수업 자료)
규모 train 90,000 / test 25,000
분할 시간 분할 (snapshot_date 2025-09-01 기준, 검증 4개월 = test 길이와 같음), 5-fold CV. 최종 학습은 train 전체
레이블·클래스 분포 이탈 10.71%
전처리 결측 중앙값·'missing', payment_method 제거, StandardScaler + OneHot (handle_unknown='ignore')
개인정보·민감정보 처리 해당 없음 (합성 데이터)
학습하이퍼파라미터 C=0.01 ( logreg_blend_test.py 에서 C 0.01 / 0.1 / 1 / 10 비교), cl…
항목 값
하이퍼파라미터 C=0.01 (logreg_blend_test.py에서 C 0.01 / 0.1 / 1 / 10 비교), class_weight='balanced', max_iter=1000
에폭 / 스텝 해당 없음 (최대 1,000회 반복 최적화)
학습 시간 [미확인] (스크립트에 시간 측정이 없음)
하드웨어 CPU (scikit-learn). 장비 이름 [미확인]
프레임워크 scikit-learn 1.9.0, pandas 3.0.5
시드 · 재현 방법 부트스트랩 resample(random_state=i), 모델 random_state=i (i = 0 ~ 9). 시간 분할 기준일 2025-09-01. 5-fold는 StratifiedKFold(5, shuffle=True, random_state=42)
결과커밋 a3a1452 메시지에 기록된 값입니다 (스크립트 실행 출력은 저장되지 않음). ROC-AUC (시간 분할) 0.7880…

커밋 a3a1452 메시지에 기록된 값입니다 (스크립트 실행 출력은 저장되지 않음).

지표 값 테스트셋 비교 대상 (CatBoost 기본)
ROC-AUC (시간 분할) 0.78808 2025-09 ~ 12 검증 0.78476
ROC-AUC (5-fold CV 평균) 0.78769 train 전체 5-fold 0.78404
리더보드 ROC-AUC [미확인] test 25,000 기록 없음
부트스트랩 10개 앙상블 AUC [미확인] 시간 분할 스크립트가 출력하지만 결과가 남아 있지 않음
  • 커밋 메시지: CatBoost와의 블렌드보다도 로지스틱 회귀 단독이 더 나아 최종 제출 모델로 채택
  • 같은 대회 다른 카드의 대표 지표(무작위 valid AUC)는 이 모델에서 재지 않았습니다. 비교표에는 비어 보입니다

추론 성능 (CPU / GPU)

측정 안 함.

장비 장비 이름 배치 크기 지연 시간 (샘플당, p50 / p95) 처리량 (샘플/초) 메모리 사용
CPU [미확인] - 측정 안 함 측정 안 함 측정 안 함
GPU 해당 없음 (scikit-learn은 CPU 전용) - - - -
한계 · 배운 점한계 알려진 실패 유형: [미확인] (로지스틱 회귀 자체의 오차 분석은 하지 않음. 오차 분석은 CatBoost 대상) 편향 …

한계

  • 알려진 실패 유형: [미확인] (로지스틱 회귀 자체의 오차 분석은 하지 않음. 오차 분석은 CatBoost 대상)
  • 편향 / 공정성 이슈: 해당 없음 (합성 데이터)
  • 성능이 떨어지는 입력 조건: test에만 있는 희귀 범주 (원-핫에서 모두 0)
  • [🚩AI 설명] AUC 차이(+0.003)는 같은 대회에서 추정한 표준오차(약 0.008)보다 작아, 두 검증에서 같은 방향이었다는 점이 근거의 핵심

배운 점

커밋 a3a1452 메시지에서 옮긴 내용입니다.

  • CatBoost 재튜닝이 계속 노이즈 수준에 머물러 오차 분석을 했고, 놓친 이탈 고객은 "불만 신호 없이 만족하며 떠나는" 유형이라 트리 모델 개선의 한계로 추정
  • 비율·월/계절 파생변수는 시간 분할 검증에서 ±0.0003 노이즈 수준이라 채택하지 않음
  • 시간 분할과 5-fold 두 방식 모두에서 일관되게 CatBoost보다 좋았던 것이 "지금까지 실험 중 가장 신뢰도 높은 신호"
  • 실험 코드를 지우지 않고 feature_importance_check.py, error_analysis.py, feature_engineering_test*.py, logreg_*.py로 남겨 재현 가능하게 보존
사용 방법코드 셀 2개
In [1]시간 분할로 단독 vs 부트스트랩 비교
from sklearn.linear_model import LogisticRegression
from sklearn.utils import resample

cutoff = pd.Timestamp('2025-09-01')
tr_raw = train_df[train_df['snapshot_date'] < cutoff].copy()
val_raw = train_df[train_df['snapshot_date'] >= cutoff].copy()
tr_proc = fill_missing(tr_raw, ref=tr_raw)
val_proc = fill_missing(val_raw, ref=tr_raw)

X_tr = pp.fit_transform(tr_proc[feature_cols])
X_val = pp.transform(val_proc[feature_cols])

single_model = LogisticRegression(C=0.01, class_weight='balanced', max_iter=1000, random_state=42)
single_model.fit(X_tr, y_tr)
single_auc = roc_auc_score(y_val, single_model.predict_proba(X_val)[:, 1])

boot_probas = []
for i in range(10):
    X_res, y_res = resample(X_tr, y_tr, random_state=i, replace=True)
    m = LogisticRegression(C=0.01, class_weight='balanced', max_iter=1000, random_state=i)
    m.fit(X_res, y_res)
    boot_probas.append(m.predict_proba(X_val)[:, 1])
boot_auc = roc_auc_score(y_val, np.mean(boot_probas, axis=0))

print(f'(시간분할) LogReg single AUC: {single_auc:.5f}')
print(f'(시간분할) LogReg bootstrap(10) ensemble AUC: {boot_auc:.5f}')
In [2]train 전체로 학습해 제출 파일 만들기
test_probas = []
for i in range(10):
    X_res, y_res = resample(X_train_full, y_train_full, random_state=i, replace=True)
    m = LogisticRegression(C=0.01, class_weight='balanced', max_iter=1000, random_state=i)
    m.fit(X_res, y_res)
    test_probas.append(m.predict_proba(X_test_full)[:, 1])

submission = pd.DataFrame({
    'customer_id': test_df['customer_id'],
    'churn_probability': np.mean(test_probas, axis=0),
})
submission.to_csv(f'{BASE}/submission.csv', index=False)

같은 과제·데이터셋 비교 tabular-classification · 수업 미니대회: 60-day Subscription Churn (합성) · 4개

굵은 이름이 이 모델입니다. 주황 테두리가 그룹 안 최고값입니다.

cv5_auc 높을수록 좋음 · 축 일부 생략