대표 실행은 다른 모델과 같은 valid AUC로 비교되도록 r1로 두었습니다. 리더보드 최고는 r4입니다 (사용자 확인 필요)
r2의 best params는 노트북 출력값입니다. tuning_experiments.py의 CONFIG_F1_TUNED(iterations 475, lr 0.0972, l2 9.80)는 다른 탐색 결과로 보입니다 [미확인]
추론 성능 (CPU / GPU)
측정 안 함.
장비
장비 이름
배치 크기
지연 시간 (샘플당, p50 / p95)
처리량 (샘플/초)
메모리 사용
CPU
[미확인]
-
측정 안 함
측정 안 함
측정 안 함
GPU
해당 없음 (GPU 설정 안 함)
-
-
-
-
실험 기록6회 측정 · 대표 r1
같은 모델을 설정·분류기를 바꿔 6번 측정한 기록입니다. ★ r1이(가) 대표 결과(맨 위 수치)입니다.
직전 실행에서 바뀐 설정지표 최고값
실행
날짜
바뀐 점
iterations
learning_rate
depth
l2_leaf_reg
class_weight
seeds
val_auc
f1
cv5_auc
time_split_auc
leaderboard_auc
학습 시간
★ r1
기본 설정
2026-08-30
기준
l2_leaf_reg 3은 CatBoost 기본값 [🚩AI 설명]
300
0.05
6
3
Balanced
1
77.1%
34.0%
78.4%
78.5%
78.0%
-
r2
Optuna F1 튜닝
2026-08-30
Optuna로 iterations·learning_rate·depth·l2_leaf_reg를 F1 목적으로 100회 탐색
AUC가 기본보다 낮아 제출 전에 폐기 (tuning_experiments.py 실험 1)
466
0.0727
8
5.44
Balanced
1
75.9%
36.0%
-
-
-
12.7분
r3
Optuna AUC 튜닝 (단일 split)
2026-08-31
Optuna 목적을 roc_auc_score로 바꾸고 class weight 사용 여부도 탐색
리더보드 3등으로 하락
245
0.0653
3
2
none
1
77.3%
-
78.5%
-
77.9%
-
r4
기본 설정 + 10시드 앙상블
2026-08-31
r1 설정을 시드만 10개로 바꿔 학습하고 예측 확률을 평균
리더보드 점수가 오른 유일한 시도
300
0.05
6
3
Balanced
10
-
-
78.5%
-
78.1%
-
r5
CV 튜닝(depth 4) + 10시드
2026-08-31
5-fold CV 기반 Optuna로 찾은 설정에 10시드 앙상블
로컬 CV는 r4보다 좋았지만 리더보드에서는 낮음
405
0.045
4
3.75
none
10
-
-
78.6%
-
78.0%
-
r6
r4 + r5 블렌드
2026-08-31
r4 10개 + r5 10개, 모델 20개 확률 평균
제출 점수 기록 없음 [미확인]. 이후 최종 제출은 로지스틱 회귀로 바뀜
300 / 405
0.05 / 0.045
6 / 4
3 / 3.75
Balanced / none
20
-
-
-
-
-
-
val_auc 변화 실행 순서대로 · 높을수록 좋음 · 축 일부 생략
r1 · 기본 설정
77.1%
r2 · Optuna F1 튜닝
75.9%
r3 · Optuna AUC 튜닝 (단일 split)
77.3%
한계 · 배운 점한계 알려진 실패 유형: 오차 분석( error_analysis.py , 커밋 a3a1452 메시지)에서 놓친 이탈 고객(FN…
한계
알려진 실패 유형: 오차 분석(error_analysis.py, 커밋 a3a1452 메시지)에서 놓친 이탈 고객(FN)은 NPS·시청 시간·세션 수가 오히려 높고 상담·결제 실패는 적은 "불만 신호 없이 만족하며 떠나는" 유형. 트리 모델이 배운 "문제 신호 = 이탈"과 어긋남
편향 / 공정성 이슈: 해당 없음 (합성 데이터)
성능이 떨어지는 입력 조건: train(2024~2025)과 test(2026) 사이 시간 분포 이동. 무작위 split·CV로는 이를 흉내 낼 수 없음 (tuning_experiments.py 핵심 교훈)
배운 점
tuning_experiments.py 문서 주석과 커밋 메시지에서 옮긴 내용입니다.
F1을 목적으로 튜닝한 모델은 실제 채점 지표(ROC-AUC)에서 기본 모델보다 낮았음 → 목적함수를 대회 지표와 맞춰야 함
로컬 검증(단일 split이든 5-fold든 시간 분할이든)이 리더보드 순위를 안정적으로 예측하지 못함
AUC 표준오차를 sqrt(AUC*(1-AUC)/n_pos)로 대략 계산하면 약 0.008인데, 다투던 점수 차이(0.0005 ~ 0.0016)는 이보다 작아 노이즈 범위
시드 앙상블은 분산이 큰 설정(depth 6, balanced)에서 효과가 컸고(+0.00102), 얕은 설정(depth 4)에서는 미미(+0.00008)
[[11958 4115]
[ 690 1237]]
F1 Score : 0.3398818519027339
In [2]Optuna F1 튜닝 결과 (r2)
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=30)
study.optimize(objective, n_trials=70) # 기존 30 + 70 = 총 100 trials
print('total trials :', len(study.trials))
print('best f1 :', study.best_value)
print('best params :', study.best_params)
Out[2] 출력 보기
total trials : 100
best f1 : 0.3597243234157001
best params : {'iterations': 466, 'learning_rate': 0.07266938077686465, 'depth': 8, 'l2_leaf_reg': 5.4428683566481855}
In [3]모델별 ROC-AUC 비교 (확률 기준)
from sklearn.metrics import roc_auc_score
auc_rows = []
for name, m in models.items():
proba = m.predict_proba(X_val)[:, 1]
auc_rows.append((name, roc_auc_score(y_val, proba)))
pd.DataFrame(auc_rows, columns=['model', 'roc_auc']).sort_values('roc_auc', ascending=False)
SEEDS_10 = [42, 7, 123, 2024, 99, 1, 17, 555, 888, 2026]
def seed_ensemble_predict(config, X_train_scaled, y_train_full, X_target, seeds=SEEDS_10):
"""동일 설정을 시드만 바꿔 여러 번 학습 후 예측 확률 평균 (variance 감소)."""
probas = []
for s in seeds:
params = {k: v for k, v in config.items() if k != 'random_state'}
m = CatBoostClassifier(**params, random_state=s)
m.fit(X_train_scaled, y_train_full)
probas.append(m.predict_proba(X_target)[:, 1])
return np.mean(probas, axis=0)
같은 실습의 다른 모델 mini-competition-classification.ipynb · 2개