FittingJob の仕組みについて説明します。ややこしいですが IHPA の FittingJob リソースのことではなく Python の学習プログラムについての話です。
汎用的に使えるものを意識しているためゴリゴリにチューニングはしていません。
時系列予測には Prophet を使用しています。時系列予測ではそのデータの傾向・周期性・イベントといった情報から予測を行います。そのためモデルには様々なパラメータを設定できますが、今回は汎用的に動作するモデルを作ろうとしているためイベントなどのパラメータは設定しません (できません)。Prophet 自体デフォルト値で上手く動くことが多いのでだいたいデフォルト値です。
Prophet は独自のモデルを使用しており、トレンド・周期性・イベントといった複数の要素をそれぞれ関数化して組み合わせることで予測しています。
意識しているパラメータは seasonality_mode
, growth
, interval_width
の 3 つです。それぞれ下記のような意味を持っています。
Parameter | Description | Value |
---|---|---|
seasonality_mode |
周期性の傾向 (additive or multiplicative) | multiplicative |
growth |
トレンドの傾向 (linear or logistic) | linear |
interval_width |
予測のズレの範囲 | 0.8 |
seasonality_mode
は additive と multiplicative から選びます。additive はデータが上昇・下降傾向になっていたとしても 1 周期内のブレが常に同じようになるものを指します。一方で multiplicative ではそのブレの幅が大きくなります。ここ ある図が直感的でわかりやすいです。Web のトラフィックというのは人のライフサイクルに依るため、将来的に成長したとしても各時間帯の人口割合が異なるためピーク帯はトラフィックが増えますが、そうでない時間帯は依然としてトラフィック量は (多少増えるとはいえ) 少ないままだと考えられます。そのため multiplicative とするのが妥当な気がしています。
growth
に関しては取得するデータ量も 2 週間と短い範囲なので linear で問題ないと考えています。
interval_width
は予測値の Upper/Lower の範囲を決めるものです。0.8 にしておくと下 10%ile、上 90%ile の 80% の領域がその範囲になります。このサンプルはパラメータの uncertainty_samples
の回数分予測を行ったときのものになり、デフォルトでは 1000 回です。Upper/Lower の範囲は Estimator のメトリクス調整で使用されるもので今のところは 0.8 くらいで広すぎず狭すぎずで問題ないと思われます。これはいずれパラメータ化する予定です。
変化点検知には特異スペクトル解析法を使用しています。変化点というのは異常検知の一種であり、点ではなく線でそのデータの異常度を判別します。これを使用してデータのどの範囲を学習データに使用するか決めることができます。例えばシステムの構成を変えた・サーバーのプログラムを差し替えた、などで大きくメトリクスの傾向が変わった際に、古い傾向のデータを捨てることによって予測の精度を上げることができます。
SST はモデルのようなものを作らずに時系列解析を行うため学習データを考える必要がありません。この変化点検知は下記のような流れで行われます。
- 変化度を計測したい時間
t
を決める t
からスライドウィンドウサイズw
分のサブ時系列を得るt
から 1 つずつずらしながら似たようなサブ時系列をn
個得て行列を構成する- これを履歴行列と呼ぶ
- 同じように
t
からラグl
分ずらしたt-l
からの行列を得る- これをテスト行列と呼ぶ
- 厳密にはサブ時系列の個数を履歴・テストでそれぞれ異なる数にすることができる
- 履歴行列とテスト行列をそれぞれ特異値分解する
- それぞれの左特異ベクトルから特異値上位
m
個の特異ベクトルを選択する- 次元削減
- 厳密には履歴・テストそれぞれいくつの特徴量を選択するか決められる
- 履歴・テストのそれぞれの選ばれた特異ベクトルの行列を U, Q として U^T・Q を求めます
- その行列を特異値分解してその最大特異値がそれぞれの行列の類似度となります
- その時系列ベクトルが関係ない (直行) ならば 0 に近づきます
1-(類似度)
をすることによってその異常度が求まります
手法については k-NN (k=1) による方法も試しましたが、緩やかな傾向変化に対応することができない点や、学習データに変化点が含まれていないことが前提となってしまうので採用しませんでした。
- https://www.r-bloggers.com/is-my-time-series-additive-or-multiplicative/
- 異常検知と変化検知 (機械学習プロフェッショナルシリーズ) - 井手剛、杉山将