Skip to content

Latest commit

 

History

History
58 lines (39 loc) · 5.53 KB

fittingjob.md

File metadata and controls

58 lines (39 loc) · 5.53 KB

FittingJob

FittingJob の仕組みについて説明します。ややこしいですが IHPA の FittingJob リソースのことではなく Python の学習プログラムについての話です。

汎用的に使えるものを意識しているためゴリゴリにチューニングはしていません。

Timeseries Prediction

時系列予測には Prophet を使用しています。時系列予測ではそのデータの傾向・周期性・イベントといった情報から予測を行います。そのためモデルには様々なパラメータを設定できますが、今回は汎用的に動作するモデルを作ろうとしているためイベントなどのパラメータは設定しません (できません)。Prophet 自体デフォルト値で上手く動くことが多いのでだいたいデフォルト値です。

Prophet は独自のモデルを使用しており、トレンド・周期性・イベントといった複数の要素をそれぞれ関数化して組み合わせることで予測しています。

Parameters

意識しているパラメータは 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 くらいで広すぎず狭すぎずで問題ないと思われます。これはいずれパラメータ化する予定です。

Change Point Detection

変化点検知には特異スペクトル解析法を使用しています。変化点というのは異常検知の一種であり、点ではなく線でそのデータの異常度を判別します。これを使用してデータのどの範囲を学習データに使用するか決めることができます。例えばシステムの構成を変えた・サーバーのプログラムを差し替えた、などで大きくメトリクスの傾向が変わった際に、古い傾向のデータを捨てることによって予測の精度を上げることができます。

Singular Spectrum Transformation (SST)

SST はモデルのようなものを作らずに時系列解析を行うため学習データを考える必要がありません。この変化点検知は下記のような流れで行われます。

  • 変化度を計測したい時間 t を決める
  • t からスライドウィンドウサイズ w 分のサブ時系列を得る
  • t から 1 つずつずらしながら似たようなサブ時系列を n 個得て行列を構成する
    • これを履歴行列と呼ぶ
  • 同じように t からラグ l 分ずらした t-l からの行列を得る
    • これをテスト行列と呼ぶ
    • 厳密にはサブ時系列の個数を履歴・テストでそれぞれ異なる数にすることができる
  • 履歴行列とテスト行列をそれぞれ特異値分解する
  • それぞれの左特異ベクトルから特異値上位 m 個の特異ベクトルを選択する
    • 次元削減
    • 厳密には履歴・テストそれぞれいくつの特徴量を選択するか決められる
  • 履歴・テストのそれぞれの選ばれた特異ベクトルの行列を U, Q として U^T・Q を求めます
  • その行列を特異値分解してその最大特異値がそれぞれの行列の類似度となります
    • その時系列ベクトルが関係ない (直行) ならば 0 に近づきます
  • 1-(類似度) をすることによってその異常度が求まります

手法については k-NN (k=1) による方法も試しましたが、緩やかな傾向変化に対応することができない点や、学習データに変化点が含まれていないことが前提となってしまうので採用しませんでした。

References