Python3でのProphetによる時系列予測のガイド
序章
以前のチュートリアルでは、時系列データを視覚化および操作する方法、およびARIMAメソッドを活用して時系列データから予測を生成する方法を示しました。 ARIMAモデルの正しいパラメーター化が、一定の時間を必要とする複雑な手動プロセスである可能性があることに注目しました。
このような他の統計プログラミング言語 R
この問題を解決するために自動化された方法を提供しますが、それらはまだ正式にPythonに移植されていません。 幸い、Facebookのコアデータサイエンスチームは最近、 Prophet と呼ばれる新しいメソッドを公開しました。これにより、データアナリストと開発者は、Python3で大規模な予測を実行できます。
前提条件
このガイドでは、ローカルデスクトップまたはリモートサーバーのいずれかで時系列分析を行う方法について説明します。 大規模なデータセットの操作はメモリを大量に消費する可能性があるため、いずれの場合も、このガイドの計算の一部を実行するには、コンピュータに少なくとも2GBのメモリが必要です。
このチュートリアルでは、 JupyterNotebookを使用してデータを操作します。 まだお持ちでない場合は、チュートリアルに従って、Python3用のJupyterNotebookをインストールおよびセットアップする必要があります。
ステップ1—データセットをプルしてパッケージをインストールする
Prophetを使用して時系列予測を行うための環境を設定するには、まずローカルプログラミング環境またはサーバーベースのプログラミング環境に移動します。
- cd environments
- . my_env/bin/activate
ここから、プロジェクトの新しいディレクトリを作成しましょう。 それを呼びます timeseries
次に、ディレクトリに移動します。 プロジェクトを別の名前で呼ぶ場合は、必ず自分の名前を代わりに使用してください timeseries
ガイド全体:
- mkdir timeseries
- cd timeseries
Box and Jenkins(1976) Airline Passengersデータセットを使用します。このデータセットには、1949年から1960年までの月間航空旅客数の時系列データが含まれています。 を使用してデータを保存できます curl
とのコマンド -O
出力をファイルに書き込み、CSVをダウンロードするためのフラグ:
curl -O https://assets.digitalocean.com/articles/eng_python/prophet/AirPassengers.csv
このチュートリアルでは、 pandas
, matplotlib
, numpy
, cython
と fbprophet
ライブラリ。 他のほとんどのPythonパッケージと同様に、 pandas
, numpy
, cython
と matplotlib
pipを使用したライブラリ:
pip install pandas matplotlib numpy cython
その予測を計算するために、 fbprophet
ライブラリはに依存しています STAN
数学者スタニスワフウラムにちなんで名付けられたプログラミング言語。 インストールする前に fbprophet
、したがって、次のことを確認する必要があります pystan
Pythonラッパーから STAN
インストールされています:
pip install pystan
これが完了したら、pipを使用してProphetをインストールできます。
pip install fbprophet
これですべてのセットアップが完了したので、インストールされたパッケージの操作を開始できます。
ステップ2—パッケージをインポートしてデータをロードする
データの操作を開始するには、JupyterNotebookを起動します。
- jupyter notebook
新しいノートブックファイルを作成するには、右上のプルダウンメニューから New > Python3を選択します。
これにより、必要なライブラリをロードできるノートブックが開きます。
ベストプラクティスとして、ノートブックの上部に必要なライブラリをインポートすることから始めます(参照に使用される標準の省略形に注意してください) pandas
, matplotlib
と statsmodels
):
%matplotlib inline
import pandas as pd
from fbprophet import Prophet
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
プロットにファイブサーティエイトmatplotlibスタイルも定義したことに注目してください。
このチュートリアルの各コードブロックの後に、次のように入力する必要があります ALT + ENTER
コードを実行し、ノートブック内の新しいコードブロックに移動します。
時系列データを読み取ることから始めましょう。 次のコマンドを使用して、CSVファイルをロードし、最初の5行を印刷できます。
df = pd.read_csv('AirPassengers.csv')
df.head(5)
DataFrameには明らかに Month
と AirPassengers
桁。 Prophetライブラリは、入力として、時間情報を含む1つの列と、予測するメトリックを含む別の列を持つDataFrameを想定しています。 重要なのは、時間列が datetime
タイプなので、列のタイプを確認しましょう。
df.dtypes
OutputMonth object
AirPassengers int64
dtype: object
なぜなら Month
列はではありません datetime
タイプ、変換する必要があります:
df['Month'] = pd.DatetimeIndex(df['Month'])
df.dtypes
OutputMonth datetime64[ns]
AirPassengers int64
dtype: object
私たちは今、 Month
列は正しいです datetime
タイプ。
預言者はまた、入力列に名前を付けるという厳密な条件を課します ds
(時間列)と y
(メトリック列)では、DataFrameの列の名前を変更しましょう。
df = df.rename(columns={'Month': 'ds',
'AirPassengers': 'y'})
df.head(5)
使用するデータを視覚化することをお勧めします。そのため、時系列をプロットしてみましょう。
ax = df.set_index('ds').plot(figsize=(12, 8))
ax.set_ylabel('Monthly Number of Airline Passengers')
ax.set_xlabel('Date')
plt.show()
データが準備できたので、Prophetライブラリを使用して時系列の予測を作成する準備が整いました。
ステップ3—預言者による時系列予測
このセクションでは、Prophetライブラリを使用して時系列の将来の値を予測する方法について説明します。 Prophetの作成者は、時系列予測に固有の複雑さの多くを抽象化し、アナリストと開発者が時系列データを操作するのをより直感的にしました。
まず、新しいProphetオブジェクトをインスタンス化する必要があります。 預言者は私たちが多くの議論を指定することを可能にします。 たとえば、次のように設定することで、不確実性区間の目的の範囲を指定できます。 interval_width
パラメータ。
# set the uncertainty interval to 95% (the Prophet default is 80%)
my_model = Prophet(interval_width=0.95)
Prophetモデルが初期化されたので、 fit
DataFrameを入力として使用するメソッド。 モデルのフィッティングには数秒以内で完了します。
my_model.fit(df)
次のような出力が表示されます。
Output<fbprophet.forecaster.Prophet at 0x110204080>
時系列の予測を取得するには、Prophetに以下を含む新しいDataFrameを提供する必要があります。 ds
予測が必要な日付を保持する列。 便利なことに、Prophetが提供するように、このDataFrameを手動で作成することを気にする必要はありません。 make_future_dataframe
ヘルパー関数:
future_dates = my_model.make_future_dataframe(periods=36, freq='MS')
future_dates.tail()
上記のコードチャンクでは、将来36個の日付スタンプを生成するようにProphetに指示しました。
Prophetを使用するときは、時系列の頻度を考慮することが重要です。 月次データを使用しているため、タイムスタンプの目的の頻度を明確に指定しました(この場合、 MS
月の始まりです)。 したがって、 make_future_dataframe
私たちのために36の月間タイムスタンプを生成しました。 つまり、3年後の時系列の将来価値を予測することを目指しています。
次に、将来の日付のDataFrameが入力として使用されます。 predict
フィットモデルの方法。
forecast = my_model.predict(future_dates)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
Prophetは、多くの興味深い列を持つ大きなDataFrameを返しますが、出力を予測に最も関連する列にサブセット化します。
ds
:予測値の日付スタンプyhat
:メトリックの予測値(統計では、 yhat は、値の予測値を表すために従来から使用されている表記法です。y
)yhat_lower
:予測の下限yhat_upper
:予測の上限
預言者は予測を生成するためにマルコフ連鎖モンテカルロ(MCMC)法に依存しているため、上記の出力からの値の変動が予想されます。 MCMCは確率過程であるため、値は毎回わずかに異なります。
Prophetは、予測の結果をすばやくプロットするための便利な機能も提供します。
my_model.plot(forecast,
uncertainty=True)
預言者は、時系列の観測値(黒い点)、予測値(青い線)、および予測の不確実性間隔(青い影付きの領域)をプロットします。
Prophetのもう1つの特に強力な機能は、予測の構成要素を返す機能です。 これは、時系列の日次、週次、および年次のパターンが全体的な予測値にどのように寄与するかを明らかにするのに役立ちます。
my_model.plot_components(forecast)
上記のプロットは興味深い洞察を提供します。 最初のプロットは、航空会社の乗客の月間ボリュームが時間の経過とともに直線的に増加していることを示しています。 2番目のプロットは、週の乗客数が週末と土曜日にピークに達するという事実を強調しています。3番目のプロットは、7月と8月の休日に最も多くのトラフィックが発生することを示しています。
結論
このチュートリアルでは、Prophetライブラリを使用してPythonで時系列予測を実行する方法について説明しました。 すぐに使用できるパラメーターを使用してきましたが、Prophetを使用するとさらに多くの引数を指定できます。 特に、Prophetは、時系列に関する独自の知識をテーブルにもたらす機能を提供します。
ここにあなたが試すことができるいくつかの追加の事柄があります:
- 休日の月に関する事前知識を含めることにより、休日の影響を評価します(たとえば、12月が休日の月であることがわかっています)。 休日のモデリングに関する公式ドキュメントが役立ちます。
- 不確実性の間隔の範囲を変更するか、将来をさらに予測します。
さらに練習するために、別の時系列データセットをロードして、独自の予測を作成することもできます。 全体として、Prophetは、ユーザーの要件に合わせて予測モデルを調整する機会など、多くの魅力的な機能を提供します。