IsolationForest示例

一个使用 sklearn.ensemble.IsolationForest进行异常检测的例子。

IsolationForest‘通过随机选择一个特征,然后在所选特征的最大值和最小值之间随机选择一个分割值来分离观察。

由于递归划分可以用树结构表示,因此分离样本所需的分割数相当于从根节点到终止节点的路径长度。

这个路径长度,在这样随机树的森林的平均,是正常情况和我们的决策函数的一种度量。

随机划分产生明显异常的较短路径。因此,当随机树的森林对特定样本产生较短的路径长度时,它们很可能是异常。

print(__doc__)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest

rng = np.random.RandomState(42)

# Generate train data
X = 0.3 * rng.randn(1002)
X_train = np.r_[X + 2, X - 2]
# Generate some regular novel observations
X = 0.3 * rng.randn(202)
X_test = np.r_[X + 2, X - 2]
# Generate some abnormal novel observations
X_outliers = rng.uniform(low=-4, high=4, size=(202))

# fit the model
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)

# plot the line, the samples, and the nearest vectors to the plane
xx, yy = np.meshgrid(np.linspace(-5550), np.linspace(-5550))
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((-55))
plt.ylim((-55))
plt.legend([b1, b2, c],
           ["training observations",
            "new regular observations""new abnormal observations"],
           loc="upper left")
plt.show()

脚本的总运行时间:(0分0.495秒)

Download Python source code: plot_isolation_forest.py

Download Jupyter notebook: plot_isolation_forest.ipynb