티스토리 뷰

1. 매우 간단한 방법은 Anaconda 에서 conda install 을 통해 설치하는 것이다.

fbprophet 은 conda-forge 채널에 있으므로, 해당 채널을 인스톨명령에서 지정하여 설치한다.

conda install -c conda-forge fbprophet

2. Anaconda 가 아닌

바닐라 파이썬

에 pip 명령으로 설치하고자 할 때는,

종속된 pystan 패키지 설치 때문에 매우 고달프다.

 

 

어쨌든 가장 간단해 보이는 방법을 소개한다.

성공한 파이썬의 버전은 3.6 64비트

이고, 3.7 에서는 아래 소개하는 방법으로는 안된다.

 
pip install fbprophet
을 실행하면, 종속된 pystan 을 설치하려 하는데, pystan 설치가 진행되기 위해서는 우선 cython 이 설치되어 있어야 설치진행을 시작한다. 그래서 우선 cython 을 설치한다.
pip install cython
설치가 잘 될 것이고, pystan 만 설치를 해 본다.
pip install pystan
2019년 4월 8일 현재, 이렇게 진행하면, 최신버전인 2.18.1 이 아직 윈도우용 바이너리가 없어서, 소스 ( tar.gz ) 가 내려받아지고, 이 소스로부터 컴파일을 시도하게 된다. 그런데, pystan 빌드에는 visual cpp 빌드환경이 아닌, gcc 기반 빌드환경이 필요하고, 빌드환경을 ( mingw 등을 깔아서) 설정한다고 해도, 컴파일 에러가 발생했다. 그래서 소스로부터의 설치는 포기. (어찌어찌 할 수도 있겠지만.)
어차피 pystan 은 종속 패키지 이므로, 버전을 낮추면 빌드하지 않고 깔리는 윈도우용 바이너리가 존재할 수도 있다. 그래서 2.18.0 설치를 시도한다.
pip install "pystan<2.18.1"
이렇게 하면, pystan 의 설치는 성공한다.
 
설치과정을 잘 보면, pystan 2.18.0 은 파이썬 3.6 64비트버전을 위한 미리빌드된 패키지가 내려받아져서 설치가 되기 때문이다. 그런데, 이렇게 잘 설치하고, pip install fbprophet 을 시도하면, 에러메시지가 발생한다. 설치과정 스크립트에서 import pystan 하여서, pystan 을 사용하려고 하는 곳에서 dll load failed 에러가 발생하는 것이다.
직접 python 프롬프트에 들어가서, import pystan 을 실행하면 동일하게 dll load failed 가 발생하는 것을 확인할 수 있다. 좀 살펴보았는데, libgcc_s_seh-1.dll, libstdc++-6.dll 등의 라이브러리 dll 을 LoadLibrary 하려다가 에러가 발생하는 것 같았다. 그래서, 무식하게 이런 dll을 근처에서 찾아서 집어넣어서 테스트도 해 보았지만, 에러가 동일하게 발생하였다. 그럼 어떻게 할까? 버전 하나 더 내려보자.
pip install "pystan<2.18"
2.18 이전 버전은 2.17.1 이고, 이것 또한 윈도우 파이썬3.6 64비트용 바이너리가 존재한다. (애석하게도 파이썬 3.7 용은 바이너리가 없다. 소스받아서 설치하려고 한다. ) 설치가 된 이후 python 프롬프트에 들어가서 import pystan 을 시도해 보면, Voila! 에러가 발생하지 않는다.
마지막으로 fbprphet 설치를 진행해 보자.
pip install fbprophet
을 실행하면, 이제 설치가 아무런 에러없이 진행되며, 설치가 완료되었다.
 
 
////////////////////
 
 

시계열 예측을 위한 Facebook Prophet 사용하기

 
  • 페이스북이 만든 시계열 예측 라이브러리 Prophet 사용법에 대해 작성한 글입니다

Prophet

  • 페이스북이 만든 시계열 예측 라이브러리
  • 관련 자료

설치

pip3 install fbprophet
 
 

Prophet 구성 요소

  • Growth, Seasonality, Holidays
  • y(t)=g(t)+s(t)+h(t)+errory(t)=g(t)+s(t)+h(t)+error
  • ARIMA 같은 시계열 모델은 시간에 종속적인 구조를 가지는 반면 Prophet은 종속적이지 않고 Curve Fitting으로 문제를 해결

Growth

  • Linear Growth(+Change Point)
  • Non-Linear Growth(Logistic Growth)

Seasonality

  • 사용자들의 행동 양식으로 주기적으로 나타나는 패턴
  • 푸리에 급수(Fourier Series)를 이용해 패턴의 근사치를 찾음

Holidays

  • 주기성을 가지진 않지만 전체 추이에 큰 영향을 주는 이벤트가 존재
  • 이벤트의 효과는 독립적이라 가정
  • 이벤트 앞뒤로 window 범위를 지정해 해당 이벤트가 미치는 영향의 범위를 설정할 수 있음

Model Fitting

  • Stan을 통해 모델을 학습
  • 2가지 방식
  • Analyst in the loop Modeling
 
///////////////////
 
 
# 1 Let’s start by importing the Python packages that we need.
import pandas as pd
from fbprophet import Prophet
from matplotlib import pyplot as plt
# 2
"""
Then, we load the train data using Pandas.
You may need to change the path to where
you put the train.csv file.
"""
train = pd.read_csv('../input/train.csv')
train['date'] = pd.to_datetime(train['date'])
# 3
"""
As there are many items and stores,
I will restrict the analysis to item 1 and store 1.
"""
df = train[(train['item'] == 1) & (train['store'] == 1)][['date', 'sales']]
df.rename(columns={'date': 'ds', 'sales': 'y'}, inplace=True)
df.describe()
# 4 Ok, we have the data now. Let’s plot them.
fig, ax = plt.subplots(figsize=(15, 5))
ax.plot(df['ds'], df['y'], linestyle='None', marker='o')
ax.set_xlabel('Date')
ax.set_ylabel('Sales');
# 5
"""
As you can see,
the dataset contains five years (2013-2018).
We will use the last 180 days for testing and the rest for training.
Then, we will plot them to double-check.
"""
n_tests = 180
df_train = df[:-n_tests]
df_test = df[-n_tests:]
fig, ax = plt.subplots(figsize=(15, 5))
ax.plot(df_train['ds'], df_train['y'], linestyle='None', marker='o', color='black', label='Train')
ax.plot(df_test['ds'], df_test['y'], linestyle='None', marker='o', color='red', label='Test')
ax.legend()
ax.set_xlabel('Date')
ax.set_ylabel('Sales');
# 6
"""
Forecasting with FBProphet
Let’s create a Prophet model,
add the weekly, yearly components and then
fit it with the train dataset.
"""
model = Prophet(
    daily_seasonality=False,
    weekly_seasonality=False,
    yearly_seasonality=False,
    changepoint_prior_scale=0.05,
)
model.add_seasonality(
    name='weekly',
    period=7,
    fourier_order=4,
)
model.add_seasonality(
    name='yearly',
    period=365.25,
    fourier_order=2,
)
model.fit(df_train);
# 7
"""
Now, I can ask the model to predict the future on the testing dataset.
I will ask it to estimate also the training points,
so the model will predict for the whole dataset as follows.
"""
forecast = model.predict(df)
forecast[['ds', 'yhat']].head()
# 8
"""
FBProphet comes with a handy plot function
allowing us to plot the three fitted components.
Let’s plot them.
"""
model.plot_components(forecast);
# 9
"""
It can be seen from the trend component that
the sales always increase from 2013 to 2018.
Meanwhile, the yearly component shows that
the sales peak is around June.
Finally, the sales rise gradually from Monday to Sunday.
Let’s plot the forecast, train, and test datasets to validate this.
"""
fig, ax = plt.subplots(figsize=(15, 5))
ax.plot(df_train['ds'], df_train['y'], c='black', marker='o', ms=3, linestyle='None', label='Train')
ax.plot(df_test['ds'], df_test['y'], c='r', marker='o', ms=3, linestyle='None', label='Test')
ax.plot(forecast['ds'], forecast['yhat'], c='b', marker='o', ms=3, linestyle='None', label='Forecast', alpha=0.5)
ax.legend()
ax.set_xlabel('Date')
ax.set_ylabel('Sales');
# 10
"""
It can be observed from the above plot that
the down trend during the last 6 months is captured correctly and
the forecast values have 7 patterns (or 7 different cosine-like lines).
Those are corresponding to 7 weekdays.
Let’s plot the Monday and Sunday datapoints of the actual
(including train and test) and forecast dataset.
"""
fig, ax = plt.subplots(figsize=(15, 5))
forecast['weekday'] = forecast['ds'].dt.weekday
df['weekday'] = df['ds'].dt.weekday
colors = ['r', 'g', 'yellow', 'pink', 'purple', 'cyan', 'blue']
weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
for wd in [0, 6]:
    fc_wd = forecast[forecast['weekday'] == wd]
    ax.plot(
        fc_wd['ds'], fc_wd['yhat'],
        c=colors[wd], marker='o', ms=5, linestyle='None',
        label=f'Forecast-{weekdays[wd]}')
    df_wd = df[df['weekday'] == wd]
    ax.plot(
        df_wd['ds'], df_wd['y'],
        c=colors[wd], marker='^', ms=5, linestyle='None',
        label=f'Actual-{weekdays[wd]}'
    )
ax.legend()
ax.set_xlabel('Date')
ax.set_ylabel('Sales');
# 11
"""
It can be seen that
the Monday and Sunday datapoints are separated and
FBProphet captures this property correctly.
I can now plot all weekdays to gain some insights.
"""
fig, ax = plt.subplots(figsize=(15, 5))
ax.plot(
    df['ds'], df['y'],
    c='black', marker='o', ms=3, linestyle='None',
    label=f'Actual'
)
forecast['weekday'] = forecast['ds'].dt.weekday
colors = ['r', 'g', 'blue', 'pink', 'purple', 'cyan', 'orange']
weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
for wd in range(7):
    fc_wd = forecast[forecast['weekday'] == wd]
    ax.plot(
        fc_wd['ds'], fc_wd['yhat'],
        c=colors[wd], marker='o', ms=3, linestyle='None',
        label=f'Forecast-{weekdays[wd]}', alpha=0.8)
ax.legend()
ax.set_xlabel('Date')
ax.set_ylabel('Sales');
# 12
"""
Finally, FBProphet SMAPE on
this dataset is 18% and calculated as below.
To improve the precision,
we need to tune FBProphet hyperparameters and
add additional regressors.
"""
y_true = df_test['y']
y_forecast = forecast[-n_tests:]['yhat']
smape = ((y_true - y_forecast).abs() / (y_true.abs() + y_forecast.abs())).mean() * 200
print('The SMAPE error is:', smape)
"""
The SMAPE error is: 18.283400082248754
"""
# Conclusion
"""
FBProphet is very flexible
as it allows you to add multiple seasonal components and
additional regressors.
Its component results are interpretable,
hence users can intuitively tune the parameters
to improve the performance.
In addition, unlike SARIMA models, FBProphet does not require
  regularly spaced data points,
  therefore users do not need to interpolate missing data, e.g.
  when removing outliers.
   Finally, FBProphet uses STAN to fit the model, and
   STAN still has not supported GPU yet,
so FBProphet does not scale up when fed with many data points.
"""

 

 
 
아래 모두 설치한 후 설치해야 됨.
pip install fbprophet
 
 
 
시간이 많이 걸린다.
 
 
 
 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함