isolation forest进行异常点检测

一、简介

孤立森林(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)
 
          返回样本的异常评分。 值越小表示越有可能是异常样本。

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)异常检测跟具体的应用场景紧密相关,算法检测出的“异常”不一定是我们实际想要的。比如,在识别虚假交易时,异常的交易未必就是虚假的交易。所以,在特征选择时,可能需要过滤不太相关的特征,以免识别出一些不太相关的“异常”。

猜你喜欢

转载自www.cnblogs.com/gczr/p/9156971.html