時系列解析ライブラリProphet　公式ドキュメント翻訳5（トレンドの変化点 編）

Facebookが公開している時系列解析用のライブラリProphetの公式ドキュメントを翻訳していきます。

目次
[1.Prophet公式ドキュメント翻訳（概要＆特徴編)](https://qiita.com/japanesebonobo/items/96868e58d4da42d36807)
[2.Prophet公式ドキュメント翻訳（インストール編)](https://qiita.com/japanesebonobo/items/a7309bc07c59c11bee7b)
[3.Prophet公式ドキュメント翻訳（クイックスタート編）](https://qiita.com/japanesebonobo/items/6f3234adb592f73bafbf)
[4.Prophet公式ドキュメント翻訳（飽和状態の予測編）](https://qiita.com/japanesebonobo/items/9a5a5a13440e90f06f30)
**5.Prophet公式ドキュメント翻訳（トレンドの変化点編）**
[6.Prophet公式ドキュメント翻訳（周期性・イベント効果・説明変数の追加編）](https://qiita.com/japanesebonobo/items/e674359618a879a49c05)
[7.Prophet公式ドキュメント翻訳（増加し続ける周期性編）](https://qiita.com/japanesebonobo/items/ed02f49ea66eab432af8)
[8.Prophet公式ドキュメント翻訳（誤差の間隔編）](https://qiita.com/japanesebonobo/items/f1acdd4ec1a1d0948553)
[9.Prophet公式ドキュメント翻訳（外れ値編）](https://qiita.com/japanesebonobo/items/4eb36710c689bca80c71)
[10.Prophet公式ドキュメント翻訳（1日単位ではないデータ編）](https://qiita.com/japanesebonobo/items/7062dd300a14bda4f84b)
[11.Prophet公式ドキュメント翻訳（モデルの診断編）](https://qiita.com/japanesebonobo/items/2266729f849868581011)
[12.Prophet公式ドキュメント翻訳（ヘルプ編）](https://qiita.com/japanesebonobo/items/08f85d74371240568fff)

2018/10/21公開。原文リンクは以下。
・Prophet概要＆特徴：https://facebook.github.io/prophet/
・公式ドキュメント：https://facebook.github.io/prophet/docs/quick_start.html

今回の記事はトレンドの変化点です。
![スクリーンショット (92).png](https://qiita-image-store.s3.amazonaws.com/0/296645/51de12e1-e2f2-c6d6-99e8-dba9d4feb9ff.png)
#トレンドの変化点
以前のドキュメントで挙げたデータにあるように、時系列データは軌道がしばしば急激に変化します。デフォルト設定では、Prophetは自動的にこれらの変化点を検知し、トレンドがデータに対して適切に対応するように調整することができます。ですが、ユーザが希望すればこのプロセスを精密にコントロールすることができます。例えば、Prophetが変化を取り損なっていたり、時系列データに対して過学習してしまっているときに、ユーザは調整が可能です。使用できるいろいろな引数があります。
#Prophetにおける変化点の自動検知について
Prophetはまず、大量の潜在的変化点を可能な範囲で検知します。そして、変化率の大きなものを優先してスパースを置きます(L1正則化と同意です)。このことは、基本的にProphetは変化率を上下させることのできる多くのスペースをもっているということです。ですが、実際にProphetが変化点を反映させることができるのはわずかです。[クイックスタートの章](https://qiita.com/japanesebonobo/items/6f3234adb592f73bafbf)で説明したPeyton Manningの予測の例を使って考えてみましょう。デフォルト設定では、Prophetは25個の潜在的な変化点を検知します。それらの変化点は、時系列データの前から80%の部分に均等な感覚で置かれたものです。下の図の垂直な線は潜在的変化点が置かれた場所を示しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296645/1cf56e45-7a33-1212-f221-c038ebc7d0c3.png)
私たちは変化率を調整できる多くの場所があるにもかかわらず、それらの多くがスパースであるために大半が使われません。このことは、それぞれの変化点における変化率をプロットした以下の図で確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296645/ae0e8c0b-ce2a-1092-0ec3-87f9926b42a4.png)
潜在的変化点の数は`n_changepoints`という引数を使うことで指定できます。ですが、これは正則化によってチューニングしたほうがよいです。重要な変化点の場所のプロットについては、以下で可視化できます。

```R
# R
plot(m, forecast) + add_changepoints_to_plot(m)
```

```py
# Python
from fbprophet.plot import add_changepoints_to_plot
fig = m.plot(forecast)
a = add_changepoints_to_plot(fig.gca(), m, forecast)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296645/88fe509b-56da-da53-088f-13df48613f0f.png)
変化点を推測する際、デフォルト設定では時系列データの前から80%を参照しています。これは時系列データ全体を使うことによって過学習が発生することを防ぐためです。この80%というデフォルトの値は多くのケースでうまくいきますが、すべてのケースには当てはまりません。`changepoint_range`という引数を使うことでこの値を変更することができます。例えば、Pythonでは`m = Prophet(changepoint_range=0.9)`、Rでは`m <- prophet(changepoint.range = 0.9)`というコードで、時系列データの前から90%のデータを用いて、潜在的な変化点を推測することができます。
#トレンドの柔軟性を調整する
トレンドの変化が過学習になっている(トレンドの柔軟性がありすぎる)場合や、学習しきれていない(柔軟性が足りていない)場合は、`changepoint_prior_scale`という引数を使うことで、スパースの優先度の大きさを調整できます。デフォルトでは、このパラメータは0.05に設定されています。この値を増加させると、トレンドはさらに柔軟になります。

```R
# R
m <- prophet(df, changepoint.prior.scale = 0.5)
forecast <- predict(m, future)
plot(m, forecast)
```

```py
# Python
m = Prophet(changepoint_prior_scale=0.5)
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296645/6842dd42-9e8c-f91e-e8df-ac6d2c7926de.png)
この値を減少させると、トレンドは柔軟性を弱めます。

```R
# R
m <- prophet(df, changepoint.prior.scale = 0.001)
forecast <- predict(m, future)
plot(m, forecast)
```

```py
# Python
m = Prophet(changepoint_prior_scale=0.001)
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296645/38653067-cc71-80f9-9a3d-875b6b77b771.png)
#変化点の場所を特定する
ユーザが希望する場合は、変化点を自動検知するのではなく、`changepoints`という引数を用いて変化点の場所を手動で特定することができます。傾斜する変化は自動検知された変化点のみでしかとらえることができず、先ほど述べたスパース正則化がなされます。自動的に変化点のグリッドを作成した後、例えばユーザは変化点になると推測される特定の日を指定したグリッドを引数`changepoints`によって作成することができます。もう一つの例としては、変化点を小さいワンセットの日付に制限することができます。以下に示します。

```R
# R
m <- prophet(df, changepoints = c('2014-01-01'))
forecast <- predict(m, future)
plot(m, forecast)
```

```py
# Python
m = Prophet(changepoints=['2014-01-01'])
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296645/b7592f8f-cf54-cd5b-5ea1-fefc0a0bbfdd.png)