update.Facebookが公開している時系列解析用のライブラリProphetの公式ドキュメントを翻訳していきます。目次1.Prophet公式ドキュメント翻訳(概要&特徴編)2.Prophet公式ドキュメント翻訳(インストール編)3.Prophet公式ドキュメント翻訳(クイックスタート編)4.Prophet公式ドキュメント翻訳(飽和状態の予測編)5.Prophet公式ドキュメント翻訳(トレンドの変化点編)6.Prophet公式ドキュメント翻訳(周期性・イベント効果・説明変数の追加編)7.Prophet公式ドキュメント翻訳(増加し続ける周期性編)8.Prophet公式ドキュメント翻訳(誤差の間隔編)9.Prophet公式ドキュメント翻訳(外れ値編)10.Prophet公式ドキュメント翻訳(1日単位ではないデータ編)11.Prophet公式ドキュメント翻訳(モデルの診断編)12.Prophet公式ドキュメント翻訳(ヘルプ編)2018/10/24公開。・Prophet概要&特徴:https://facebook.github.io/prophet/・公式ドキュメント:https://facebook.github.io/prophet/docs/quick_start.html今回の記事は周期性・イベント効果・説明変数の追加編です。祭日や特別なイベントをモデリングするあなたのデータにモデル化したい祭日やイベントが繰り返しある場合、それらを格納したデータフレームを作成しなければいけません。そのデータフレームはholidayとdsという2つのカラムをもちます。データフレームの行には、各イベント日の値が入っています。そのイベント日は過去(時系列データの過去の部分)と未来(時系列データの予測によって作成された部分)の両方をデータフレームに入れます。イベント日の効果が未来の時点で繰り返さない場合、Prophetはそのことをモデル化し、予測にそのイベント効果を含めません。lower_windowやupper_windowというカラムを追加して、イベント当日の周辺の日までイベント効果が適応される範囲を延ばすことができます。クリスマスの日に加えてクリスマスイブにもイベント効果を適応させたい場合は、lower_window=-1,upper_window=0とします。サンクスギビングデーの効果をブラックフライデーにも適応させたい場合は、lower_window=0,upper_window=1とします。prior_scaleカラムを追加することで、事前に各イベント日に対して別々に優先度をつけることができます。具体的には、以下のコードを参照してください。Manningのプレーオフへの出場の日を含んだデータフレームを作成しました。superbowls))上のコードでは、プレイオフとスーパーボウルの試合の両方をスーパーボウル期間としてデータフレームに格納しています。これは、プレーオフのイベントの中で、スーパーボウルが最大のイベント効果をもたらすということを意味しています。テーブルが一度作成されれば、holidaysという引数にそのテーブルを渡すことで、イベント効果を含めた予測ができます。Manningのデータでイベント効果を調べます。m.fit(df).predict(future)イベント効果はforecastデータフレームで見ることができます。plotで可視化できます。以下のプロットでは、プレーオフ期間は針のように波形が反応しています。スーパーボウル期間は反応の大きさが特に大きくなっています。'superbowl')のようにスーパーボウルのイベント効果をプロットすることができます。周期性の推定にフーリエ級数を利用する部分的にフーリエ級数を使うことで周期性を推定することができます。このトピックについての詳細はこの論文を参照してください。Wikipediaのこの画像は恣意的な周期性のある波形を、どのように部分的なフーリエ級数に近似するのかを説明しています。フーリエ級数の項数は、周期性が変わるまでの期間の長さを決めるパラメータです。Manningのデータを使って考えていきましょう。年単位の周期性におけるフーリエ級数の項数は10個です。以下のコードで実装できます。plot_yearly(m)デフォルトのパラメータの値は、だいたいの場面で適切な値です。頻繁な変化にたいして周期性をフィッティングさせる必要がある場合、パラメータを増加させることができます。増加させた場合は、一般的に波形は滑らかさを失います。モデルをインスタンス化した際の周期性を作成するプロセスで、フーリエ級数のパラメータは毎回指定することができます。ここではパラメータを20まで増加させます。plot_yearly(m)フーリエ級数のパラメータを増加させることは、より速いサイクルで変化する場面にモデルの周期性を対応させることを可能にします。それは同時に過学習のリスクをはらんでいます。周期性をモデリングする変数2N個に対して、N個のフーリエ級数の項数を指定することをおすすめします。カスタムした周期性を指定するデフォルト設定では、時系列データが2つ以上の周期性を持つ場合、Prophetは週・年単位の周期性をフィッティングします。1時間単位の時系列データなど、単位が1日より短いデータについては、日ごとの周期性をフィットすることもできます。)をフィッティングすることができます。周期性を指定する関数の引数は周期性の単位、周期性をフィッティングする期間、フーリエ級数の項数です。参考までに、デフォルト設定ではProphetはフーリエ級数の項数は3に対し週単位の周期性、項数10に対し年単位の周期性を使用しています。この引数を調整したい場合は、add_seasonalityを用いてください。コードは以下に示しています。Manningのデータをフィッティングします。週単位の周期性を月単位の周期性に変更します。月単位の周期性をプロットします。m.plot_components(forecast)イベント効果や周期性を前もって調整するイベント効果によって過学習が起こっていることに気が付いた場合、holidays_prior_scaleというパラメータを用いて過学習を防ぐように、事前にモデルを調整できます。デフォルト設定ではこのパラメータは10で、これはわずかな正則化を行っています。このパラメータを減少させると、イベント効果を弱めることができます。0.991010イベント効果の強さが先ほどよりも減少しています。スーパーボウルでは顕著です。seasonality_prior_scaleというパラメータはholidays_prior_scaleと似ていて、モデルの周期性をデータにフィットさせる度合いを調整します。イベント日が格納されたデータフレームにprior_scaleカラムを追加することで、個別のイベント日に対して別々に調整することができます。別々の周期性に対して調整を行いたい場合は、add_seasonalityという引数に値を渡してください。週単位の周期性にのみ調整を行いたい場合は、以下のようにします。prior_scale=0.1)説明変数を追加するadd_regressorメソッド(関数)を用いて、線形モデルに新たな説明変数を追加することができます。説明変数の値を格納したカラムは、フィッティングと予測値の生成を行う両方のデータフレームに追加する必要があります。NFLのシーズン中に追加の効果をもたらす説明変数を加えることができます。予測結果については、説明変数の追加による効果をextra_regressorsプロットで見ることができます。m.plot_components(forecast)NFLの日曜日を考慮する説明変数を追加するには、まず過去と未来のNFLの日曜日のリストを作成します。上で述べたイベント効果を追加する方法と同様の方法を使うこともできますが、もっと便利な方法があります。add_regressor関数は説明変数の追加において、さらに便利な関数です。特筆すべきは、追加する説明変数として時系列データを使うことができます。その時系列データは未来の日付が入った状態のデータである必要があります。add_regressor関数には、追加する説明変数の影響の強さを指定できる引数があります。説明変数を標準化するかを指定できる引数もあります。詳細はPythonであればhelp(Prophet.add_regressor)を、Rであれば?add_regressorというコードを入力して、docstringを参照して下さい。注意点として、説明変数の追加はモデルのフィッティングの前に行わなければいけません。追加の説明変数は、先ほど述べたように過去と未来の両方の日付が入ったデータでなければなりません。したがって、nfl_sundayのような、未来の日付があらかじめわかっているようなものか、もしくは別で予測モデルを作成して未来の日付が入ったものである必要があります。説明変数のデータがすべて過去のデータである場合、Prophetはエラーを返します。そこからフィッティングするものが何もないからです。追加の説明変数は線形モデルの1変数として扱われます。したがって説明変数を追加することは、時系列データの周期性を追加する要因になるのか、増加し続ける時系列データを説明する要因になるのかといった、モデルの潜在的な性質を決定づけます。(増加し続ける時系列データに対するモデリングについては次の章で説明します。tomi@japanesebonobo某ポータルサイトを運営する会社に就職予定の大学4年生。専攻はデータサイエンス。フロントエンド開発担当(仮)。いつかフルスタックになりたい。upLoginユーザーは見つかりませんでした。