一、简介
孤立森林(Isolation Forest)是另外一种高效的异常检测算法,它和随机森林类似,但每次选择划分属性和划分点(值)时都是随机的,而不是根据信息增益或者基尼指数来选择。在建树过程中,如果一些样本很快就到达了叶子节点(即叶子到根的距离d很短),那么就被认为很有可能是异常点。
二、代码实现
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.ensemble import IsolationForest from scipy import stats # fit the model clf = IsolationForest(max_samples=n_samples, random_state=rng, contamination=0.33) clf.fit(df.values) scores_pred = clf.decision_function(df.values) print(scores_pred) print(len(scores_pred)) threshold = stats.scoreatpercentile(scores_pred, 100 * outliers_fraction)
结果:[ 0.11573485 0.12433055 0.13780741 0.12351238 0.06556263 -0.05915569]
三、测试
predict(X)
返回值:+1 表示正常样本, -1表示异常样本。
decision_function(X)
decision_function(X)
返回样本的异常评分。 值越小表示越有可能是异常样本。
test=[[2,4,50,3,5,69,8]]
clf.decision_function(test)
输出:
array([0.08241789])
clf.predict(df.values)
输出:
array([ 1, 1, 1, 1, -1, -1])
四、算法应用
Isolation Forest 算法主要有两个参数:一个是二叉树的个数;另一个是训练单棵 iTree 时候抽取样本的数目。实验表明,当设定为 100 棵树,抽样样本数为 256 条时候,IF 在大多数情况下就已经可以取得不错的效果。这也体现了算法的简单、高效。
Isolation Forest 是无监督的异常检测算法,在实际应用时,并不需要黑白标签。需要注意的是:(1)如果训练样本中异常样本的比例比较高,违背了先前提到的异常检测的基本假设,可能最终的效果会受影响;(2)异常检测跟具体的应用场景紧密相关,算法检测出的“异常”不一定是我们实际想要的。比如,在识别虚假交易时,异常的交易未必就是虚假的交易。所以,在特征选择时,可能需要过滤不太相关的特征,以免识别出一些不太相关的“异常”。