ノウハウ

基礎から解説!数値系異常検知の概要と代表的な手法

目次

初めまして、調和技研で数値系AIの開発を担当している小林です。本稿では、AIを用いた異常検知の初歩の初歩について解説します。

2023年4月に調和技研に入社した私が異常検知に深く関わるようになったのは10年ぶりのことでした。大学時代にはサポートベクターマシンを主に使用していましたが、その他の異常検知の方法については深く学習していませんでした。そのため、この新たな環境で異常検知について学び直す機会に恵まれたのですが、いざ学習してみると、難しい数式や難しい言葉が並んでおり苦戦…。そこで、まずはどんな異常検知の方法があるのか、どのような異常検知がどんなことに使われているのか、などの基本からおさらいしたので、その内容を本記事にまとめてみました。異常検知の基本を学びたい方におすすめの内容です!

※安心してください、本記事に数式は登場しません。もっと深く学習したい方はぜひ、筆末に記載の書籍で確認してみてください 。

異常検知とは何か

異常検知(Anomaly Detection)は、データの中から通常とは異なる振る舞いやパターンを持つ異常なデータを特定する手法です。異常検知は、データセットの中で異常なインスタンスやイベントを検出するため、モデルが正常データの特徴を学習し、異常なものを見分ける能力を持つ必要があります。

異常検知の手法にはいくつかの種類があります。以下に代表的な手法をいくつか紹介します。

統計的手法

統計的手法は、データの統計的な特性を利用して異常を検出します。正常データの分布をモデリングし、新しいデータがその分布から大きく外れる場合に異常と判断します。代表的な統計的手法には、正規分布やカーネル密度推定を用いる方法などがあります。

機械学習ベースの手法

機械学習ベースの手法では、正常データを学習し、その学習モデルを用いて新しいデータが正常か異常かを判定します。代表的な手法には、教師なし学習のクラスタリングや密度推定、教師あり学習のサポートベクターマシンや決定木、深層学習の異常検知モデルなどがあります。

パターンマイニング

パターンマイニングは、データセット内の異常なパターンやルールを探索し、異常を検出します。データセット内の関連性や規則性を探索するため、アソシエーションルールやシーケンスマイニング、異常なイベントパターンの抽出などが行われます。

異常検知の応用例としては、ネットワークセキュリティの監視や不正行為の検出、機械の故障検知、金融取引の不正検出などがあります。異常検知は、一般的に異常なデータが正常データに比べて少ないというケースが多いため、データの偏りやアンバランスさに対処する戦略が必要となります。また、異常検知モデルの評価には適切な評価指標を選ぶことも重要です。

正規分布データからの異常検知手法

続いて、正規分布に従うデータからの異常検知手法の種類や実例を紹介します。

1. 多変量正規分布

多変量正規分布(Multivariate Normal Distribution)は、複数の変数が相互に関連していると仮定し、それらが共同で形成する正規確率分布です。単変量正規分布が1つの変数の確率分布を表すのに対して、多変量正規分布は複数の変数の確率分布を表します。

多変量正規分布は、平均ベクトル(mean vector)と共分散行列(covariance matrix)によって完全に特徴づけられます。平均ベクトルは各変数の平均値を要素とするベクトルであり、共分散行列は各変数の分散と変数間の相関を表現します。

多変量正規分布は、データのクラスタリング、異常検知などのさまざまな統計的なアプリケーションで使用されます。異常検知では、通常のパターンや振る舞いから逸脱した異常なデータ点を見つけるために、多変量正規分布を使用することがあります。

異常検知において多変量正規分布を利用する場合、一般的な手法としては以下のようなものがあります。

  • マハラノビス距離(Mahalanobis Distance)に基づく方法:マハラノビス距離は、データ点と平均ベクトルの間の距離を計算する指標です。この距離がある閾値を超える場合、異常とみなすことができます。
  • 密度推定に基づく方法:多変量正規分布のパラメータ(平均ベクトルと共分散行列)を推定し、データ点の確率密度を計算します。低い確率密度を持つデータ点は異常とみなされる可能性があります。
  • 主成分分析(Principal Component Analysis, PCA)に基づく方法:データの次元削減を行い、変数間の相関を考慮しながらデータを新たな低次元空間に射影します。異常なデータ点はこの低次元空間で外れ値として検出される可能性があります。

多変量正規分布を使用した異常検知の実例としては、以下のようなケースがあります。

  • ネットワークトラフィックの監視:ネットワークの通信パケットや接続ログなどのデータを収集し、それぞれの変数(例: パケットサイズ、通信間隔)が正規分布に従うと仮定します。これに基づいて多変量正規分布を構築し、通常のトラフィックパターンとは異なる振る舞いを持つトラフィックを検知します。
  • 製造プロセスのモニタリング:製造工程におけるセンサーデータや制御パラメータの時間変化を観測し、それぞれの変数が正規分布に従うと仮定します。多変量正規分布を用いて、製造プロセスの異常な振る舞いや異常なパターンを検知します。
  • サーバーログの異常検知:サーバーのログデータから、通常の動作パターンを学習します。多変量正規分布を構築し、ログデータが通常の振る舞いから逸脱している場合に異常として検出します。例えば、異常なアクセスパターンや異常なアクティビティがある場合に検知できます。

2. ホテリング理論

ホテリング理論(Hotelling's T-squared test)は、統計学の手法の一つで、異常検知にも応用されます。ホテリング理論は、多変量データセットにおいて異常を検出するために使用されます。主成分分析(PCA)などの次元削減手法を用いてデータを低次元空間に射影し、その空間上で異常な振る舞いを検出します。異常スコアを計算することで、異常度を評価することも可能です。以下のような場面で利用されることがあります。

  • 金融取引の監視:不正取引や詐欺を検出するために、異常な取引パターンを見つけるために使用されます。
  • ネットワークセキュリティ:異常なネットワークトラフィックや攻撃を検出するために使用されます。
  • インフラ監視:システムの異常動作や障害を早期に検出するために使用されます。

非正規データからの異常検知手法

次に、非正規データからの異常検知手法の一例として、k近傍法とk平均法ついて解説します。

1. k近傍法

異常検知手法には、さまざまなアプローチやアルゴリズムが存在しますが、ここではk近傍法(k-Nearest Neighbors, k-NN)に焦点を当てて説明します。

k近傍法は、異常検知における基本的な手法の1つであり、パターン認識やクラス分類にも利用されます。以下に、k近傍法の基本的な概念と手順をまとめます。

1. データセットの準備

  • 正常なデータと異常なデータのラベル付きデータセットを用意します。
  • ラベルは、正常なデータを0とし、異常なデータを1などの異なる値で表現します。

2. 距離尺度の選択

  • k近傍法では、データ間の距離を測定する必要があります。
  • 一般的な距離尺度としては、ユークリッド距離やマンハッタン距離が使われます。

3. kの選択

  • kは、近傍にいくつのデータを考慮するかを指定するパラメータです。
  • kの値は、実験や交差検証を通じて最適な値を見つける必要があります。

4. 学習フェーズ

  • k近傍法では、正常なデータの特徴空間を学習します。
  • 学習フェーズでは、正常なデータを特徴ベクトルとして保存します。

5. 異常検知フェーズ

  • 新しいデータポイントが与えられた場合、そのデータポイントとk個の最も近いデータポイントを比較します。
  • k個の最近傍データポイントのうち、異常データの割合が閾値を超える場合、そのデータポイントは異常と判定されます。

k近傍法は、シンプルかつ直感的な手法ですが、適切な距離尺度やkの選択が異常検知の結果に大きく影響することに留意する必要があります。また、高次元のデータや大規模なデータセットに対しては、計算上の課題が生じる可能性もあります。

以上が、 k近傍法に関する概要です。参考書籍にはより詳細な情報が含まれているため、ぜひ参照してください。

2. k平均法

k平均法(k-means)は、クラスタリング手法の一つであり、データを予め定められたk個のクラスタに分割します。各データ点は最も近いクラスタ中心に割り当てられ、クラスタ中心は各クラスタ内のデータの平均値で更新されます。クラスタリングが正常なデータに対して効果的である場合、異常なデータ点は他のデータ点から遠く離れたクラスタに所属する可能性があります。このため、k平均法を使用して異常検知を行うことができます。

One-Class SVMとは

最後に、私が気になっている手法をひとつ取り上げたいと思います。それはOne-Class SVMです。通常のサポートベクターマシン(SVM)と比較しながら説明していきます。

データの特性

通常のSVMは、2つのクラスを持つ教師あり学習アルゴリズムです。一方、One-Class SVMは教師なし学習アルゴリズムであり、異常検知に特化しています。One-Class SVMは、正常データの特徴のみを学習し、それ以外の異常なデータを検出することを目的としています。

データのラベリング

通常のSVMでは、トレーニングデータは正常クラスと異常クラスの2つのクラスにラベル付けされています。一方、One-Class SVMでは、トレーニングデータは正常データのみで構成され、ラベルは必要ありません。モデルは正常データの特徴を学習し、異常と見なされるデータを検出します。

モデルの学習

通常のSVMは、正常クラスと異常クラスの境界を見つけることを目的としています。トレーニングデータセットの特徴をもとに、クラスの境界を見つけるための最適な超平面を学習します。一方、One-Class SVMは、正常データの特徴を学習し、そのデータが存在する空間を表現するための超平面を見つけます。この超平面の外側にあるデータは異常とみなされます。

異常検出の性能

通常のSVMは、正常クラスと異常クラスの境界を見つけるため、異常検出においても有用です。しかし、正常データと異常データの分布が明確に異なる場合や、異常データが少ない場合には、通常のSVMはうまく機能しないことがあります。一方、One-Class SVMは異常検出に特化しており、正常データの分布を特徴化する超平面を見つけるため、異常データの検出において有効です。


以上から、異常検出には、通常のSVMよりもOne-Class SVMがより適している場合があります。ただし、具体的な問題やデータセットの特性によって、最適な手法は異なる場合もあります。それぞれの問題に応じて適切な手法を選択することが重要です。

例として、下記のような表を作成しました。10個の正常データを学習し、2個の異常データを検知するものです。緑色の点が、正常な値で赤い色の点が異常と判断された値です。

サンプルコード自体は、ChatGPTなどに作成させるなどしても簡単にできますので、興味があれば、ぜひ挑戦してみてください。下記に、ChatGPTで生成したサンプルコードを記載します。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import OneClassSVM
# 正常データの生成
np.random.seed(42)
normal_data = np.random.normal(0, 1, size=(10, 2))
# 異常データの生成
anomalous_data = np.array([[4, 4], [-3, -3]])
# データの結合
data = np.vstack([normal_data, anomalous_data])
# One-Class SVMモデルの構築
svm = OneClassSVM(nu=0.1, kernel='rbf', gamma=0.1)
svm.fit(normal_data)
# サンプルの異常スコアの計算
scores = svm.decision_function(data)
threshold = np.percentile(scores, 10)  # 上位10%を異常とする
# プロット
xx, yy = np.meshgrid(np.linspace(-5, 5, 500), np.linspace(-5, 5, 500))
Z = svm.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.figure(figsize=(10, 7))
plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), threshold, 7), cmap=plt.cm.Blues_r)
plt.contour(xx, yy, Z, levels=[threshold], linewidths=2, colors='red')
plt.scatter(normal_data[:, 0], normal_data[:, 1], color='green', label='Normal')
plt.scatter(anomalous_data[:, 0], anomalous_data[:, 1], color='red', label='Anomalous')
plt.legend()
plt.title('One-Class SVM for Anomaly Detection')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

一緒に異常検知をマスターしていきましょう

異常検知の種類(ほんの一部ですが)について、少し理解を進められたでしょうか。異常検知に対する苦手意識を持っていた方も払しょくできていれば幸いです。

私としては、学生時代に使っていたSVMにさらに派生したSVMが登場していたことに感動しました。今後も異常検知についてさらに掘り下げて学んでいこうと思います。特に、今後はpyodのようなツールやそこで活用されている手法を調べ、より実用的な知識をつけていこうと考えています。その成果はまたブログで発信していきますので一緒に異常検知を極めていきましょう。

 


【参考文献】
「入門 機械学習による異常検知 - Rによる実践ガイド -」(井出 剛 著、2015)

記事を書いた人
小林 佑輔

2013年3月に北海道大学大学院情報科学研究科調和系工学研究室を修士で修了。ビルの入退室管理システム等のSEや開発を経験したのち、2023年4月より、電機メーカーから株式会社調和技研に転職。数値系の分野を担当。趣味はサッカー観戦と模型製作、ゲーム。最近は作りたい模型とやりたいゲームが多すぎて手が回らない模様。