多変量ガウス分布による異常検知の基本

Multivariate Gaussian Distribution for Anomaly Detection Basics

異常検知の概要、多変量ガウス分布のレビュー、およびPythonでの基本的な異常検知アルゴリズムの実装と2つの例

私たちの生まれつきのパターン認識能力は、空白を埋めたり次に何が起こるかを予測するためにこのスキルを使用することを可能にします。しかし、時折、私たちの期待に合わない何かが起こり、パターンの認識に当てはまらないことがあります。このような出来事を異常と呼びます。何かを予測しようとしている場合は、トレーニングデータから異常を除外することが望ましいかもしれません。または、生活をより良くするために異常を特定したいかもしれません。いずれの場合も、異常検知技術はほとんどの産業や科目領域で有用で適用可能です。

この記事では、異常検知の基礎と統計的な異常検知モデルの実装について説明します。

異常検知とは何ですか?

一般的には、異常検知とは通常とは異なる現象を特定するプロセスを指します。異常検知の目的は、私たちの期待とは一致せず、ある基礎的なパターンに合致しないイベント、出来事、データポイント、または結果を特定することです。したがって、異常検知を実装するための鍵は、予想されるイベントの基礎的なパターンを理解することです。予想されるパターンを知っていれば、これを使用して未知のデータポイントをマッピングすることができます。マッピングが成功せず、新しいデータポイントが予想されるパターンの外にある場合、おそらく異常が見つかったと言えます。

通常、3つのタイプの異常が発生します。第1のタイプは、データセット全体に対して異常と見なされる個々のインスタンスを含みます(例えば、高速道路上で非常に低速で走行する個々の車は、高速道路の交通全体と比較して異常です)。第2のタイプは、特定のコンテキスト内で異常なインスタンスを含みます(例えば、すべてのクレジットカード取引と比較してOKに見えるが、特定の個人の支出パターンでは異常なクレジットカード取引)。第3のタイプの異常は集合的であり、個々のインスタンス自体はある期待に従っているが、一定の期間内に連続して発生する一連のトランザクションは疑わしいです)[1]。

異常検知技術は3つのカテゴリに分類されます:

  1. 教師あり検知は、データセット内に正常と異常のラベルが必要です。ニューラルネットワークやブーステッドフォレストなどの教師あり学習アルゴリズムを使用して、データポイントを予想/異常クラスに分類することができます。残念なことに、異常なデータセットは非常に不均衡であり、通常、教師あり学習を支援するための十分なトレーニングサンプルがないため、アップサンプリングやダウンサンプリングのテクニックは役立ちません。
  2. 半教師あり検知は、部分的にラベル付けされたデータに対処します。半教師あり技術では、入力データには正のインスタンスのみが含まれ、入力データが期待されるパターンに従っていると仮定します。これらの技術は、正のケースの分布を学習し、正のインスタンスを生成するために使用します。テスト中、アルゴリズムは異常なインスタンスがモデルによって生成された可能性を評価し、この確率を使用して異常なケースを予測します。 [2]
  3. 教師なし検知は、完全にラベル付けされていないデータを使用して期待の境界を作成し、この境界の外にあるものを異常と見なします。

異常検知技術は任意のデータに適用でき、データ形式はどのアルゴリズムが最も有用かに影響を与えます。データの種類には系列(時系列、リンクリスト、言語、音)、表形式(例:エンジンセンサーデータ)、画像(例:X線画像)、およびグラフ(ワークフローやプロセスなど)があります。

胸部X線画像の異常検知の例 [4]

さまざまな問題と技術のため、異常検知は実際にはデータサイエンスの広範な領域であり、多くの応用があります。いくつかのこれらの応用には、詐欺検出、サイバーセキュリティの応用、販売や取引データの分析、珍しい病気の同定、製造プロセスの監視、太陽系外惑星の探索、機械学習の前処理などがあります。したがって、強力で高性能なアルゴリズムへのアクセスは、多くの分野で重要な影響を与える可能性があります。

では、異常を検出するために使用できる最も基本的なアルゴリズムを見てみましょう。

異常検知のためのガウス分布

基本的な異常検知手法の一つは、ガウス(正規)分布の力を利用して外れ値を特定することです。

カール・フリードリッヒ・ガウスによって発見されたガウス分布は、多くの自然現象をモデル化するために使用され、データセット内の特徴をモデル化するための人気のある選択肢です。この分布の確率密度関数は、算術平均を中心としたベルカーブであり、曲線の幅はデータセットの分散によって定義されます。ほとんどの場合は中心付近に存在するため、確率密度関数には両端に2つの伸びたテールがあります。インスタンスがよりまれで中心から遠いほど、外れ値または異常となる可能性が高くなります。ユレカ!-この概念を使用してデータセットの異常をモデル化することができます。

確率密度関数は、f(x)と定義され、データセット内のいくつかの結果xの確率を測定します。形式的には、以下のようになります。

データセットに1つの特徴だけがあり、その特徴が正規分布に従っていると仮定すると、上記のf(x)を使用して異常検知アルゴリズムをモデル化することができます。その後、いくつかの閾値イプシロンを設定し、ケースが異常かどうかを決定します。イプシロンはヒューリスティックに設定され、その値は使用ケースと異常の好ましい感度に依存します。

Graph depicting Normal Distribution [5]

正規分布では、平均値から2つの標準偏差以下であるインスタンスが2.5%発生します。したがって、閾値を0.054に設定すると、データセット内の約2.5%のイベントが異常として分類されます(平均から2つの標準偏差の累積分布関数は2.5で、-2の確率密度関数は0.054です)。より低い閾値は、分類される異常が少なくなり、より高い閾値は感度が低くなります。

現実世界では、一部の陽性ケースが閾値を下回り、一部の異常が閾値を上回るトレードオフが生じる場合があります。ユースケースを理解し、異なるイプシロン値をテストして最適な値を選ぶ必要があります。

単一の特徴を持つ例は簡単ですが、複数の特徴がある場合はどうすればよいでしょうか?特徴が完全に独立している場合、特徴の確率密度関数の積を取ることで異常を分類することができます。

2つの無相関特徴の場合、これは次のようになります。

基本的に、特徴の確率の積は、少なくとも1つの特徴が外れ値を持っている場合に異常を検出できることを保証します(イプシロンが十分に高い場合)。複数の特徴でインスタンスが外れ値を示す場合、確率はさらに小さくなります(総確率値は分数の積であるため)し、値がより異常である可能性が高くなります。

ただし、特徴が独立しているとは限りません。これが多変量確率密度関数の登場する場所です。多変量の場合、特徴間の関連性を捉えるために共分散行列(Σで示される)を構築します。その後、共分散行列を使用して特徴関係の「重複計算」を回避できます(これは実際には何が起こっているのかを非常に単純化して表現したものです)。多変量分布の確率密度関数の式は、以下のようになります。デューク大学のこれらのスライドは、式を導出するのに役立ちます。

ここで、xは入力ベクトル、μは特徴の平均ベクトル、Σは特徴間の共分散行列です。

私たちの生活を楽にするために、scipyライブラリを使用してこの関数を実装することができます:scipy.stats.multivariate_normalは特徴の平均値と標準偏差のベクトルを入力とし、一連の点を与えられた場合に確率密度を返す.pdfメソッドを持っています。

実際の例でこの実装を試してみましょう。

Pythonにおける2要素モデルの実装

まず、ユークリッド空間で異常値を視覚化するための2要素の例を観察しましょう。この例では、正規分布から抽出した100のサンプルで2つの特徴を生成しました(これらは正のサンプルです)。特徴の平均値と標準偏差を計算し、scipy.statsライブラリから分布情報を持つ多変量正規モデルを適合させました。 注意: 私は正のサンプルのみでモデルを適合させました。実世界のデータでは、特徴が正規分布に従い、外れ値や奇妙な値を含まないようにデータセットをクリーンにする必要があります — これにより、モデルの異常を検出する能力が向上します(特に特徴の正規分布要件を確実にするのに役立ちます)。最後に、データセットに5つの異常サンプルを追加し、.pdfメソッドを使用して確率を報告しました。

以下の散布図は結果を示しています: x1特徴はx軸にプロットされ、x2特徴はy軸にプロットされ、異常は注釈付きで表示され、色は多変量確率密度関数からの確率を表しています。

Scatterplot showing positive and anomalous points [5]

しきい値を十分に低く設定すると、異常値を予想される値と区別できるようになります。以下の2つのチャートでは、epsilon値が1×10^-7から1×10^-9まで比較されています。1×10^-9のepsilon値は意図した異常値をよりよく捉える傾向がありますが、1×10^-7は一部の正のサンプルを異常値として識別します。

Scatterplot comparison of identified anomalies at higher and lower epsilon [5]

この例では、異常値を視覚的に表現し、特異値を分析し、結果を分析することでepsilonを容易に特定できます。さらに、特徴が2つ以上ある例では、これがどのように変わるかを見てみましょう。

Pythonにおける多変量モデルの実装

この例では、ODDSライブラリからワインデータセットを使用します[3]。このデータセットは13の数値特徴と129のインスタンスを含んでいます。特徴はワインに関する情報を捉えており、元のデータセットはワインの分析に基づく分類タスクに使用されました。異常検出のために、ターゲットクラスの1つがダウンサンプリングされ、異常値として示されています。全体で10の異常値が129のインスタンスの中にあります(〜8%)。欠損値がないかなりクリーンなデータセットで作業しています。

最初に行うべきことは、特徴がガウス分布に従っていることを確認することです。可能な場合は、外れ値を除去し、正規化タクティクスの1つを使用して分布を正規化する必要があります。このデータセットでは、4つの特徴(アルコール、灰、灰のアルカリ度、非フラボノイドフェノール)が既に正規分布に従っており、4つの特徴(総フェノール、プロアントシアニン、色の強さ、色合い)は対数をとることで正規化できます。残りの特徴にはより良い戦略が存在しますが、この実習では単純にトレーニングデータセットからそれらを削除しました。最後に、平均から2つの標準偏差以上または以下の特徴値を含む行を除外することで外れ値を削除しました。コードの残りは前述の例と同じです。

前のセクションの2要素の例とは異なり、2次元平面上で結果を視覚化することはできませんが、混同行列の指標(再現率と適合率)やROC曲線下の面積を使用して正しいepsilonを見つけるのに役立ちます。

適合率と再現率の間には通常トレードオフがあり、epsilonの設定はユースケースの感度要件に依存します。この例では、曲線下の面積を最大化するepsilonを探しました。一部のユースケースでは、可能な限り多くの異常値を検出することが求められる場合があります(正の値を含むことのコストを考慮して)一方、他のユースケースでは、最終レポートから一部の異常値を見逃すことを許容しない場合があります(コストを考慮して)。いくつかの異なるepsilon値に対して評価メトリックスを計算しました。

Lineplot comparison of evaluation metrics by epsilon value [5]

イプシロンが増加すると、再現率も上昇します。提案されたイプシロンの値において、適合率はかなり低くなりますが、0.0035と0.0065の辺りでピークになります。AUCは適合率と再現率のバランスを取ろうとする指標であり、0.0065辺りでピークになります。混同行列を見てみましょう。

混同行列を表した表 [5]

私たちのモデルは、異常値をほぼすべて見つけることができ、ただ1つを見逃します。これは、私が3分の1の特徴を除外したにもかかわらず、素晴らしい結果です。残念ながら、私たちのモデルは異常として40件の陽性インスタンスを示しており、モデルを異常検出に使用する場合、陽性インスタンスの半数を手動で確認する必要があります。

このモデルを改善するために、残りの特徴をさらに工学的に設計し、外れ値に対して少し敏感性が低いイプシロン値を見つけることができます。この問題の残りは簡単であり、読者のための演習として残されています(iykyk)。ソースコードはこちらで見つけることができます。

ガウシアン異常検出の潜在的な欠点

多変量ガウス分布は異常検出において優れたモデルです。シンプルで高速で実行しやすいです。しかし、その欠点のために、多くのユースケースでの利用が制限されることがあります。

第一に、多変量分布は比較的低い確率密度値を生成することがあります。一般的に、これは現代のコンピュータでは問題ありません。しかし、コンピュータが効果的に処理できるような十分な値でない場合もあります。

第二に、特徴が正規分布に従うことを確認する必要があります。適切な特徴エンジニアリングとデータ操作を行うために時間と労力を割り当てることは問題ではありませんが、その作業を行うまで利益が得られないというリスクもあります。

第三に、このモデルはカテゴリカルな特徴を扱うことができません。データセットにカテゴリカルな特徴が含まれている場合、カテゴリカルな特徴の組み合わせごとに個別のモデルを作成する必要があります(作業量が非常に多くなる可能性があります)。

最後に、このモデルではすべての特徴が同じくらい重要であり、特徴間に複雑な関係がないことを仮定しています。この問題に対処するための1つの選択肢は、多変量分布の確率密度関数をゼロから実装し、特徴の重要性を考慮するためのパラメータを含めることです。特徴関係の問題を解決するためには、さらなる特徴エンジニアリングを行い、新たな特徴を作成する必要がありますが、このプロセスは困難で時間がかかり、リスクも伴います。

それにもかかわらず、多変量ガウス分布を使用した異常検出は、表形式の異常検出問題における素晴らしい第一歩です。ベンチマークを設定するために使用したり、データセット内の異常を検出するための理解しやすいツールとして利用することができます。

読んでいただきありがとうございます!近い将来、異常検出に関する完全なシリーズを行う予定ですので、このトピックが興味深い場合はお楽しみに。

参考文献:

  1. https://www.kaggle.com/code/matheusfacure/semi-supervised-anomaly-detection-survey
  2. https://ai.googleblog.com/2023/02/unsupervised-and-semi-supervised.html
  3. Saket Sathe and Charu C. Aggarwal. LODES: Local Density meets Spectral Outlier Detection. SIAM Conference on Data Mining, 2016.
  4. Nakao, T., Hanaoka, S., Nomura, Y. et al. Unsupervised Deep Anomaly Detection in Chest Radiographs. J Digit Imaging 34 , 418–427 (2021). https://doi.org/10.1007/s10278-020-00413-2
  5. https://github.com/viyaleta/Anomaly-Detection/blob/main/Examples/1%20Anomaly%20Detection%20with%20Guassian%20Distribution.ipynb

数式の表示は Codecogs オンライン LaTeX エディタ によるものです。

例を含む Jupyter Notebook はこちらで見つけることができます。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more