안녕하세요, 시계열 데이터를 분석할 일이 있어 Kaggle: M5 Forecasting - Accuracy(https://www.kaggle.com/c/m5-forecasting-accuracy/o
안녕하세요, 시계열 데이터를 분석할 일이 있어 Kaggle: M5 Forecasting - Accuracy(https://www.kaggle.com/c/m5-forecasting-accuracy/overview)의 데이터로 여러 모델 프로토타입을 만들어보았습니다. 참고로 본 대회는 한국인 인연준 님이 자랑스럽게 우승한 대회이기도 합니다. 사용한 알고리즘과 라이브러리들에 대해 짧게나마 적어보았습니다. 1. 모델링 목적과 데이터셋 • 수요 예측 문제로 인해 다양한 알고리즘과 라이브러리를 테스트해봐야 했습니다. (일해라, 핫산! 😔) • Kaggle M5 컴피티션을 테스트베드로 삼았는데 이는 각 월마트 지점마다의 상품 품목, ID 30,490개에 대해 과거 1,941일 판매량을 보고 향후 28일의 일별 판매량을 예측하는 문제입니다. • 데이터셋은 (1) 각 ID의 일별 판매량 시계열, (2) 판매 가격 시계열 (3) 휴일과 이벤트 정보를 포함합니다. • 모델의 예측치 평가는 WRMSSE를 통해 합니다. 이는 평균 제곱근 편차의 일종인데 각 ID의 판매 수량과 가격을 가지고 가중치를 매기는 거라 이해하거나 구현하기 다소 까다롭습니다. 자세한 설명은 생략한... 아니 M5 참가자 가이드를, 코드는 Kaggle 토론 창을 참조하세요. 2. 알고리즘과 구현 과정 • Prophet은 2017년에 나와 이쪽 분야를 뒤흔들었던 기린아인데 (...) 시계열을 추세, 계절, 휴일 성분으로 분해하고 각 성분을 조각 별 함수로 추정하는 것이 핵심 아이디어입니다. 특기할 점은 휴일 성분으로 모델에 다양한 공휴일 일정을 직접 반영할 수 있습니다. • Prophet 하이퍼 파라미터 튜닝을 위해 3-폴드 CV를, 손실 함수로 Tweedie를 사용했습니다. Tweedie 분포는 포아송-감마의 변종으로써 단위 시간 내 특정 사건, 즉 구매 발생 횟수 확률 분포를 잘 근사할 수 있습니다. (그게 뭔데, 어떻게 하는 건데! 😔) 후술 할 Kats 라이브러리의 베이즈 최적화 빌트인 모듈을 이용했습니다. 다만, 모델을 각 ID마다 개별로 적합해야 하는 상황인데 pandas의 apply 함수를 쓰려니 멀티프로세싱 성능에 제한이 있었습니다. 그래서 사용한 것이 바로 pandarallel 라이브러리. • 2020년에 나온 DeepAR은 RNN을 다소 변형한 알고리즘입니다. RNN과 다른 점으로 레이어가 미리 정한 확률 분포의 파라미터를 출력하게끔 이어지며 해당 분포에서 생성된 값이 시계열 예측값으로 쓰입니다. 그래서 확률 분포 설정이 매우 중요한데 판매 수량의 문제이므로 포아송 또는 음이항 분포를 사용했습니다. • DeepAR의 장점은 다양한 메타정보와 연관 시계열을 변수로 반영할 수 있다는 것입니다. 다만, GluonTS 라이브러리는 연관 시계열 중 범주형 변수는 받아들이지 않기 때문에 피쳐 해싱 기법을 이용하여 수치형 변수로 모두 변환해주었습니다. • 앞의 것들이 단변량 모델이라면 VAR, 즉 벡터 자기 회귀는 다변량 모델입니다. 암모나이트들이 자주 썼다는 학설이 있을 정도로 😔 오래된 모델인데요. 여기서 좋은 예측 성능을 보여주었습니다. 다변량 모델의 특성상 서로 다른 상품의 시계열이 일종의 변수 역할을 해주기 때문에 상품 품목을 동시에 많이 돌릴수록 성능이 좋아집니다. 근데 메모리 소비량도 지수적으로 늘어납니다. • DeepVAR는 벡터 자기 회귀의 LSTM 버전이며 출력 값의 확률 분포로 로우 랭크 가우시안 프로세스가 사용됩니다. 이것이 판매 수량의 경험적 분포와 궁합이 썩 좋지 않았기 때문에 낮은 예측 성능이 나왔습니다. • 사실 시계열을 집합 연산을 통해 정형화된 변수로 변환한 다음 판매 수량을 예측하는 문제로 바꿔 풀 수 있습니다. 이 분야의 메시와 호날두(...)가 GBDT 계열, 즉 XGBoost와 LightGBM입니다. 본 대회 상위권도 LightGBM의 Tweedie 회귀 모델이 싹쓸이했고 DeepAR 정도가 3위를 지켰습니다. • 저는 tsfresh 라이브러리를 통해 시계열을 자동으로 변수화시킨 다음 LightGBM 하이퍼 파라미터 튜닝을 위해 3-폴드 CV를, Hyperopt 베이즈 최적화 라이브러리를 통해 수행했습니다. 제 경우, D 일까지의 시계열로 D+1 일을 예측하고 예측값을 포함하여 재귀적으로 변수를 만드는 반복 과정을 사용했는데 이렇게 하지 않고 D+k 일을 예측하는 모델을 k개 만드는 등 다양한 해법이 있는 것 같습니다. 3. 라이브러리와 잡담 • Prophet과 다양한 고전 시계열 모델 (ARIMA 등)이 구현된 라이브러리, Kats는 페이스북에서 지난 6월에 릴리스했습니다. 모토는 원스톱 샵으로, 모델 외에 파라미터 튜닝, 백테스팅, 시각화 등 다양한 기능을 넣으려는 것 같습니다. 근데 완성도가 영... 심지어 기존 Prophet 라이브러리는 이식되면서 잘 만들어져 있던 플로팅 기능이 대거 잘렸다. 아직은 0.1.0 버전이니깐 엄마의 마음으로 지켜봅니다. 😔 • 딥러닝 기법이 잘 구현되어 있는 시계열 라이브러리로 AWS 랩스에서 만든 GluonTS를 뽑을 수 있습니다. Gluon... 이름에서 알 수 있듯이 MXNet 기반입니다. 울지 맙시다, 적어도 Theano 기반은 아니잖아요. (...) 고수준 API가 잘 추상화되어 있어 모델을 커스터마이징 할 생각이 아니라면 MXNet 몰라도 편하게 쓸 수 있습니다. 그러나 문제는 기술 문서. 극도로 과묵한 기술 문서 때문에 대민지원 나간 이등병만큼이나 삽질을 해야 했습니다. 😔 • tsfresh 라이브러리는 시계열을 태뷸러 피쳐화하면서 컴퓨팅 리소스를 미칠 듯이 잡아먹습니다. 심지어 pandas 기반으로 돌리면 보아뱀처럼 소유 메모리 이상을 쓰려고 하기 때문에 메모리 에러가 부지기수로 발생하면서 인생이 괴로워집니다. (...) 다음에는 Dask나 PySpark 기반으로 사용해봐야겠습니다. • 베이즈 탐색이 구현된 Hyperopt는 기본기에 충실한데 20년 이후 업데이트가 좀체 없네요. 역시 제가 애정 하는 Optuna로 가야 하는 것인지... 아니면 Ray Tune?