Table of Contents

ML

시계열 데이터 예측 - Facebook의 Prophet

꼬꼬마코더 2024. 7. 3. 17:07
728x90

Facebook의 Prophet은 시계열 데이터를 예측하기 위해 개발된 모델로, 특히 계절성을 갖는 데이터에 대한 예측에 강점을 보입니다. Prophet은 비교적 이해하기 쉽고 사용하기 편리하며, 자동화된 추세 및 계절성 구성 요소의 조정을 통해 높은 성능의 예측을 제공합니다. 이 모델은 특히 비선형 추세가 시간에 따라 변하는 시계열 데이터에 적합하도록 설계되었습니다.

Prophet 모델의 주요 구성 요소

  1. 추세(Trend) 모델링:
    • Prophet은 시계열 데이터의 추세를 모델링하기 위해 두 가지 방법을 제공합니다: 비선형 로지스틱 성장 모델과 선형 성장 모델.
    • 사용자는 성장의 한계나 포화 최대점을 설정할 수 있으며, 이는 주로 시장 포화 상태나 상한/하한이 예측되는 경우에 유용합니다.
  2. 계절성(Seasonality) 모델링:
    • Prophet은 연간(annual), 주간(weekly), 일간(daily) 계절성을 포함하여 데이터의 계절적 변동을 자동으로 감지하고 모델링합니다.
    • 이 계절성은 푸리에 급수(Fourier series)를 사용하여 유연하게 모델링되며, 사용자는 계절성 구성 요소의 복잡성을 조정할 수 있는 파라미터를 설정할 수 있습니다.
  3. 휴일 및 이벤트 모델링:
    • Prophet은 특정 날짜에 발생하는 휴일이나 이벤트가 시계열 데이터에 미치는 영향을 모델링할 수 있습니다.
    • 사용자는 특정 날짜를 모델에 입력하여 특별 이벤트의 영향을 추정하도록 할 수 있습니다.
  4. 오차 항(Additive or Multiplicative Errors):
    • 모델은 데이터의 변동성을 설명하기 위해 부가적(additive) 또는 곱적(multiplicative) 오차 항을 사용할 수 있습니다.
    • 일반적으로 변동 폭이 시간에 따라 일정하면 부가적 모델을, 변동 폭이 시간에 따라 증가하거나 감소하는 패턴을 보이면 곱적 모델을 사용합니다.

모델 공식

Prophet의 시계열 예측 모델은 다음과 같이 표현될 수 있습니다:

[ y(t) = g(t) + s(t) + h(t) + \epsilon_t ]

여기서 ( y(t) )는 예측하고자 하는 값, ( g(t) )는 추세 함수, ( s(t) )는 계절성 함수, ( h(t) )는 휴일 및 특별 이벤트 함수, ( \epsilon_t )는 오차 항입니다.

활용 및 구현

  • Prophet은 Python과 R 양쪽에서 사용할 수 있으며, Facebook에서 제공하는 설명서와 커뮤니티를 통해 쉽게 접근하고 활용할 수 있습니다.
  • 간단한 API와 자동화된 내부 처리로 인해 사용자가 복잡한 시계열 모델링 지식이 없어도 효과적으로 활용할 수 있는 것이 큰 장점입니다.

Prophet은 특히 시계열 데이터가 명확한 계절성과 추세를 보이며, 휴일이나 특별 이벤트의 영향을 받는 경우 매우 유용합니다. 사용자 친화적인 특성과 유연성 덕분에 다양한 분야에서 널리 사용되고 있습니다.

예시 코드: Prophet 모델 구현: 부가적(additive) 오차 모델, 곱적(multiplicative) 오차 모델

Prophet 모델에서 오차 항은 데이터의 불규칙성을 처리하는 데 사용됩니다. 오차 항은 기본적으로 모델이 예측하는 값과 실제 관측된 값 사이의 차이를 나타내며, 이는 불가피한 데이터의 노이즈나 미처 모델링되지 않은 정보를 포함할 수 있습니다. Prophet에서는 오차 항을 additive(부가적) 또는 multiplicative(곱적)로 설정할 수 있습니다.

  • 부가적(additive) 오차 모델: 데이터의 변동 폭이 시간에 따라 상대적으로 일정할 때 사용합니다.
  • 곱적(multiplicative) 오차 모델: 데이터의 변동 폭이 시간이나 예측 값의 크기에 따라 증가하거나 감소할 때 사용합니다.

다음은 Python을 사용하여 Prophet 모델을 구성하고, 부가적과 곱적 오차 항을 설정하는 방법을 보여주는 예시 코드입니다.

# 필요한 라이브러리 설치
!pip install pystan==2.19.1.1
!pip install fbprophet

# 라이브러리 불러오기
from fbprophet import Prophet
import pandas as pd
from matplotlib import pyplot as plt

# 데이터 프레임 생성
df = pd.DataFrame({
    'ds': pd.date_range(start='2020-01-01', periods=100),
    'y': (abs(pd.Series(range(100)) * 0.5)) + 10  # 간단한 추세 데이터 생성
})

# Prophet 모델 인스턴스화
model_additive = Prophet(seasonality_mode='additive')  # 부가적 오차 모델
model_multiplicative = Prophet(seasonality_mode='multiplicative')  # 곱적 오차 모델

# 모델 학습
model_additive.fit(df)
model_multiplicative.fit(df)

# 미래 데이터프레임 생성
future = model_additive.make_future_dataframe(periods=30)

# 예측 수행
forecast_additive = model_additive.predict(future)
forecast_multiplicative = model_multiplicative.predict(future)

# 결과 시각화
fig, ax = plt.subplots(2, 1, figsize=(10, 8))
model_additive.plot(forecast_additive, ax=ax[0])
ax[0].set_title('Additive Error Model Forecast')
model_multiplicative.plot(forecast_multiplicative, ax=ax[1])
ax[1].set_title('Multiplicative Error Model Forecast')
plt.tight_layout()
plt.show()

이 코드에서는 다음과 같은 작업을 수행합니다:

  1. 데이터 준비: 시계열 데이터를 만듭니다. 여기서는 단순한 추세를 포함하는 데이터를 생성합니다.
  2. 모델 생성 및 설정: Prophet 인스턴스를 만들 때 seasonality_mode를 지정하여 오차 모델을 선택합니다.
  3. 모델 학습: 데이터를 모델에 적합시킵니다.
  4. 미래 데이터 예측: 미래 데이터에 대한 예측을 수행합니다.
  5. 결과 시각화: 두 모델의 예측 결과를 그래프로 표시합니다.

이 예제를 통해 부가적과 곱적 오차 모델이 시계열 데이터에 어떤 영향을 미치는지 비교해 볼 수 있습니다.