결과
약 70명의 참가자 중 1위를 했습니다.
케이스 스터디
핵심은 model complexity가 아니라 scoring rule을 이해하고, 데이터 분산을 줄인 뒤, 단순한 ARIMA 기반 접근으로 보수적인 forecast를 만드는 것이었습니다.
결과
약 70명의 참가자 중 1위를 했습니다.
개요
이 대회는 200개 소상공인의 향후 100일 판매를 예측하는 과제였습니다. 문제는 대출 시뮬레이션 형태로 설계되어 있었기 때문에, 단순한 forecast error가 아니라 과대 예측에 더 큰 패널티가 걸리는 asymmetric scoring rule을 갖고 있었습니다.
많은 참가자가 더 복잡한 모델을 사용했지만, 이 scoring setup에서는 복잡성을 더하는 것보다 문제 정의와 risk-aware forecasting이 더 중요하다고 봤습니다.
ARIMA를 사용했지만, 실제 핵심은 모델 전후의 처리에 있었습니다. cancellation noise를 정리하고, 거래 데이터를 묶어 day-level variance를 줄이고, log transformation을 적용한 뒤, 마지막 forecast 방향까지 scoring rule에 맞게 보수적으로 조정했습니다.
결과적으로 generic accuracy를 추구하는 방식이 아니라, 평가 규칙에 맞는 해석 가능한 workflow를 만들 수 있었습니다.
방법
원본 데이터에는 cancellation을 의미하는 음수 거래가 포함되어 있었습니다. 저는 대응되는 양수 거래와 함께 이를 제거해, 실제 판매보다 분산이 과도하게 커지는 문제를 줄였습니다.
각 상점의 이력 길이에 맞춰 거래를 28일, 14일, 7일 단위로 집계했습니다. 이렇게 하면 day-of-week noise를 줄이면서도 짧은 시계열을 예측 가능한 형태로 다룰 수 있었습니다.
집계된 판매액을 로그 스케일에서 예측해 series를 더 안정화했습니다. 또한 일부 상점에서 무매출 구간이 보이는 경우에는, 그 빈도를 활용해 최종 forecast를 추가로 보정했습니다.
이 competition에서는 과대 예측 비용이 훨씬 컸기 때문에, raw point estimate를 그대로 제출하지 않고 모델의 불확실성을 반영해 forecast를 아래 방향으로 이동시켰습니다.
결과
순위
1위대회에서 최종 1위를 기록했습니다.
참가 규모
약 70명행사에 참여한 참가자 수의 대략적 규모입니다.
교훈
Objective first모델 선택만큼 평가 규칙을 해석하는 일이 중요했습니다.
배운 점
중요한 선택은 더 유행하는 모델을 좇는 것이 아니라, 이 competition이 불확실성 아래에서 보수적인 forecast를 보상한다는 사실을 먼저 이해하고 그에 맞춰 preprocessing과 prediction logic을 설계하는 것이었습니다.
절제된 ARIMA workflow가 잘 작동한 이유는 신호를 정리하고 분산을 줄였을 뿐만 아니라, 최종 forecast를 generic benchmark가 아닌 실제 scoring objective에 맞게 조정했기 때문입니다.
관련 페이지
같은 문제를 다른 각도에서 다루는 케이스 스터디와 방법론입니다.
방법론
SKU 단위 계절성을 추정하고 seasonal bucket으로 묶은 뒤 이를 카테고리 단위 재고 계획에 다시 연결하는 방법입니다.