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,保证划分之后正负样本比和总体样本保持一致。
网友评论