Pro Yearly is on sale from $80 to $50! »

ディープじゃない異常検知の話

 ディープじゃない異常検知の話

異常検知とは?
時系列ではないデータの異常検知
異常検知の性能評価
時系列データの異常検知

F8865f41777ef3caced0e4e6801ff83a?s=128

masa-ita

June 01, 2019
Tweet

Transcript

  1. ディープじゃない異常検知の話 板垣正敏 @Python機械学習勉強会in新潟 2019/6/1

  2. ⾃⼰紹介 š 板垣 正敏(いたがき まさとし) š 1955年新潟県村上市⽣まれ š 株式会社BSNアイネット 技術顧問

    š 中⼩企業診断⼠ š NPO法⼈ 新潟オープンソース協会 理事 š ⽇本Rubyの会 会員 š Python機械学習勉強会 in 新潟 世話⼈
  3. 本⽇のお話 šはじめに š異常検知とは︖ š時系列ではないデータの異常検知 š異常検知の性能評価 š時系列データの異常検知

  4. はじめに š 今⽇のネタ本はこれです š 「⼊⾨ 機械学習による異常検知―Rに よる実践ガイド」井⼿剛著 コロナ社 š http://www.coronasha.co.jp/np/isbn/97

    84339024913/ š 異常検知に関する⽇本語の書籍はい くつかありますが、コード例を⽰し た本ということで参考にしました
  5. 異常検知とは︖ š異常検知とは「正常ではない状態を検出すること」 šそれでは、「正常な状態」とは何︖ š「正常な状態」の定義によって、様々な検出⼿法が⽣ まれてくる

  6. 時系列ではないデータの異常検知

  7. 距離を基にした異常検知 š「正常な状態は互いに似通っている」という仮説に基づく考え⽅ š「正常なデータ」はかたまっているはず šその「かたまり」から遠く離れたデータは「異常」(外れ値) šデータが数値ベクトルであれば、距離の定義は簡単 š⼀般的な距離の定義は「ユークリッド距離」 , = & '()

    * (' − ' ).
  8. 距離を基にした異常検知の⼿順 šデータの準備 š距離の定義 š距離の計算 š閾値(どれくらい離れていたら異常とするか) š閾値は相対的な判断しかできない︖

  9. 確率分布を基にした異常検知 š 「距離」を基にした異常検知でも、実はデータの分布についての仮定を⾏っていた š 「正常なデータ」はかたまっているはず š 分布に関する仮定がないと閾値の設定が難しい š 分布にはいろいろあり、データの性質に基づいた分布を仮定するのが正しいやり⽅ š

    ただし、「⼤数の法則」があるため、「正規分布」を仮定することが多い š 「異常」とは「めったに起こらないことが起きた」という定義 š 正規分布での「正常なデータのかたまりからの距離」すなわち「異常度」は、次の式で 定義される 1 = 1 − 2 2 . ′ は新たな観測値、 2 は標本平均、 2 は標本標準偏差
  10. 正規分布の異常度と確率 š 全スライドの異常度は「分散で 調整された平均からの距離の2 乗」 š 平均からどれくらい離れたら異 常とするかの「閾値」は、「ど れくらい稀なことなのか」とい う確率から求める「信頼区間」

    から決める š scipy.stats.norm.interval(alpha, loc=0, scale=1)
  11. ホテリング理論 š1次元の観測データN個が正規分布に従う時、同じ正規 分布に独⽴に従う観測値の異常度の整数倍は、⾃由度 (1, N-1)のF分布に従う š特にNが1より⼗分に⼤きい場合、異常度は⾃由度1, スケール因⼦1のカイ⼆乗分布に従う ⾃由度 のカイ⼆乗分布︓ ;

    = ) .9/;< =/. =/.>) >@/.
  12. ホテリングのT2法 š準備︓異常が含まれていないか、含まれていてもごく少数と思 われるデータセットを⽤意する š閾値の設定︓異常度を確率として捉え、カイ⼆乗分布から異常 度の閾値を定める š分布推定︓標本平均と標本分散(標本標準偏差)を計算する š異常度の計算︓確率密度関数から異常度を計算する š閾値判定︓異常度を閾値と⽐較する

  13. マハラノビス距離︓多次元正規分布の場合 š 多次元の場合、正常値でもばらつき の多い次元とばらつきの⼩さい次元 があることが想定される š このため距離(異常度)の定義も、 ばらつき⼤⼩を補正するために「マ ハラノビス距離」を⽤いる š

    マハラノビス距離(の⼆乗)の定義 1 = 1 − 2 A B Σ>)(1 − 2 ) ′ は観測値ベクトル、2 は標本平均ベクトル、B Σ は 標本共分散⾏列
  14. 多変数の場合のホテリング理論 šM次元の観測データN個がM次元正規分布に従う時、同 じM次元正規分布に独⽴に従う観測値の異常度は、⾃ 由度(N, N-M)のF分布に⽐例する š特にNがMより⼗分に⼤きい場合、異常度は⾃由度M, スケール因⼦1のカイ⼆乗分布に従う šScipy.stats/NumPyを使った実装例 šhttps://github.com/masa-ita/anomaly-detection-with- python/blob/master/01_hotelling_method.ipynb

  15. マハラノビス-タグチ法(MT法) š品質⼯学(タグチメソッド)の提唱者である⽥⼝⽞⼀博⼠が考案 したマハラノビス距離と直交法を使ったばらつきの測定法 š多変数のホテリング理論では、ばらつきは定義できるが、どの変 数がそのばらつきの原因かは計算できない šMT法では変数集合に対してSN⽐という概念を導⼊し、ばらつき の原因となった変数を特定することが可能 šNumPyのみでの実装例 šhttps://github.com/masa-ita/anomaly-detection-with- python/blob/master/02_mt_method.ipynb

  16. ガンマ分布による異常検知 š 「ひと⼭」ではあるが「正の値しかとらない」「左右対称でない」分 布を持つデータに対しての異常検知 šEx. 体重など š ガンマ分布のパラメータ推定法にはモーメント法や最尤法が使われる š 異常度の定義は負の対数尤度を使うが、分布は容易に求めることがで

    きないため、閾値は分位点で定めるのが現実的 š Scipy.stats/NumPyによる実装例 šhttps://github.com/masa-ita/anomaly-detection-with- python/blob/master/03_gamma_dist.ipynb
  17. 異常データが混⼊した訓練データ š分布推定による異常検知では、訓練データに異常デー タが混じっていないか、混じっていても無視できるく らいに少ないことが前提 š訓練データに異常データが混じっている場合の対応策 の⼀つが、正規分布の線型結合モデルを仮定して、期 待値最⼤化法(EM法)でパラメータを推定する⼿法

  18. k-近傍法 šM次元からなるデータの異常判定法でデータの分布を仮定しな い⼿法 šM次元データN個からなるデータ空間で、新たな観測データ ′ に対して ′ を中⼼としたM次元球体を考える š 基準︓球の半径を決めた時、その中に⼊る標本の数

    がある 基準値以下なら ′ は異常 š 基準︓観測値 ′ に近い 個の標本を選んだ時、それらを囲 む球の半径 ∈= がある基準値以上なら ′ は異常
  19. カーネル密度推定 šデータの分布から、データ空間の点のデータの存在確率を 推定したモデルを構築する⽅法 š点と点の間の「類似度」を定義する関数(カーネル関数) を使⽤するが、カーネル関数には正規分布がよく使われる šstatsmodelsによる実装例 šhttps://github.com/masa-ita/anomaly-detection-with- python/blob/master/04_kde_statsmodels.ipynb

  20. クラスタリングによる⽅法 š データをクラスタリングによって「塊(クラスター)の集合」ととらえ、どの 塊にも属さないデータを異常と考える⼿法 š クラスタリングの⼿法として次のようなものが使われる š k-means法 š クラスターの中⼼からの距離を使って、あるデータ点がどのクラスターに属するかを決

    め、中⼼を更新しながら繰り返す⼿法 š 混合正規分布モデル š クラスターを正規分布と仮定して、データ点を最も所属する確率の⾼いクラスターに分 類していく⼿法 š scikit-learnによる実装例 šhttps://github.com/masa-ita/anomaly-detection-with- python/blob/master/05_gaussian_mixture.ipynb
  21. 時系列ではないデータの異常検知⼿法 分布 ⼀⼭ 正規分布 ホテリングT2法 マハラノビスタグチ法 ⾮対称 ガンマ分布を利⽤ 異常データ混⼊ 線型結合モデル

    複数の⼭ 近傍距離 k -近傍法 カーネル密度推定 クラスタリング k-means法 混合正規分布
  22. One-Class Support Vector Machine š データのほぼ全体を囲む球を考え、その球に⼊り切らなかったもの を異常と考える š 異常度(距離)の計算において、線形計算である内積を⾮線形計算 に置換する⼿法(カーネル法)の採⽤により、⾮線形データについ

    ても扱うことが可能となる š scikit-learnによる実装例 šhttps://github.com/masa-ita/anomaly-detection-with- python/blob/master/06_one_class_svm.ipynb
  23. 次元削減による異常検知︓主成分分析 š 多変量データで変数間に関係がある場合、逆⾏列計算を前提とする ホテリング理論のような⼿法は使えなくなる š逆⾏列が求められない「特異⾏列」になりやすい š M次元のデータをM>NとなるN次元に写像し、その中でデータの分 布する「正常部分空間」を求め、そこからどれくらい離れているか で異常か正常かを判定する š

    確率的主成分分析や、⾮線形変換を伴うカーネル主成分分析などの ⼿法もある š pyod PCA による実装例 šhttps://github.com/masa-ita/anomaly-detection-with- python/blob/master/07_pca.ipynb
  24. ⼊⼒と出⼒のあるモデルの異常検知 šあるシステムへの⼊⼒と出⼒が観測されている場合の異常検知 šこのシステムを回帰モデルと仮定し、⼊⼒から得られるであろ う出⼒と実際の出⼒の観測値の差から異常を判断する⽅法 š線形回帰モデル šリッジ回帰モデル šscikit-learnによる実装例 šhttps://github.com/masa-ita/anomaly-detection-with- python/blob/master/08_ridge.ipynb š正準相関分析による異常検知

  25. 異常検知の性能評価

  26. 異常検知の性能評価 š 異常検知の性能特性は閾値によっ て変化する š 異常標本の数は正常標本より著し く少ないことが多いため、異常検 知の性能評価に正解率を使うこと は不適切 異常判定の閾値

    異常標本精度 正常標本精度 1 分岐点閾値 分岐点精度
  27. 異常検知の性能評価 š 適合率(Precision) = AN ANOPQ š 再現率(Recall) = AQ

    AQOPU š 調和平均である F値 = .×適合率×再現率 適合率O 再現率 = .AQ .AQOPUOPQ を使って評価することが多い (井⼿さんの書籍の定義は⼀般的な定義と異なっている︖)
  28. 異常検知の性能評価 š閾値との関係は ROC (Receiver Operator Characteristic)曲線と AUC (Area Under Curve)を使っ

    て評価される šAUC=1に近いほど理想的
  29. 時系列データの異常検知

  30. 時系列データの異常とは︖ š 時系列データでは前後のデータ間 の関係が無視できないため、これ まで⾒てきた「値としてかけ離れ たいわゆる『外れ値』検出」以外 の考え⽅が必要となる š 右図の(b)のように、値そのも のは異常ではないが、規則性から

    逸脱したものや、(c)のように 周期あるいはスペクトルの変化を 検出する必要が出てくる
  31. スライディングウィンドウと異常部位検出 š スライディングウィンドウ法 š時系列データについて、ある⼀定の⻑さの「窓」を想定し、窓をスラ イドしながら、窓から⾒える複数の観測値(部分時系列)をベクトル として取り出す⽅法 š 異常部位検出 šスライディングウィンドウ法で得られた部分時系列の集合をベクトル データセットとして扱い、異常な部分時系列を検出する

    š部分時系列どうしの「距離」や「類似度」を使って判定する špyod KNN を使った実装例 šhttps://github.com/masa-ita/anomaly-detection-with- python/blob/master/09_knn_pyod.ipynb
  32. 変化点検知と特異スペクトル変換法 š 変化点検知 š「外れ値」ではないが他と違っているというような異常を検知する⼿法 š 特異スペクトル変換法 š主成分分析のように部分空間法を⽤いてノイズを除去しながら、時系列デー タの特徴パターンを抽出する š具体的にはスラディングウィンドウ法で得られた部分時系列ベクトルを並べ た⾏列を作り、この⾏列を特異値分解することで特徴パターンを抽出する

    š特異値分解で得られた左特異ベクトルどうしの距離を⾏列ノルムを使って定 義し、その⼤きさで異常度を計算する
  33. 特異スペクトル変換法のイメージ š出典 特異スペクトル変換法による時系 列データの異常検知(Python) - Fire Engine https://blog.tsurubee.tech/entry/20 17/10/11/221255 šNumPyによる実装例

    šhttps://github.com/masa- ita/anomaly-detection-with- python/blob/master/11_sst_1.ipyn b šhttps://github.com/masa- ita/anomaly-detection-with- python/blob/master/12_sst_2.i pynb
  34. ⾃⼰回帰モデルによる異常検知 š 時系列を⾃⼰回帰モデルとしてフィッティングし、予測値と観測値の間 の距離を異常度とする š 次数 r の⾃⼰回帰モデル X =

    & '() Y X>' X>' + \ š 次数 r の決定には、AIC(⾚池情報量基準)が使われることが多い š statsmodelsによる実装例 šhttps://github.com/masa-ita/anomaly-detection-with- python/blob/master/13_ar_model.ipynb
  35. ⾃⼰回帰型モデルのバリエーション š AR(Autoregressive model︓⾃⼰回帰モデル) š 基本となる⾃⼰回帰モデル š ARMA(Autoregressive and Moving

    Average model︓⾃⼰回帰移動平均モデル) š ARモデルに過去の変動の影響を加えたモデル š ARIMA(Autoregressive, Integrated and Moving Average model︓⾃⼰回帰和分移動平均モ デル) š ARMAモデルに和分要素(トレンド)を加えた⾮定常モデル š SARIMA(Seasonal, Autoregressive, Integrated and Moving Average model︓季節変動⾃⼰ 回帰和分移動平均モデル) š ARIMAモデルに季節変動要素を加えたモデル
  36. 状態空間モデルによる異常検知 š 観測対象が持つ内部状態 z と観測で得られる観測値 をモデル化したも ので、⼀時点前の内部状態 z ^>) から現時点の内部状態

    X を得るため の関数 と、内部状態 X から観測値 X を得る関数 を想定し、そ れぞれにノイズがあると考える X>. X>) X XO) XO. X>. X>) X XO) XO.
  37. 状態空間モデルによる異常検知 š 状態空間モデルを定義する関数が線形関数であるものを線形状態空 間モデルと呼ぶ X ≈ X X ≈ X>)

    ≈ は確率的ノイズを別にすれば等しいという意味 š 線形状態空間モデルのパラメータ推定法 š部分空間同定法 šカルマンフィルタを⽤いた⽅法
  38. よくある疑問 š データの前処理はどうする︖ š 中央化(平均値を引いてゼロに) š 標準化(中央化に加えて分散を1に) š 対数変換(⽐率などのデータを扱いやすく) š

    Box-Cox変換(スパイクなどの影響を軽減) = e − 1 š 分類モデルで異常検知はできないか︖ š 異常サンプルは正常サンプルに⽐較して⾮常に少ないことが多いため、「⾮均衡データ」の取扱いをする 必要がある š ダウンサンプリング、アップサンプリング、重み付き損失(尤度)関数等
  39. まとめ š 異常検知には、対象となるデータによって異なる⼿法が必要 š 対象となるデータが同じでも、異なる⼿法による検知があり得る š 異常検知に使われるRのライブラリの代替となるPythonのライブラリは だいたいある š 様々な⼿法の異常検知を同⼀のAPIでラッピングしたPyODは便利かもし

    れない š 異常検知には「⼀般解」はない︖ š 背景となる統計モデルや数式の導出に興味のある⽅は、本を読んでくだ さい
  40. 参考ページ š 教師なし学習による異常値検知: マハラノビス距離 (実装編) š https://qiita.com/shopetan/items/30f6e0932485c976a946 š Robust covariance

    estimation and Mahalanobis distances relevance š https://scikit-learn.org/stable/auto_examples/covariance/plot_mahalanobis_distances.html š Pythonとカーネル密度推定(KDE)について調べたまとめ š https://vaaaaaanquish.hatenablog.com/entry/2017/10/29/181949 š Kernel Density Estimation in Python š https://jakevdp.github.io/blog/2013/12/01/kernel-density-estimation/ š Rで計量時系列分析︓AR, MA, ARMA, ARIMAモデル, 予測 š https://tjo.hatenablog.com/entry/2013/07/12/184704
  41. 参考ページ š Pythonによる時系列データの異常検知 š https://blog.brains-tech.co.jp/entry/2017/10/17/170140 š Time Series Analysis by

    State Space Methods š https://www.statsmodels.org/stable/statespace.html#module- statsmodels.tsa.statespace š Understanding Kalman Filters š https://www.youtube.com/playlist?list=PLn8PRpmsu08pzi6EMiYnR-076Mh-q3tWr š PyOD š https://github.com/yzhao062/pyod
  42. サンプルプログラムとデータ š GitHub š https://github.com/masa-ita/anomaly-detection-with-python š Rdatasets š https://vincentarelbundock.github.io/Rdatasets/