エクサウィザーズ Engineer Blog

株式会社エクサウィザーズのエンジニアチームブログ

【連載】時系列データにおける異常検知(2)

こんにちは、機械学習エンジニアの福成です。

前回は連載の第一回目ということで、時系列異常検知の基本的な考え方や、タスクの種類についてお話ししました。

techblog.exawizards.com

前回のポイントを再掲します。

  • 異常検知では、明示的な正解ラベルを学習に用いない教師なし学習が主流である。
  • 時系列中に2つの区間を設け、その中でモデル化を行いつつ区間をスライドさせるのが基本的な考え方である。
  • 区間の長さにより、大きくは外れ値検知・変化点検知に分けられる。
    • 両者ともに、時系列依存の有無の観点で分けることも可能である。

今回は外れ値検知・変化点検知について、より具体的なアプローチについて述べていきたいと思います。 また両者のタスクに関して時系列依存する・しない場合についても、それぞれ述べたいと思います。

外れ値検知

時系列依存しない場合

時系列依存しない外れ値検知では、参照区間の統計量を基にする方法が考えられます。 例えば「評価区間の値 > 参照区間の平均値×α となった場合、評価区間の値が異常である」といったものです。 これにより、参照区間の平均から極端に上振れしたものを異常として捉えることができます。シンプルすぎると思われるかもしれませんが、問題設定(何を異常とするか?)によってはこれだけで充分検知できる場合も多いです。 またαはハイパーパラメータのようなもので、分析者が設定します。値が小さいほど検知の感度は高くなります。

上記のロジックに加えて「ばらつき」の考え方を取り入れたい場合は、「評価区間の値 > 参照区間内の平均値 + 参照区間内の標準偏差×α となった場合、評価区間の値が異常である」といったロジックも考えることができます。 このようにすることで、例えば参照区間のばらつきが大きい場合は異常と判定させにくくするといったコントロールができるようになります。

このばらつきも考慮したロジックを用いて、下記の実験用の時系列データに対して外れ値検知を行うと、以下のような結果になりました。 参照区間の幅は90、α=4としています。

f:id:t-fukunari:20210520234939p:plain

赤丸はモデルが異常として検知した点です。値が跳ね上がっているところについて、漏れなく検知できていることがわかります。

時系列依存する場合

前回でも述べましたが、時系列依存する場合は時系列予測系のモデルを用いる方が適しています。 参照区間でフィッティングを行ったモデルで評価点を予測し、得られた予測値と実測値との誤差が大きい場合に異常と判定するやり方です。 例えば、「(予測値-実測値)の2乗を異常度とし、その異常度が閾値を超えた場合に異常とする」といった方法です。

この方法は参照区間と評価区間をずらしながら都度モデルを作るので計算コストが大きくなるという難点があります。 これを解消するために、近年ではオンライン忘却アルゴリズムを備えたChangeFinderが登場しています。 パラメータの計算をオンライン処理で行うので、計算時間が比較的少ないのが特徴です。

変化点検知

時系列依存しない場合

時系列依存しない変化点検知では、参照区間と評価区間の統計量を用いる方法が考えられます。 例えば「評価区間内の平均値 > 参照区間内の平均値 + 参照区間内の標準偏差×α となった場合、参照区間と評価区間の間が変化点である」といったものです。 値のベースラインが変わるような「明らかにわかる変化」に対しての検知に適しています。

このロジックを用いて、下記の実験用の時系列データに対して変化点検知を行うと、以下のような結果になりました。 参照区間の幅は90、評価区間の幅は7、α=2.5としています。 f:id:t-fukunari:20210520235012p:plain

緑の線は、モデルが検知した変化点です。 値が全体的に増えた箇所に対して検知できていることが確認できます。

時系列依存する場合

ここではさらに2通りの方法が考えられます。

再構成誤差

ひとつは、AutoEncoderの再構成誤差を用いる方法です。参照区間の時系列を再構成するように学習を行うことで、 推論時において再構成誤差が大きくなるような時系列は異常であるという考え方です。 前回の記事でも少し紹介した、参照区間を固定して評価区間のみスライドする方法になります。

以下では、学習フェーズと推論フェーズの2つに分けてアプローチを述べていきます。

学習フェーズでは、参照区間の時系列データに対して部分時系列を作成します。ウィンドウをずらしながら細切れの時系列を作成するイメージです。 この部分時系列を入力として、同じものを出力させるようにAutoEncoderで学習させます。 このとき、十分な学習データを得るために、参照区間は充分長めに取る必要があることに注意してください。

f:id:t-fukunari:20210519203258p:plain

推論フェーズでは、評価区間内の時系列を学習済みモデルに入力して、再構成誤差を計算します。 これを評価区間をスライドさせながら繰り返し行うことで、各区間における再構成誤差が得られます。 そして、設定した閾値を再構成誤差が超えたときに変化点検知を行います。

f:id:t-fukunari:20210519204748p:plain

潜在ベクトル + 外れ値検知

もう一つは、参照区間内の複数の部分時系列を次元圧縮した潜在ベクトル群と評価区間を次元圧縮した潜在ベクトルを比較して、「外れ値検知」的に検出する方法です。 以下ではAutoEncoderを用いて得られた潜在ベクトルを用いたアプローチを紹介します。 学習フェーズと推論フェーズの2つに分けて述べていきます。

学習フェーズでは、先ほどの再構成誤差の場合と同様に時系列データに対して部分時系列を作成し、AutoEncoderで学習させます。 ただ先ほどと異なるのが、参照区間等を意識せずに過去すべての時系列データで学習させる点です。 変化点以後のデータの特徴も抽出できるモデルである必要があるためです。

ここで興味があるのはこの中間にある潜在ベクトルです。 部分時系列の特徴が圧縮されたベクトルであると考えられるためです。 「圧縮」なので、ここでは、部分時系列の長さを潜在ベクトルの次元数よりも大きくする必要があります。

推論フェーズでは、上記で学習したEncoderを用います。 参照区間内で複数の部分時系列が得られるので、それらをこのEncoderに入力して複数の潜在ベクトルを得ます。 そして評価区間内の部分時系列からも同様に潜在ベクトルを得ます。 評価区間から1つの潜在ベクトルを得るため、ここでは、評価区間の長さ=部分時系列の長さにする必要があります。

あとは、潜在ベクトル空間においてk近傍法やOne-Class SVMなどで外れ値となるような評価区間を検知することで、最終的に変化点検知を行います。 潜在ベクトルで外れ値検知を行うので、区間の長さの目安としては、参照区間の長さが評価区間の長さの10倍以上になっている必要があります。

f:id:t-fukunari:20210519213751p:plain

今回のまとめ

今回はここまでです。ポイントを下記にまとめます。

  • 時系列依存しない外れ値検知では、参照区間の統計量を用いる。
  • 時系列依存する外れ値検知では、ChangeFinderのような時系列予測モデルを用いる。
  • 時系列依存しない変化点検知では、参照区間・評価区間の統計量を用いる。
  • 時系列依存する変化点検知では、再構成誤差を用いるか、潜在ベクトルに対する外れ値検知を行う。

参考文献

おわりに

エクサウィザーズは優秀なエンジニア、社会課題を一緒に解決してくれる魔法使い”ウィザーズ”を募集していますので、ご興味を持たれた方はぜひご応募ください。
採用情報|株式会社エクサウィザーズ

ExaWizards Engineer Blogでは、AIなどの技術情報を発信していきます。ぜひフォローをよろしくお願いします!
Linkedinもどしどしフォローお待ちしています!