for 토스 NEXT ML CHALLENGE : 광고 클릭 예측(CTR) 모델 개발 https://dacon.io/competitions/official/236575/overview/description
https://colab.research.google.com/drive/1Z6VRiAYuOnaGZmbIGa_6PP4HGiV1Cj93?usp=sharing
==> 교훈: 데이터 확보는 미리미리
**주최측이 공유한 "Sequence LSTM + MLP 기반 CTR 예측 베이스라인"**을 발전시켜서 3일 만에 대회에 출전하려면, 목표는 "완성도 있는 모델 하나 + 성능 향상 시도 + 간단한 서빙 고려"까지 만드는 거야.
아래는 그걸 위해 3일 동안 해야 할 일과 전략을 정리한 로드맵이야.
- 대회 목적: CTR 예측
- 주어진 베이스라인:
Sequence LSTM + MLP - 제한 시간: 3일
- 목표: 베이스라인 개선 + 모델 제출 가능 수준으로 완성
- 베이스라인 코드를 완전히 파악하고
- 현재 성능(AUC, LogLoss)을 기준으로 삼고
- 첫 번째 실험을 성공적으로 재현
-
베이스라인 실행
- 로컬/Colab에서 실행 가능한 상태로 정비
- 학습/평가 로직, 데이터 로더 구조 확인
-
피처 종류 확인
- 범주형: Embedding 사용?
- 시퀀스 피처: LSTM input
- 정적 피처: MLP input
-
모델 구조 이해
- Embedding → LSTM → flatten → MLP → output?
- BatchNorm, Dropout, Activation 등 구성 확인
-
기본 성능 측정
- AUC, LogLoss 출력
- validation 방법: 시간 기반 split인지 확인
-
코드 정비
- 학습 로직 / 평가 로직 / config 따로 정리
config.yaml또는args로 실험 관리 가능하게
✅ Day 1 Output:
- 베이스라인 완전 재현
- 성능 수치 기록 (AUC XX, LogLoss XX)
- 실험 구조 파악
- 작은 개선을 2~3가지 적용해서 성능 향상
- 실험을 자동화하거나 기록하는 시스템 도입
- LSTM → GRU (속도 + 성능 비교)
- Bidirectional LSTM 추가
- Attention Layer 추가 (성능 향상 가능)
- Static한 categorical + continuous 피처에 더 깊은 MLP 사용
- 피처 interaction 추가 (ex. crossed features)
- Dropout → 과적합 방지
- BatchNorm → 안정적인 학습
- Learning Rate Scheduler 적용 (StepLR, Cosine Annealing 등)
- Focal Loss 적용 (클릭 예측이 imbalance한 경우)
- Embedding dim 크기, LSTM hidden size, MLP layer depth 조정
- EarlyStopping, batch_size 조정
✅ 추천 실험 기록 방법:
results/exp1/,results/exp2/이런 식으로 로그 및 모델 저장- 성능 기록은 CSV 또는 엑셀로 간단하게
✅ Day 2 Output:
- 실험 2~4개 완료
- 개선된 모델 하나 확보 (베이스라인 대비 성능 향상 확인)
- 코드 정리 완료
- 가장 잘 나온 모델로 최종 학습
- 제출 가능한 형태로 마무리
- 간단한 서빙 아이디어 정리
-
최종 모델 학습
- 전체 학습 데이터로 학습
- 모델 저장 (.pt 또는 .pkl 등)
-
추론 코드 정비
- 테스트용 예측 함수 작성:
predict(input_features) - 실시간 예측 고려해서 추론 속도 측정 (timeit 사용)
- 테스트용 예측 함수 작성:
-
서빙 준비 (선택)
- 추론만 가능한 간단한 FastAPI or Flask 서빙 코드 (선택)
- 모델 로딩 + 추론 + 결과 반환
-
모델/실험 요약 작성
- 어떤 모델 구조인지
- 어떤 개선을 했는지
- 성능이 얼마나 향상됐는지
-
대회 제출용 코드 정리
train.py,predict.py,config.yaml등- README.md 포함
✅ Day 3 Output:
- 최종 모델 제출 준비 완료
- 결과 요약 정리
- 성능 평가 수치 확보 (e.g., AUC XX.X → XX.X%)
- 📌 LSTM 구조는 과적합 쉽게 발생 → Dropout, EarlyStopping 적극 사용
- 📌 시퀀스 길이 확인: 너무 길면 잘리는지, 너무 짧으면 정보 부족인지 체크
- 📌 실험 코드 반복 쉽게 만들기 (config 기반 실험 관리 추천)
- 📌 성능이 미세하게 차이날 땐 AUC 기준으로 판단
| 날짜 | 목표 | 산출물 |
|---|---|---|
| Day 1 | 베이스라인 분석 및 실행 | 초기 성능 재현 + 구조 파악 |
| Day 2 | 모델 개선 실험 반복 | 성능 개선 모델 확보 |
| Day 3 | 최종 모델 학습 & 제출 | 최종 모델 + 예측 코드 + 제출물 정리 |
좋아, "3일 안에 출전"이라는 제한된 시간 안에서 우선적으로 실험할 때 성능 개선 가능성이 높고, 구현 난이도는 낮은 것들을 중심으로 정리해줄게.
- ✅ 왜? GRU는 LSTM보다 파라미터가 적고 학습 속도 빠르며, 비슷하거나 더 좋은 성능을 내는 경우도 많아.
- ✅ 어떻게?
nn.LSTM→nn.GRU로 교체, 나머지 구조는 동일 - ✅ 기대 효과: 학습 속도 개선 + 과적합 줄이면서 성능 유지/향상 가능
- ✅ 시간 소요: 30분 내 실험 가능
- ✅ 왜?
Embedding dim이 너무 크면 과적합, 너무 작으면 표현력 부족
보통
embedding_dim = min(50, category_count // 2)정도로 설정하면 좋아. - ✅ 어떻게? 8, 16, 32 등 몇 가지 dimension 실험해보기
- ✅ 기대 효과: 더 적절한 차원 설정으로 일반화 성능 향상
- ✅ 시간 소요: 실험 1~2시간 내 가능 (병렬 실험하면 빠름)
-
✅ 왜? 베이스라인은 LSTM + MLP 구조라 과적합 쉽게 발생 Dropout은 가장 쉬운 regularization 방법
-
✅ 어떻게?
- LSTM 뒤 →
Dropout(p=0.2~0.5) - MLP 각 레이어 사이에도 추가
- LSTM 뒤 →
-
✅ 기대 효과: 과적합 방지 → validation 성능 개선
-
✅ 시간 소요: 1~2시간 내 적용 + 실험 가능
-
✅ 왜? 시퀀스에서 모든 step이 중요한 건 아님 → Attention으로 가중치 학습 최근 CTR 논문들 (DIN, DIEN 등)에서도 Attention 사용 많음
-
✅ 어떻게? LSTM 출력 → Attention → Weighted sum → MLP로 입력 아래처럼 간단한 Attention 구현 가능:
class Attention(nn.Module): def __init__(self, input_dim): super().__init__() self.attn = nn.Linear(input_dim, 1) def forward(self, x): # x: [batch, seq_len, dim] score = self.attn(x).squeeze(-1) # [batch, seq_len] weight = torch.softmax(score, dim=1) # attention weights context = (x * weight.unsqueeze(-1)).sum(dim=1) # weighted sum return context
-
✅ 기대 효과: 시퀀스 피처의 의미 있는 step 강조 → CTR 예측 향상
-
✅ 시간 소요: 1~3시간 내 구현 가능
-
✅ 왜? 과적합 방지 + 수렴 시간 단축에 매우 효과적
-
✅ 어떻게?
- EarlyStopping: validation loss 5 epoch 이상 향상 없으면 stop
- Learning Rate Scheduler:
ReduceLROnPlateau,CosineAnnealingLR등
-
✅ 기대 효과: 빠른 수렴 + 과적합 방지 → 실험 효율 + 성능 동시 개선
-
✅ 시간 소요: 1시간 내 적용 가능
| 방법 | 설명 | 난이도 |
|---|---|---|
| Focal Loss | 클릭 데이터 불균형 대응 | ⭐⭐ |
| Sequence 길이 클리핑 | 너무 긴 시퀀스 → 정보 희석 문제 해결 | ⭐ |
| Feature Interaction | 범주형 피처 2~3개 조합 → 새 피처 생성 | ⭐⭐ |
| Pre-trained Embedding | 사전 학습된 Embedding 사용 (희귀 카테고리 강화) | ⭐⭐⭐ |
| MLP 구조 변경 | Layer 수 변경, Residual 추가 등 | ⭐⭐ |
| 순위 | 개선 내용 | 이유 | 예상 시간 |
|---|---|---|---|
| ✅ 1 | LSTM → GRU | 더 빠르고, 과적합 덜함 | ~30분 |
| ✅ 2 | Embedding dim 튜닝 | 과소/과대 표현 방지 | |
| ✅ 3 | Dropout 추가 | 과적합 방지 | ~1시간 |
| ✅ 4 | Attention 추가 | 시퀀스 중요 step 강조 | |
| ✅ 5 | EarlyStopping + Scheduler | 안정적 학습 | ~1시간 |