異常検知 scikit-learn

異常検知

異常検知の一つの方法として、Isolation Forestを使用した例を以下に示します。

この例では、2次元のデータを生成し、異常値を検出します。

また、matplotlibを使用して結果をグラフ化します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest

# データ生成
rng = np.random.RandomState(42)

# 正常なデータポイント
X_train = 0.3 * rng.randn(100, 2)
X_train = np.r_[X_train + 2, X_train - 2]

# 新しい正常なデータポイント
X_test = 0.3 * rng.randn(20, 2)
X_test = np.r_[X_test + 2, X_test - 2]

# 異ント
X_outliers = rng.uniform(low=-4, high=4, size=(20, 2))

# Isolation Forestの設定
clf = IsolationForest(max_samples=100, random_state=rng)

# モデルの学習
clf.fit(X_train)

# 予測
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)

# プロット
xx, yy = np.meshgrid(np.linspace(-5, 5, 50), np.linspace(-5, 5, 50))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.title("IsolationForest")
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)

b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white',
s=20, edgecolor='k')
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green',
s=20, edgecolor='k')
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red',
s=20, edgecolor='k')

plt.axis('tight')
plt.xlim((-5, 5))
plt.ylim((-5, 5))
plt.legend([b1, b2, c],
["training observations",
"new regular observations", "new abnormal observations"],
loc="upper left")
plt.show()

このコードは、Isolation Forestを使用して異常検知を行い、結果をグラフ化するものです。

グラフでは、白色の点が訓練データ、緑色の点が新たな正常データ、赤色の点が異常データを表しています。

[実行結果]

解説

このコードは、異常検知のためのアルゴリズムであるIsolation Forestを使用しています。

以下に各部分の詳細な説明を記載します。

1. ライブラリのインポート

必要なライブラリをインポートしています。
numpyは数値計算、matplotlibはグラフ描画、sklearn.ensembleのIsolationForestは異常検知のためのライブラリです。

2. データ生成

正常なデータポイントと異常なデータポイントを生成しています。
正常なデータは、平均0、標準偏差0.3正規分布から生成され、その後2だけシフトされます。
これを2つのクラスターとして生成しています。
異常なデータポイントは、-4から4の一様分布から生成されます。

3. Isolation Forestの設定

IsolationForestのインスタンスを作成します。
ここでは、max_samplesパラメータを100に設定し、各ツリーの最大サンプル数を100に制限しています。

4. モデルの学習

正常なデータポイントを用いてIsolationForestモデルを学習させます。

5. 予測

学習したモデルを用いて、訓練データ、新たな正常データ、異常データの各データポイントが異常かどうかを予測します。

6. プロット

最後に、matplotlibを用いて結果をプロットします。
背景の色は各点の異常スコアを表し、白色の点は訓練データ、緑色の点は新たな正常データ、赤色の点は異常データを表しています。

このコードを実行すると、Isolation Forestがどのように異常データを検出するかを視覚的に理解することができます。