トレンドとは時系列データのベースラインのことであり、それは直線や放物線のような単純なモデルでフォローできないことが多いです。
このためProphetではトレンドの変化点という考え方を採用することによって自由度の高いトレンド線を描くことを前の二つの記事(Prophetトレンド分析(折れ線モデル)とProphetトレンド分析(非線形成長モデル))で確認しました。
データを変数の区間で区切りその区間ごとに回帰を行う、ただしそれぞれの線たちが繋がるように制約を課す、という手法をスプライン(spline)といいます。
スプラインは単純な関数で記述できないような変化をする対象に対して柔軟に対応できるモデルです。
分析者は線のつなぎ目(変化点)を自由に設定することができるため、特殊なイベントたとえば『イチローがメジャーリーグに移籍したタイミング』といった条件を予測モデルに織り込むことが可能です。
このことは分析の際に逆に問題にもなりえます。
変化点はスプラインが自分で学習、予測する対象ではないため、我々は事前にデータについて調査を行い、適切に変化点を見つける必要があるのです。
そしてもちろん変化点をどこにどれだけ置くかはがスプラインの性能に大きく影響を与えます。
Prophetでは変化点を手動で設定することもできますが、なんとも便利なことに自動的に変化点を検出する機能が備わっています。
デフォルト設定ではProphetはまず変化点候補を25個、対象となる期間に等間隔に置きます。
そしてその候補の中からうまく予測できる変化点を検出します。
実際にProphetを活用するときにはまず自動検出機能を使うことになるでしょう。
経験上それなりにうまくいきます。
しかしそれでうまくいかなかった場合には手動で設定するという選択肢を試してみてください。
【変化点の設定】
変化点候補の数
関数prophet
には引数n.changepoints
があり、これが変化点候補の数を制御します。
この引数にはデフォルトで25が入っています。
#R m <- prophet(ichiro, n.changepoints = 30) m["n.changepoints"] #$n.changepoints #[1] 30
変化点候補の直接指定
関数prophet
には引数changepoints
があり直接指定することができます。
changepoints
を指定しなければn.changepoints
で指定された数だけ自動的に変化点候補が設定されます。
#R m["changepoints"] # [1] "2008-05-06" "2008-08-27" "2008-11-28" "2009-02-27" "2009-05-29" "2009-08-28" "2009-12-09" "2010-03-15" "2010-06-16" "2010-09-23" #[11] "2010-12-23" "2011-03-24" "2011-06-22" "2011-09-22" "2011-12-27" "2012-03-27" "2012-06-27" "2012-09-26" "2012-12-26" "2013-03-27" #[21] "2013-06-26" "2013-09-26" "2013-12-26" "2014-03-28" "2014-06-27"
変化点での傾きの変化の大きさ
変化点ではトレンドが変わるのですが、自由自在に変化率が変わるのではなく、変化率の変化(ややこしいなあ)にある程度の制約を持たせています。
変化率の変化\delta_jは事前分布を平均0, 分散2\tau^2のラプラス分布に従うとします。
ですので\tauを変化させると変化率の変化の大きさを制御することができます。
このためprophet
関数にはchangepoint.prior.scale
という引数があります。
デフォルト値は0.05です。
この数値を大きくすると変化は激しく、小さくすると変化は小さくなります。
#R m1 <- prophet(ichiro, changepoint.prior.scale = 0.001) future <- make_future_dataframe(m1, periods = 365) forecast1 <- predict(m1, future) prophet_plot_components(m1, forecast1)

デフォルト設定で行った予測(changepoint.prior.scale=0.05
)と比較して、トレンドがフラットになっていることが分かります。
ピンバック:時系列データの変化点検出 | 粉末@それは風のように (日記)