Isolation Forest

2020-12-09  本文已影响0人  王尔德的小人书

Isolation Forest

概述:

Intro:随机选取特征,在该特征的maximum和minimum中随机选择切分值。递归划分,形成孤立树结构。根节点到叶子节点的长度,等价于split的次数。对于多棵树,计算平均长度,可以反映样本异常的程度,因为异常样本通常较快的被划分到叶子节点,路径长度较小。

独立树:随机二叉树,每个结点要么有两个子节点,要么是叶子结点。对于数据集D,D的所有属性均为连续型变量。

独立树构造流程:

1、随机选择一个属性(不同于决策树的信息增益策略,直接选)

2、随机选择该属性的分界值value(value取值在max和min之间)

3、[根据步骤2的值对每条记录进行分类,小于value的记录在左子树,大于或等于value的记录在右子树

4、递归执行步骤1、2、3,直到满足条件:传入的数据只有一条或者多条相同记录,或者树的高度达到阈值

预测

把测试记录从根节点搜索,确定预测点的搜索路径。检测异常的假设:异常点一般比较稀有,所以很快被分到叶子结点,所以独立树中,异常值一般是根节点到叶子结点路径短的叶子。可以用距离深度h(x)判断记录是否属于异常值。S(x,n)判定记录x是否为异常值,则有

n:为样本大小,h(x)为记录在独立树的高度,S(x,n)取值为0~1,越接近1,越确定为离群点,接近0则说明正常点的概率较高。如果S(x,n)大部分都接近0.5,说明数据集没有明显异常值。

仅使用一棵树确定离群值随机性较大,可将多颗独立树结合形成独立森林,即随机采样一部分数据集构造每一个独立树,并且保证每棵独立树不同。同时限定样本大小,因为采样前正常值和异常值有重叠,采样可以有效区分正常值和离群值;同时限定独立树的最大高度,以内离群值路径较短,设置过高的高度阈值会造成大量无意义的计算,降低效率。S(x,n)此时:

sklearn库函数

Parameters

n_estimators:int, optional(default = 100) //树的棵数,paper中建议100,再增加模型提升有限

max_samples:int or float, optional(default = “auto”) //sunsample样本大小,默认256;int,则抽取样本数为该值;float,则按比例计算

contamination:auto or float, optional(default = “auto”) //样本中离群值的占比,auto是采用paper中的阈值,sklearn是0.5,float是自己指定

max_features:int or float, optional(default = 1.0) //每棵树训练时参与分裂的树的特征数,默认1

bootstrap: bool, optional(default = false) //subsample时,采取有放回抽样还是无放回抽样,默认不放回

n_jobs: int or none, optional(default = none) //模型预测和训练时,工作的core数量,-1全部用来工作

random_state: int, randomState instance or none, optional(default = none) //设置随机数

verbose: int, optional(default = 0) //是否在构建树的过程中输出

Methods

decision_function(self, X) //返回基学习器的平均得分=score_samples-offset;得分越低越不正常

fit(self, X[, y, sample_weight]) //拟合模型

fit_predict(self, X[, y]) //预测

get_params(self[, deep]) //得到模型参数

predict(self, X) //预测

score_sampls(self, X) //计算得分

set_params(self, **params) //设置参数

实验步骤:

简单EDA

data.head()

data.shape

data.Class.value_counts()

data.isna().sum()

数据准备

交叉验证的数据划分和模型训练指定随机数种子,以保证数据可对比和可重复

from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV, StratifiedKFold

特征数据单独存放

data[‘hour’] = data[“time”].apply(lambda x : divmod(x, 3600)[0])

X=data.drop([‘time’, ‘Class’], axis=1)

Y=data.Class

训练、测试数据划分

调用train_test_split函数划分训练集和测试集,设置参数stratify=y,保证划分之后正负样本比和总体样本保持一致。

上一篇下一篇

猜你喜欢

热点阅读