📘
Isolation Forest と AutoEncoder を用いた異常検知システム
はじめに
異常検知(Anomaly Detection)は、ネットワークセキュリティ、不正取引の検出、製造業の異常検出など、さまざまな分野で利用されています。本記事では、異常検知の代表的な手法である Isolation Forest と AutoEncoder(オートエンコーダ) の原理、実装方法、適用シナリオについて詳しく解説します。
異常検知とは?
異常検知は、通常のデータとは異なるパターンや異常な挙動を検出する手法です。異常検知には以下のカテゴリがあります。
- 教師なし異常検知:正常データのみを学習し、異常を検出(例:Isolation Forest, AutoEncoder)。
- 教師あり異常検知:正常・異常のラベル付きデータで学習(例:SVM, Random Forest)。
- 半教師あり異常検知:正常データを主に学習し、異常データを少量利用(例:One-Class SVM)。
本記事では 教師なし異常検知 に焦点を当てます。
Isolation Forest とは?
1. Isolation Forest の概要
Isolation Forest は、異常データを正常データから分離することに特化した決定木ベースの手法です。一般的なクラスタリングや回帰分析とは異なり、異常データは疎であり、少数である という仮定のもと動作します。
2. アルゴリズムの仕組み
- ランダムに特徴を選び、ランダムな閾値で分割。
- 短いパスで分離されるデータほど異常度が高いとみなす。
- 多数の決定木を作成し、異常スコアを算出。
異常スコアは以下の式で定義されます:
[ s(x) = 2^{-\frac{E(h(x))}{c(n)}} ]
- ( h(x) ) はデータ点 ( x ) の平均分離パスの長さ。
- ( c(n) ) は正規化係数。
3. 実装例(Python)
from sklearn.ensemble import IsolationForest
import numpy as np
# データ生成
X_train = np.random.randn(100, 2)
X_test = np.random.randn(20, 2)
# モデルの作成と学習
model = IsolationForest(n_estimators=100, contamination=0.1, random_state=42)
model.fit(X_train)
# 異常スコアの取得
scores = model.decision_function(X_test)
predictions = model.predict(X_test)
print(predictions) # -1 が異常、1 が正常
4. 利用ケース
- ネットワーク攻撃検知(異常な通信パターン)
- 金融不正検知(異常な取引)
- 製造業の異常検知(機械の異常動作)
AutoEncoder とは?
1. AutoEncoder の概要
AutoEncoder はニューラルネットワークを用いた異常検知手法で、データを低次元の潜在空間に圧縮し、元の次元に復元する過程で異常データを検出します。
2. アルゴリズムの仕組み
- エンコーダ:入力データを低次元に圧縮。
- デコーダ:圧縮したデータを元の次元に復元。
- 再構成誤差(Reconstruction Error) を計算し、異常データを検出。
異常スコアは次のように定義されます:
[ s(x) = ||x - \hat{x}||^2 ]
ここで、( x ) は入力データ、( \hat{x} ) は再構成データです。
3. 実装例(Python)
import torch
import torch.nn as nn
import torch.optim as optim
# AutoEncoder の定義
class AutoEncoder(nn.Module):
def __init__(self, input_dim):
super(AutoEncoder, self).__init__()
self.encoder = nn.Sequential(
nn.Linear(input_dim, 8),
nn.ReLU(),
nn.Linear(8, 2)
)
self.decoder = nn.Sequential(
nn.Linear(2, 8),
nn.ReLU(),
nn.Linear(8, input_dim)
)
def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x
# データ準備
X_train = torch.randn(100, 10)
X_test = torch.randn(20, 10)
# モデルの作成
model = AutoEncoder(input_dim=10)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
# 学習
for epoch in range(100):
optimizer.zero_grad()
outputs = model(X_train)
loss = criterion(outputs, X_train)
loss.backward()
optimizer.step()
# 異常スコアの計算
with torch.no_grad():
reconstructed = model(X_test)
anomaly_scores = torch.mean((X_test - reconstructed) ** 2, axis=1)
print(anomaly_scores)
4. 利用ケース
- 産業機械の予兆保全(センサーデータ分析)
- 医療診断(異常な患者データの検出)
- 異常なログ検知(異常なイベントログの特定)
Isolation Forest vs AutoEncoder
手法 | メリット | デメリット |
---|---|---|
Isolation Forest | 計算コストが低い、パラメータが少ない | 高次元データには不向き |
AutoEncoder | 高次元データに対応、非線形関係を学習可能 | ニューラルネットワークの設計・学習が必要 |
まとめ
Isolation Forest と AutoEncoder は、それぞれ異なる利点を持つ異常検知手法です。
- Isolation Forest は シンプルで計算が高速 なため、リアルタイム異常検知に向いています。
- AutoEncoder は 非線形関係を学習できる ため、複雑なデータセットに適しています。
用途に応じて最適な手法を選択し、異常検知システムを構築しましょう!
Discussion