[Python] Neural Prophet
- NeuralProphet은 쉽게 이야기 하면 Neural Network(AR-Net)과 Prophet의 결합이다.
- \(\hat{y_t}\)는 Trend, Seasonality, Event & Holiday, Regression for known future variable, Auto-regression, Regression for lagged observation of variables 각각 6개의 식으로 구성이 되어 있다.
Trend
- Trend는 신호의 전체 Variation 중 가장 많은 부분을 차지하고 있다.
- Neural Prophet은 Training을 통해서 가장 명확하게 Variation이 발생하는 지점, Change Point를 찾는다. 그리고 Change Point간의 Trend는 Linear하다고 가정을 하고, Linear Regression을 추정한다.
- 당연한 것이겠지만 이 Regression의 Loss는 Model Loss에 모두 더해지고 Gradient Descent Method를 통해서 Loss를 Minimize하는 방향으로 Regression을 개선해나간다. 이 때 Regression의 Paraemeter를 여기서는 Growth Value라고도 부른다.
- 이 때 L1 Regularization 을 이용해서 Change Point 중 불필요한 것들은 제외를 해나가는데 임의로 Change Point를 넣어줄 수도 있다. 스타트업의 경우 대규모 투자 또는 프로모션 집행 시점과 같이 Domain Knowledge에 기반한 시점을 임의로 넣어주면 정확도를 높여줄 수도 있다.
Seasonality
- Seasonality는 신호의 주기적인 움직임, 패턴이라고 볼 수 있다. 이러한 부분을 모델링하기 위해서는 Neural Prophet은 Targetd을 주기적으로 반복되는 Fourier Series 형태의 연속형 함수로 가정을 한다. 구체적으로는 다음과 같은 형태를 취하고 있다.
- \(S_{p}(t)=\sum_{j=1}^{k}\left(a_{j} \cdot \cos \left(\frac{2 \pi j t}{p}\right)+b_{j} \cdot \sin \left(\frac{2 \pi j t}{p}\right)\right) \)
- 이 때 Trend와 Seasonality간의 관계는 Multiplicative, Additive 중 선택을 해서 진행하면 된다.
Auto Regression
- 시계열 하면 단골로 나오는 Auto Regression이다. 시점별 Random Variable 간의 상관성을 파악하기 위한 Auto Regression이다. 식은 다음과 같다.
- \(y_{t}=c+\sum_{i=1}^{i=p} \theta_{i} \cdot y_{t-i}+e_{t} \)
- 이 식에서 $\epsilon$은 White Noise로 Random이고 평균이 0이면서 분산이 1인 정규 분포를 따라야 한다.
- 다만 Auto Regression으로는 \(t+h,h=1\)시점에 대해서 예측이 가능하기 때문에 결국 \(h>1\)인 경우 Model의 갯수는 \(h\)개 필요하게 되는데 Neural Prophet은 이 부분에 대해서 AR Net으로 접근한다. 식으로 보면 다음과 같다.
- \( A^{t}(t), A^{t}(t+1), \ldots, A^{t}(t+h-1)=\operatorname{AR}-\operatorname{Net}\left(y_{t-1}, y_{t-2}, \ldots, y_{t-p}\right) \)
- 이 때 중요한 부분 중 하나가 \(p\)이다. AR-Net의 Input으로 넣어야 하는 Time-Series의 Length인데, 비 부분은 Domain Knowledge를 바탕으로 과거 데이터를 보면서 조절해야할 필요가 있다. 정확하지는 않지만 경험상 Seasonality등을 Detect하고 반영하기 위해서는 두 번 이상의 Period가 반복된 데이터가 상대적으로 정확도에서 우수하게 나왔다.
Lagged Regressors
- Neural Prophet의 Core idea인 AR-Net이 적용되기 위해서는 필수적으로 필요한 부분이다.(라고 하지만 사실 다른 시계열 모델에서 Lagged Data는 매우 중요하다.)
Future Regressors
- Target Value를 예측하기 위한 다른 변수들의 미래 수치값이다. Controllable Variable이면 추가할 여지가 있겠으나, 없어도 모델은 돌아간다.
Event & Holiday
- 마지막 Module은 주기적으로 반복되지 안는 이벤트(월드컵, 지방선거 등)나 휴일에 대한 부분을 처리하는 부분이다.
- 국가의 공휴일을 미국이었던가, 몇몇 국가는 라이브러리에 내장되어 있으나, 한국은 그렇지 않아서 임의로 넣어주면 좋다. 특히 추석이나 설날은 음력을 양력으로 매해 변화해서 쇠고 있기 때문에 필수이다.
Prophet vs Neural Prophet
- Prophet vs. NeuralProphet 이라는 글에서 가볍게 실험한 결과를 공개했는데, 데이터 사이즈가 작을 때는 Neural Prophet이 데이터가 커지면 Prophet이 앞선다고 한다. RMSE, MAPE로 비교했는데 약간 Case by Case일 것 같기는 하다.