Some Notions(算法中使用到的一些符号说明)
Training Stage (训练阶段包含算法1和算法2)
算法1: i F o r e s t ( X , t , ψ ) iForest(X,t,\psi) iForest(X,t,ψ)构建孤立森林,X表示我们的总数据, t 表示孤立森林中设置的树的棵数, ψ \psi ψ表示构建一棵树,我们从总数据X中选取的随机样本个数
算法1: i T r e e ( X ′ ) iTree(X') iTree(X′)构建孤立树, X ′ X' X′表示 ψ \psi ψ 个随机样本的集合
Evaluation Stage
算法3:把样本一个 x 放到一棵孤立树上,看这个样本 x 最后落在树的哪个节点上,返回这个节点的高度。 P a t h L e n g t h ( x , T , h l i m , e ) PathLength(x,T,hlim,e) PathLength(x,T,hlim,e),x表示一个样本,T 表示森林中的一棵树,hlim表示一棵树最多能有多高,e 表示这个样本x从根节点到其所在节点一共经历的边数
直接调用Scikit learn 库中的Isolation Forest算法
predict(X): 返回值:+1 表示正常样本, -1表示异常样本。
decision_function(X) 返回样本的异常评分。 值越小表示越有可能是异常样本。
官方示例:(我们现在通过这个简单的例子,来看一看它都用了Isolation Forest 算法的哪些方法~)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
rng=np.random.RandomState(42)
# 生成训练数据
X=0.3*rng.randn(100,2) # 100条二维数据
X_train=np.r_[X+2,X-2] # 200条数据(X+2,X-2)拼接而成
X = 0.3 * rng.randn(20, 2)
X_test = np.r_[X + 2, X - 2]
# 基于分布生成一些观测正常的数据
X_outliers=rng.uniform(low=-4,high=4,size=(20,2))
# 训练隔离森林模型
clf=IsolationForest(behaviour='new',max_samples=100,random_state=rng,contamination='auto')
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)) # 生成网络数据 https://www.cnblogs.com/lemonbit/p/7593898.html
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()