1、说明
SCiForest与iForest的最大差别在于其利用超平面去划分数据集,其利用了多个特征组合划分,并且还在可选范围内选择了最佳的划分超平面,而不是像iForest一样,只是随机选单个特征,随机选单个值(SCiForest论文链接)但论文中并未给出代码实现,更未被收录到如 s c i k i t − l e a r n scikit-learn scikit−learn、 P y O D PyOD PyOD 等机器学习常用库,可能异常检测是机器学习的一个小的子领域,不像 n l p nlp nlp和 C V CV CV如此热门吧。
下面给出SCiForest的python的简单实现,需要注意的是:
- 原论文中并未给出最终异常得分公式,但熟悉iForest的应该知道其得分和 p a t h L e n g t h pathLength pathLength的关系。
- 本次代码未经大量验证,难免有考虑不周的地方,可以自行修改、添加,比如:部分地方没有采用向量化的计算方式;不支持 b o o t s t r a p bootstrap bootstrap;不支持max_features;不支持自定义污染程度、可视化等。
此外,本次实现是一次抛砖引玉,希望各路大牛能更高效、更规范地实现它,也希望结交更多在异常检测领域或风控领域的朋友。
2、代码
import numpy as np
from sklearn.utils import check_array
import random
from collections import namedtuple
from sklearn.exceptions import NotFittedError
def is_same(x):
"""
用于比较二维数组中,每行是否相同,本方法采用了一种投机取巧的方法,直接转换成string比较。
"""
first = x[0]
for i in range(1, len(x)):
if str