1. 문제 정의(Problem Framing)
"무엇을 예측할지"보다 중요한 건 "어떻게 쓸지"다!
1) 예측 대상 정의
- 분류: y가 0/1, A/B/C 같은 범주
- 회귀: y가 연속값(가격, 수요, 시간 등)
2) 예측이 쓰이는 방식
- 예측 확률을 그대로 쓰나?
- 특정 임계값으로 의사결정하나?
- 회귀 결과에 제약이 있나?
3) 평가 지표(KPI) 정의
- 분류: F1, ROC-AUC, PR-AUC, Recall@k 등
- 회귀: MAE, RMSE, MAPE, R^2 등
2. 데이터 점검 & EDA
단순히 그래프를 그리는 과정이 아닌 데이터를 이해하고 리스크를 찾는 과정
1) 타깃(y) 확인
- 분류: 클래스 비율(불균형 여부), 데이터 드리프트
- 회귀: 분포 형태(롱테일 여부), 이상치, 음수 가능 여부
- y 분포가 한쪽으로 심하게 치우치면 log1p 고려
- 극단값이 손실(MSE)을 지배할 때, 이상치 처리 전략 필요
2) 피처(X) 점검
- 결측치 비율과 패턴
- 범주형/수치형 구분
- 누수 후보 피처 존재 여부
예) "대출 승인 여부 예측"인데 '승인 후 생성된' 피처가 들어가면 누수!
3) 데이터 단위 확인
- 한 row가 "고객 1명"인지 "거래 1건"인지
- 여러 row가 같은 엔터티를 공유하는지(고객 중복) -> 분할 전략에 큰 영향
3. 데이터 분할 전략
1) 기본 분할(일반 tabular)
- train/valid/test
- 데이터가 작으면 K-Fold CV 추가
2) 분류: Stratified split
- 클래스 비율 유지가 중요하면 Stratified 사용
3) 그룹 단위 누수 방지(Group split)
같은 고객의 데이터가 train과 test에 동시에 있으면 누수!
예) 고객별 여러 거래 row가 있는 데이터 -> 고객 단위로 GroupKFold/GroupShuffleSplit
4) 시계열: 시간 기준 분할이 정석
- 랜덤 셔플 금지
- 과거로 학습 -> 미래를 평가
4. 전처리 & 피처 엔지니어링
전처리는 "성능 올리는 기술"이기도 하지만 그보다 중요한 건 train과 inference에서 동일하게 재현되는 것!
1) 전처리
- 결측치 처리: mean/median, "missing"카테고리, 모델 내 처리
- 범주형 인코딩: one-hot/target encoding/catboost 내장
- 스케일링: Standard Scaler, MinMaxScaler -> 선형/SVM/KNN에서 특히 중요
- 이상치 처리: clip/winsorize/robust scaling
2) 피처 엔지니어링
- 수치형 변환: log, binning
- 상호작용: ratio, diff, product
- 집계 피처(거래 데이터): 고객별 count/sum/mean, 최근 N일 rolling 등
- 시간 피처: 요일/월/시간대, lag, rolling mean
5. Baseline 모델
성능 좋은 모델을 사용하기 전에 누수/피처 유효성/개선 여지를 확인하는 기준
- 모델
- 분류: Logistic Regression, Linear SVM
- 회귀: Linear/Ridge, RandomForestRegressor
- 확인할 것
- 점수가 말이 되는가? -> 누수 의심
- 어떤 피처가 중요한가? -> 해석 가능한 모델에서 확인
- 단순한 규칙으로도 해결 가능한 문제인가?
6. 강력 모델 + 튜닝
1) 기본 루트
- tabular: XGBoost/LightGBM/CatBoost가 1순위 되는 경우가 많음.
- 데이터가 작거나 해석이 중요하면 선형 모델 + 좋은 피처로 끝내기도 함.
2) 튜닝 순서
- learning_rate 낮게 고정(0.05 ~ 0.1)
- depth/num_leaves로 모델 복잡도 설정
- min_data_in_leaf로 과적합 방지
- subsample/feature_fraction으로 랜덤성 추가
- n_estimators 늘리되 early stopping 사용
| 파라미터 | 역할 | 추천값 | 효과 |
|---|
| learning_rate | 각 트리 기여도 (스텝사이즈) | 0.05~0.1 고정 | 학습 속도 제어, 과적합 방지 |
| max_depth / num_leaves | 트리 복잡도 | max_depth=6num_leaves=31 | 표현력 vs 과적합 트레이드오프 |
| min_data_in_leaf | 리프당 최소 샘플 수 | 20~100 | 과적합 방지, 노이즈 무시 |
| subsample / feature_fraction | 랜덤성 추가 | 0.8 | 트리 다양성↑, 상관관계↓ |
| n_estimators + early_stopping | 트리 개수 + 자동 중단 | 1000 + early_stopping(50) | 충분 학습 + 과적합 방지 |
7. 검증 & 오류 분석
1) CV 점수 vs Holdout 점수 비교
- CV는 높은데 holdout이 낮으면 분할 전략/누수/드리프트 의심
- 둘 다 낮으면 피처/모델 표현력 부족
2) 오류 분석
- 어떤 구간에서 오차가 커지는지
- 어떤 피처 값에서 틀리는지
- 시간에 따라 성능이 떨어지는지 (드리프트)
- 회귀면: "큰 값에서만 크게 틀리는지" -> log 변환 힌트
오류 분석과 하이퍼파라미터로 모델 개선 가능
8. 최종 모델 선택 및 해석
1) 단일 모델 vs 앙상블
- 단일 부스팅 모델이 대부분 충분히 강함
- 리더보드/경쟁형이면 stacking으로 더 올릴 수 있음
- 실무 배포는 단순한 모델이 유리할 때도 있음
2) 해석
- 선형: 계수
- 트리/부스팅: feature importance, SHAP
- "왜 틀리는지"를 아는 게 중요함!
9. Production(추론) 관점
- 추론 속도(요청당 ms)
- 배치 vs 실시간
- 피처 생성 비용
- 결측/이상치 들어올 때의 안전장치
- 모델/전처리 버전 관리
10. 재현 가능한 파이프라인화
- split seed 고정
- 전처리/피처 생성 코드 고정
- 실험 로그(파라미터/점수) 기록
- 모델 artifact 저장
- 동일한 입력 -> 동일한 출력 보장
분류 vs 회귀
| 항목 | 분류 | 회귀 |
|---|
| 핵심 이슈 | 불균형, threshold | y 분포, 이상치, 범위 제약 |
| 지표 | AUC/F1/PR-AUC | MAE/RMSE/MAPE |
| 후처리 | threshold 튜닝 | log 되돌리기, clip/제약 |
| 오류 분석 | 어떤 클래스가 틀리나 | 어떤 구간에서 오차가 큰가 |