4 분 소요


image

2017년 페이스북에서 공개한 시계열 예측 방법인 prophet 논문에 대한 리뷰입니다.

prophet은 R/Python 라이브러리도 공개되어 있어서 적용하기도 쉽고 날짜 정보와 예측할 y만 있으면 되기 때문에 간편하면서도 성능이 좋습니다.

논문 분량은 총 20장 정도 되고 아래의 Quick Start도 활용하시면 개념 이해나 코드로 적용하기에 도움이 많이 될 것 같습니다.

본 포스팅의 모든 자료는 paper와 quick start documentation에서 가져왔습니다.

papar : https://peerj.com/preprints/3190.pdf
R/Python : https://facebook.github.io/prophet/docs/quick_start.html


1. Introduction

저자는 business 예측 모델 구축에 가장 중요한 한계점을 관찰했다고 했는데

  • 첫 번째, 완전히 자동화된 예측 테크닉은 tuning 하기 어렵고 유용한 가정이나 경험적 사실들을 반영하기 어렵다.
  • 두 번째, 분석자는 도메인 지식은 풍부할지 몰라도 시계열 예측에 대해서는 잘 모른다.

그 결과로 고성능 예측에 대해 수요는 많지만 정작 할 수 있는 사람이 별로 없으며 그것이 이 연구의 동기가 되었다고 합니다.

그래서 이 논문에서는 다음의 사항들을 만족하는 시계열 모델을 만드는 것을 목표로 삼습니다.

1) 시계열 방법에 대한 교육을 받지 않은 비전문가도 사용할 수 있어야 한다.
2) 잠재적 특징들을 시계열 모델에 반영할 수 있어야 한다.
3) 예측을 평가하고 다양하게 비교되도록 자동화되어야 한다.



Figure 1: Schematic view of the analyst-in-the-loop approach to forecasting at scale, which best makes use of human and automated tasks.


2. Features of Business Time Series


Figure 2: The number of events created on Facebook.

business forecasting 문제는 다양하지만 공통적인 몇 가지 특징들이 있다고 합니다. 페이스북에서 생성된 이벤트 수에 대한 시계열 데이터를 예로 들어 특징들을 살펴보겠습니다.

위 그림을 보시면 시계열 데이터가 가질 수 있는 계절적 요소를 확인할 수 있는데, 주간/연간의 주기성이나 새해 전으로 하강하는 모습이 있다거나 최근 6개월 동안은 과거와는 달리 과도하게 변화하는 양상을 보이고 있습니다.

이러한 것들은 시계열 데이터에서 많이 보이며 완전히 자동화된 방법으로 이러한 데이터를 예측하는 것은 한계가 있습니다.

아래의 그림이 바로 완전히 자동화된 방법들의 한계를 보여주는 예측 결과입니다. 논문의 저자는 아래 그림들을 보여주며 아래 모델을 가지고 적절하게 조정하려면 각 시계열 모델이 어떻게 작동하는지 철저하게 이해해야 한다고 하는데 일반적인 분석가들은 하지 못할 것이라고 합니다.


Figure 3: Forecasts on the time series from Fig. 2 using a collection of automated forecasting procedures.


3. The prophet Forecasting Model

Prophet의 모형은 트렌드(growth), 계절성(seasonality), 휴일(holidays) 3가지의 main components로 이루어집니다.

$y(t) = g(t) + s(t) + h(t) + \epsilon_{t}$

$g(t)$ 는 비주기적 변화를 반영하는 추세 함수, $s(t)$ 는 주기적인 변화(ex, 주간/연간)를, $h(t)$ 는 휴일(불규칙 이벤트)의 영향력을 나타냅니다. 오차항 $\epsilon_{t}$ 는 모형이 설명하지 못하는 나머지 부분이 됩니다. ($\epsilon_{t}$ 는 정규분포 가정)

이런 형식이 일반화 가법 모형(GAM, generalized addtive modle)과 비슷해서 새롭게 분해하고 새로운 요소를 추가하기 쉽다고 합니다.

prophet은 다른 시계열 모형과 달리 시간에 종속적인 구조를 가지지 않고 curve-fitting으로 예측 문제를 해결한다고 합니다. 그로 인해 아래와 같은 이점을 얻을 수 있다고 합니다.

  • 유연성 : 계절적 요소와 트렌드에 대한 가정을 쉽게 반영할 수 있다.
  • ARIMA 모델과 달리 모델의 측정 간격을 regularly spaced 할 필요가 없고, 결측이 있어도 상관없다.
  • 빠른 fitting 속도로 여러 가지를 시도해볼 수 있다.
  • 직관적인 파라미터 조정을 통한 모델 확장이 쉽다.


3.1. $g(t)$, Growth

논문에서는 트렌드를 반영하기 위한 growth model로 두 가지를 소개합니다.

첫 번째는 상한, 하한과 같은 한계점이 존재하는 경우(saturating growth model),
두 번째는 없는 경우를 위한 모델로 각각 piecewise logistic model, piecewise linear model을 기반으로 합니다.


3.1.1. Nonlinear, Saturating Growth

아래의 그래프처럼 예측하고자 하는 값의 한계가 존재하는 경우 우리는 이를 반영한 모델을 세워야 합니다.


image

이렇게 상한/하한이 있는 growth는 기본적으로 아래와 같은 로지스틱 함수로써 나타내어집니다.

$g(t) = \dfrac{C}{1 + exp(-k(t-m))’}$

여기서 $C$ 는 한계를 나타내는 carrying capacity, $k$는 성장률(growth rate)을 의미합니다. 하지만 위의 식으로는 반영할 수 없는 부분이 두 가지 있다고 합니다.

  • 첫 번째, carrying capacity가 상수가 아닌 경우
    • 페이스북 가입자 수를 예측한다고 할 때, 우리의 상한은 인터넷에 연결이 가능한 인구의 수이지만,
    • 인터넷 연결이 가능한 인구는 시간이 지남에 따라 증가하기 때문에 상수로 볼 수 없음
  • 두 번째, 성장률이 상수가 아닌 경우
    • 신제품 출시로 시존의 성장률과 다른 양상을 보일 수 있음

이 두 가지 문제를 해결하기 위해 위의 basic 한 로지스틱 함수에서 $C$를 시간에 따라 변하는 $C(t)$ 함수로 바꾸고, change points 전후로 달라지는 성장률을 대변하기 위해 $k + a(t)^T \delta$ 로 대체한 piecewise logistic growth model을 사용합니다.

$g(t) = \dfrac{C(t)}{1 + exp(-(k+a(t)^T \delta)(t-(m+a(t)^T\gamma)))’}$


3.1.2. Linear Trend with Changepoints


image

앞의 경우와 달리 어떠한 한계가 존재하지 않는 예측 문제에 있어서 piecewise linear 모델은 간결하고 유용합니다.
논문에서 다음과 같이 piecewise하게 일정한 성장률을 가지는 trend model을 정의합니다.

$g(t) = (k + a(t)^T\delta)t + (m + a(t)^T\gamma)$


$s(t) = \displaystyle\sum_{n=1}^{N}\left(a_n cos\left(\dfrac{2\pi nt}{P}\right) + b_n sin\left(\dfrac{2\pi nt}{P}\right)\right)$

여기서 $P$ 는 시계열 모델에서 기대하는 정규 주기를 나타냅니다. ($P=7$ 이면 주간 데이터)

계절성 모델에 적합하기 위해서는 $2N$ 만큼의 parameter, $\beta = [a_1, b_1, \dots, a_N, b_N]^t$를 추정해야 합니다.

$N$이 커질수록 모델은 패턴을 더욱 세세하게 감지하며 주간, 연간 계절성에 대해서 각각 $N=3, N=10$에 성능이 좋았다고 합니다.(함수에서 defualt값으로 사용)


image

3.3. $h(t)$, Holidays and Events

휴일과 이벤트들은 시계열 예측에 큰 영향을 미치지만 주기적 패턴을 따르지 않아 모델링하기가 어렵습니다. 하지만 음력 행사라던지 추수감사절(11월 4번째 목요일)과 같은 비주기적인 휴일들이 시계열에 미치는 영향은 매년 비슷하기 때문에 모델에 반영되어야 합니다.

여기서 이벤트의 효과는 독립이라고 가정하고 이벤트 앞뒤로 window 범위를 지정해 해당 이벤트의 영향력의 범위를 설정할 수 있습니다. (크리스마스이브도 같이 크리스마스효과에 반영하고 싶으면 lower_window를 -1로 설정)

각각의 휴일 $D_i$ 로 두었을 때, 아래와 같은 $h(t)$를 정의합니다.

$Z(t) = [1(t \in D_1), \dots, 1(t \in D_L)]$


$h(t) = Z(t) \kappa$


image

한국의 휴일 또한 Python의 holidays라는 패키지에 이미 정의되어 있습니다.


3.4. Model fitting

아래의 Figure 4와 5는 prophet을 이용해 각각 Figure 3와 동일한 범위를 예측, 전체 데이터로 모든 시간에 대해 예측한 결과입니다.

prophet의 결과를 보니 위의 다른 시계열 방법보다 주 단위, 연단위 주기성을 잘 포착하고 있는 것으로 보입니다.


Figure 4: Prophet forecasts corresponding to those of Fig. 3. As before, forecasts are grouped by day-of-week to visualize weekly seasonality.



Figure 5: Prophet forecast using all available data, including the interpolation of the historical data. Solid lines are in-sample fit, dashed lines are out-of-sample forecast.


이렇게 분해가 가능한 모델의 중요한 이점은 각 구성요소를 확인할 수 있다는 점입니다.

아래처럼 트렌드와 계절성(주 단위, 연단위) component가 어떤 영향을 미치고 있는지 확인할 수 있는 그래프도 확인할 수 있으며, 이것으로 분석가들이 예측뿐만 아니라 예측 문제에 대해 다른 통찰력도 얻을 수 있을 거라고 합니다.



Figure 6: Components of the Prophet forecast in Fig. 5.


paper에는 uncertainty나 Analysi-in-the-Loop, Evaluation에 대해서도 자세히 소개하고 있으니 필요하신 분들은 논문을 참고해주세요.

댓글남기기