Zenn
📘

Isolation Forest と AutoEncoder を用いた異常検知システム

2025/02/27に公開

はじめに

異常検知(Anomaly Detection)は、ネットワークセキュリティ、不正取引の検出、製造業の異常検出など、さまざまな分野で利用されています。本記事では、異常検知の代表的な手法である Isolation ForestAutoEncoder(オートエンコーダ) の原理、実装方法、適用シナリオについて詳しく解説します。


異常検知とは?

異常検知は、通常のデータとは異なるパターンや異常な挙動を検出する手法です。異常検知には以下のカテゴリがあります。

  1. 教師なし異常検知:正常データのみを学習し、異常を検出(例:Isolation Forest, AutoEncoder)。
  2. 教師あり異常検知:正常・異常のラベル付きデータで学習(例:SVM, Random Forest)。
  3. 半教師あり異常検知:正常データを主に学習し、異常データを少量利用(例:One-Class SVM)。

本記事では 教師なし異常検知 に焦点を当てます。


Isolation Forest とは?

1. Isolation Forest の概要

Isolation Forest は、異常データを正常データから分離することに特化した決定木ベースの手法です。一般的なクラスタリングや回帰分析とは異なり、異常データは疎であり、少数である という仮定のもと動作します。

2. アルゴリズムの仕組み

  1. ランダムに特徴を選び、ランダムな閾値で分割。
  2. 短いパスで分離されるデータほど異常度が高いとみなす。
  3. 多数の決定木を作成し、異常スコアを算出。

異常スコアは以下の式で定義されます:

[ 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. アルゴリズムの仕組み

  1. エンコーダ:入力データを低次元に圧縮。
  2. デコーダ:圧縮したデータを元の次元に復元。
  3. 再構成誤差(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

ログインするとコメントできます