본문 바로가기

빅데이터 분석

Facebook Prophet 모델 - 초보자를 위한 이론부터 코드까지 한 번에

반응형

Prophet이란 Facebook(Meta)에서 시계열 예측을 위해서 개발한 Machine Learning 모델을 의미한다. 이번 포스팅에서는 Prophet모델의 통계적인 기초, 원리 그리고 구현 코드에 대해서 이해하기 쉽게 설명해보고자 한다. 

 

목차

1. Facebook Prophet에 대한 기본 개념 잡기

2. Prophet 모델의 구성 요소

3. Prophet Python 코드로 구현하기

4. Prophet 학습 결과 시각화 진행하기

5. Prophet 모델의 장단점 및 추가 학습 범위

 

 

     

    1. Facebook Prophet에 대한 기본 개념 잡기

     

    프로핏은 다양한 시계열 예측 모형 중에서 비교적 최근에 나온 모델이다. 조금 더 정확하게 말해서 Prophet은 시계열 데이터 예측을 위해서 Meta, 과거에는 Facebook에서 개발한 Machine Learning 모델이다. 이 모델의 특징은 다른 시계열 예측 모델과 다르게 비교적 단순하면서도 직관적인 방법으로 시계열 예측을 진행한다. 이러한 점 때문에 다양한 비즈니스 환경에서 쓰일 수 있고, 실제로 많은 IT 회사들에서 이 모델을 활용하는 것으로 알고 있다. 

     

    오늘은 Facebook Prophet 모델이 무엇인지, 어떻게 시계열 데이터를 다루는지, 어떻게 코드로 구현할 수 있는지 그리고 결과를 어떻게 해석해야 하는지에 대해서 초보자에게 설명한다는 관점에서 포스팅을 이어나가고자 한다. 

     

    Prophet 모델 논문 원본
    Prophet 모델 논문 원본

     

     

     

     

    2. Prophet 모델의 구성 요소

     

    Prophet 모델은 크게 4가지 변수를 기반으로 미래를 예측하게 된다. 첫 번째는 장기적인 Trend를 고려하게 된다. 쉽게 말해서 큰 틀에서 어떻게 변화하는지를 1번 변수로 고려하게 된다. 두 번째 변수는 계절성(Seasonality)이다. 간단히 설명하면 지난주 추석 명절에 주문이 오르거나 고객이 올랐다면, 그것을 고려하여 이번 추석 명절에도 크게 증가한다고 보는 것이다. 세 번째는 휴일이고, 이는 명확하게 나라마다 갖고 있는 휴일을 고려하는 것이다. 네 번째는 자연적인 오차이다. 지금부터는 이 변수들에 대해서 조금 더 상세하게 살펴보고자 한다

     

    Prophet 모델의 구성요소
    Prophet 모델의 구성요소

     

     

    ✅ Prophet Model에서 정의하는 Trend

     

    Prophet Trend의 Parameters
    Prophet Trend의 Parameters

     

    이 변수에서는 두 가지 옵션을 선택할 수 있다. 하나는 Linear Regression이고 다른 하나는 Logistic Regression이다. Linear은 흔히 알고 있는 선형회귀분석 모형이다. (선형 회귀 분석에 대한 것은 여기 포스팅을 참고) 선형회귀분석의 특징이자 한계점은 다양한 시계열 변수에 대응하기에는 다소 한계가 있다. 물론 파라미터를 어느 정도 튜닝은 가능하지만, SVM과 같이 예측선을 다각도로 변환하는 것은 힘들다는 단점이 있다. 따라서 Linear을 선택한 경우 장기적인 증감 정도로 모델이 학습을 하게 된다. 

     

    Logistic Regression은 Linear Regression의 한계점을 어느 정도 보완해 줄 수 있는 장점이 있다. 예를 들어, 코로나 19 같은 경우 환자의 증감폭을 선형회귀분석으로 예측이 거의 불가능한 Trend를 보여주고 있다. 이전과는 다르게 크게 증가 혹은 감소하는 시계열 데이터의 경우 Logistic Regression 옵션을 선택하는 것을 권장한다. 왜냐하면 Logistic의 특징상 증감의 가능성을 시그모이드 함수에 기반하여 예측하기 때문이다. 

     

     

     

    ✅ Prophet Model에서 정의하는 Seasonality

    Prophet의 푸리에급수
    Prophet의 푸리에급수

     

    Prophet의 Seasonality는 정확히 말해서 푸리에 급수(Fourier Series)로 정의하고 있다. 푸리에 급수는 sin함수와 cos함수의 합으로 표현하여, 주기함수의 구조를 갖게 된다. 이러한 특징 때문에 매년, 매월, 매주마다 오는 급락을 반영하는 함수로 표현할 수 있는 것이다. 사실 이 부분이 아직 이해가 되지 않는다면 크게 스트레스받지 않고 넘어가도 된다. 하지만 언제나 수학적 이해도가 높으면 모델링의 실력을 높일 수 있으니 여유가 되면 스터디를 해보길 바란다. 

     

     

     

    ✅ Prophet Model에서 정의하는 Holiday

    Prophet 모델의 휴일
    Prophet 모델의 휴일

     

    Prophet에서는 아주 큰 장점 중에 하나가 휴일을 0과 1로 표현하는 변수로 받을 수 있다는 것이고, 이 휴일 옵션을 국가마다 다르게 선택할 수 있다는 점이다. 이렇게 Text 변수를 0과 1로 변환해 주는 기법을 one-hot encoding이라고 부른다. 

     

     

     

    • Prophet 모델의 변수 특징 정리
      • Trend는 주어진 데이터의 장기적인 경향을 반영하는 변수이고, Linear Regression 또는 Logistic Regression을 기반으로 학습이 가능함
      • Seasonality는 푸리에 급수(Fourier Series)를 기반으로 학습이 진행된다.
      • Holiday는 One-hot Encoding을 통해 변수가 반영이 된다. 

     

    ✅ Prophet Model의 핵심적인 장점

    여기까지 보면 이 모델은 주어진 파라미터를 기반으로 학습했을 때, 설정하는 조건이 굉장히 단조로운 것처럼 보인다. 하지만 Prophet의 핵심적인 장점은 이 3가지 파라미터를 상세하게 튜닝할 수 있다는 점이다. 조금 더 자세히 설명하면, 각 변수별로 기반이 되는 상태는 베이지안 Model로 사전 정의를 할 수 있고, 이 베이지안 확률값에 따라 학습의 방향성을 조정하는 기능이 있다. 이 부분은 코드를 설명할 때 조금 더 자세히 설명하도록 하겠다. 

     

     

     

    3. Prophet Python 코드로 구현하기

     

    만약 개념을 이해했다면, 코드를 구현하는 것은 굉장히 단순한 편이다. 따라서 자신이 위에서 설명한 개념들에 대해서 이해하는데 어려움을 겪었다면 아직 Python Code로 넘어가기보다는 각각의 개념들에 대해서 스터디하는 것을 권장한다. 

     

    • Prophet Model의 코드 계획
      • Step1. 시계열 데이터 Cleansing 하기
      • Step2. Prophet 모델 학습하기
      • Step3. Prophet모델의 시계열 예측 진행하기
      • Step4. 시각화 및 구성 요소 파악해 보기

     

    Step1. 시계열 데이터 Cleasning 하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ## Prophet에 필요한 패키지 모음
    from prophet import Prophet
    from prophet.plot import add_changepoints_to_plot
    from prophet.diagnostics import cross_validation
    from prophet.diagnostics import performance_metrics
    from prophet.plot import plot_cross_validation_metric
     
    from sklearn.model_selection import ParameterGrid
     
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
     
    ## Facebook에서 제공하는 기본적인 
    df = pd.read_csv('https://raw.githubusercontent.com/facebook/prophet/main/examples/example_wp_log_peyton_manning.csv')
    df.head()
    cs

     

     

    기본적인 패키지는 있는 그대로 가져다 쓰는 것을 권장한다. 그리고 데이터셋은 메타 측에서 제공하고 있기 때문에 이것도 가볍게 살펴보면 좋을 것으로 보인다. 

     

    가장 중요한 것은 Prophet모델 학습을 진행시키기 위해서는 2가지 Column이 필수적으로 들어가 있어야 한다. 하나는 'ds'라는 column으로 시간에 해당하고, 다른 하나는 'y'라는 값으로 자기가 예측하고자 하는 값에 해당한다. 만약 이 Column들이 없거나 이름이 틀리게 되면 Error를 반환하게 되니 이 점은 반드시 챙겨주도록 하자. 

    Prophet Model의 기본적인 데이터셋
    Prophet Model의 기본적인 데이터셋

     

     

     

    Step2. Prophet 모델 학습하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ## 모델 선언하기
     
    = Prophet()
    m.fit(df_p)
     
     
    ## 예측값을 받을 수 있는 Dataframe 만들어주기
    future = m.make_future_dataframe(periods = 153, freq= 'D')
     
    future.head()
     
    ## 예측을 진행하기 
    forecast = m.predict(future)
     
    forecast.head()
     
    cs

     

    ✅ 모델 선언 부분

    모델을 선언하는 부분은 사실 굉장히 쉬운 편이다. 여기에서는 자신이 학습하고자 하는 파라미터를 학습을 진행할 수 있는데, 이번 포스팅의 목적은 모델을 적용하는 것에 있기 때문에 심화 학습은 차후에 진행하도록 한다. 

     

    ✅ Make Future Dataframe 설명

    다음 단계로 해야 할 것은 현재값과 예측값을 받아줄 수 있는 make_future_dataframe 함수이다. 아래의 표에 있는 사진을 보면 알겠지만, 정말 시간 말고는 들어있는 것이 아직 없는 아주 가벼운 표이다. make_future_dataframe의 함수는 아래의 값을 받을 수 있으니 참고하길 바란다. 

    • make_future_dataframe의 함수
      • periods = 예측할 기간을 입력하는 파라미터
      • freq = 시간의 단위를 입력. D는 Daily, W는 Weekly, 그리고 M은 Monthly를 의미

     

    ✅ 예측 진행 부분

     

    예측을 진행할 때는 predict 메서드를 쓰면 자연스럽게 값이 채워진다. 아래의 사진을 보면 future의 dataframe과 forecast의 dataframe의 차이를 확연히 알 수 있을 것이다. 

    m.make_future_dataframe
     
     
    Prophet forecast

     

    여기서 핵심적인 부분은 forecast로 반환되는 column들 중 중요한 Column들을 취사선택해서 쓸 줄 알아야 한다는 것이다. 대표적으로 알아할 것은 ds, yhat, yhat_lower, yhat_upper, 그리고 cutoff column을 이해해야 한다. 왜냐하면 이 값들을 기준으로 핵심적인 시각화가 이루어지기 때문이다. 참고로 각각의 column값들에 대한 심화학습 포스팅에서 다룰 예정이다. 

     

    • Prophet 모델 예측값에서 반드시 이해해야 할 Column들
      • ds: 예측된 시간값
      • yhat: 모델에서 예측하는 대푯값
      • yhat_lower: 모델에서 예측한 하한값
      • yhat_upper: 모델에서 예측한 상한 값
      • cutoff: 예측이 이루어진 기반 날자

     

     

     

     

    4. Prophet 학습 결과 시각화 진행하기

     

    Facebook Prophet 모델결과 시각화
    Facebook Prophet 모델결과 시각화

     

    1
    2
    3
    4
    5
    ## 핵심적인 시각화
    fig = m.plot(forecast)
     
    ## Trend Line과 Trend 변화값 표시하기
    = add_changepoints_to_plot(fig.gca(), m, forecast)
    cs

     

     

    ✅ 시각화 코드 설명 1

    핵심적인 시각화를 구현하는 코드도 사실 너무나도 쉽기 때문에 설명할 부분이 거의 없다. 오히려 시각화를 기반으로 해석하는 것이 훨씬 중요한 부분이다. 시각화는 m.plot(예측값)만 넣어주면 forecast에 담겨있는 변수들을 기준으로 알아서 시각화를 해준다. 또한 add_changepoints_to_plot을 넣어주면, trend부분과 trend가 변화하는 지점들을 표시해 주는 장점도 있으니 활용해 보는 것을 추천한다. 

     

    • Prophet 시각화 결과 해석 안내
      • 검은색 점: 실제 데이터 Point(y)에 해당한다. 
      • 빨간색 실선: 학습 모델 중 g(t), Trend에 해당하는 부분을 나타낸다. 모델이 Linear regression으로 진행됐다는 점을 참고하면 왜 저런 시각화가 나왔는지 쉽게 이해할 수 있을 것이다. 
      • 빨간색 점선: Trend가 바뀐 시점을 나타내준다. 
      • 하늘색 영역: yhat_lower ~ yhat_upper 값을 나타내며, 예측의 최소 최대 범위라고 이해하면 된다. 
      • 파란색 영역: 하늘색은 하나의 실선으로 대표예측값, yhat을 의미한다. 

     

     

     

    Prophet 모델의 변수 영향력
    Prophet 모델의 변수 영향력

     

    1
    2
    3
    ## 변수들의 영향력을 시각화하기
     
    m.plot_components(forecast);
    cs

     

    ✅ 시각화 코드 설명 2

    이번에도 코드 자체는 너무나도 쉽다. m.plot_components만 입력하면 모델의 핵심적인 변수에 해당하는 trend, seasonality, 그리고 holiday에 대해서 영향력을 설명하는 시각화가 나온다. 이번 모델에서는 holiday를 지정하지 않았기 때문에 표에서 생략되었다는 점은 참고하길 바란다. 

     

    특히 Seasonality를 설명할 때 연간 Trend와 주간 Trend의 영향력을 모두 보여줌으로써 Business 환경에 있는 사람들에게 설득하기가 굉장히 용이하다는 장점이 있다. 

     

     

    여기까지 따라왔다면, 아주 단순하게 Prophet을 활용할 수 있는 방법은 다 알아본 것이다. 여기서부터 모델링하는 사람의 역량에 따라 다양한 변수를 추가하고 다양하게 학습할 수 있다. 따라서 앞으로 우리가 더 배워나가야 할 것들에 대해서 반추해 보면서 포스팅을 마무리하려고 한다. 

     

     

     

    5. Prophet의 추가 학습 범위

     

    여기까지 Prophet모델의 기본적인 지식과 장점들을 살펴보았다. 사실 이 모델은 더 많은 강점이 있는데, 한 번의 포스팅에 담기에는 양이 너무 많아져서 따로 다루려고 한다. 이 ML 모델의 핵심은 자신이 추가하고 싶은 변수를 마음대로 추가할 수 있다는 점이다. 예를 들면, A의 Trend는 경쟁사 B의 영향을 많이 받을 수도 있다. 이러한 점을 모델의 외생변수(Exogenous Variable)로 학습을 진행시킬 수도 있다. 이뿐만 아니라 자기가 갖고 있는 모델에서도 다양한 파라미터를 학습시켜서 비교 분석해 보는 것이 사실 Machine Learning의 꽃이라고 할 수도 있다. 따라서 다음 포스팅에서는 다음과 같은 주제를 다룰 테니 참고해 보면 좋을 것 같다. 

     

    • Prophet Model의 추가 스터디 목록
      • 1. 최적의 모델을 찾기 위한 Hyper Parameter Tuning 과정
      • 2. 외부 변수를 추가한 Prophet 모델의 학습
      • 3. Model Parameter에 대한 심화 학습
      • 4. Bayesian 관점에서 바라본 Prophet 모델

     

     

    반응형