无监督学习中的离群点检测取决于训练数据是否被污染,检测可分为离群点检测和新颖性检测离群点检测:训练数据包含离群点,即远离其他inlier点。异常值检测估计器将尝试拟合训练数据中异常点聚集的区域,并忽略有偏差的观测值。也称为无监督异常检测NoveltyDetection:训练数据未被异常值污染,我们感兴趣的是新观测值是否为异常值。在这种情况下,异常值被认为是新奇的。也称为半监督异常检测。简单的说:如果训练数据中有离群点,就是??离群点检测,否则就是新奇点检测。IsolationForestDefinition在高维数据集中实现异常值检测的一种有效方法是使用随机森林。ensemble.IsolationForest通过随机选择一个特征来“隔离”观察,然后随机选择所选特征的最大值和最小值之间的分割值。由于递归划分可以用树结构来表示,因此隔离样本所需的分裂数等于从根节点到终端节点的路径长度。在这种随机树的森林中平均的路径长度是数据正态性和我们的决策函数的度量。随机分区可以为异常观察产生明显更短的路径。因此,当随机树的森林共同为特定样本产生较短的路径长度时,这些样本更有可能是异常的。ensemble.IsolationForest的实现基于整个tree.ExtraTreeRegressor。根据isolationforest的原论文,每棵树的最大深度设置为log2(n),其中n是用于构建树的样本数。一言以蔽之:假设我们用一个随机超平面对数据空间(dataspace)进行切分(split),一次切可以生成两个子空间(想象一下用刀把蛋糕切成两半)。之后我们继续用一个随机的超平面切割每个子空间,如此循环直到每个子空间只有一个数据点。直观地说,我们可以发现那些密度高的簇可以被切割很多次才停止切割,而那些密度低的点很容易很早就停在一个子空间中。隔离森林算法已被证明在大多数工业异常检测场景中是无效的(推眼镜)。参考链接的适用范围异常数据占总样本量的比例很小;异常点的特征值与正常点差别很大。注意,如果训练样本中异常样本的比例很高,可能会导致最终结果不理想,因为这违背了算法的理论基础;异常检测与具体的应用场景密切相关,因此算法检测到的“异常”不一定是实际场景中的真实异常,所以在选择特征时尽量过滤掉不相关的特征。SimpleDemoilf=IsolationForest(n_estimators=100,#森林中树的数量default=100n_jobs=-1,#使用所有cpuverbose=2,#控制树构建过程的冗长程度)data=pd_basedata=data.fillna(0)#选择特征,不要使用标签(type)X_cols=['PARTICLE']#'DEVICE_CODE','ERR_CODE',#trainilf.fit(data[X_cols])test=data[X_cols]#predictpred=ilf.predict(test)data['pred']=preddata.to_csv('outliers.csv',columns=["pred",],header=False)IsolationForest参数的详细说明:n_estimators:int,optional(default=100)指定森林中生成的随机树的数量max_samples:intorfloat,optional(default=”auto”)用于训练随机数的样本数量,即二次采样的大小。如果设置了int常量,那么就会从总样本X中拉取max_samples个样本生成一棵树Tree如果设置了float浮点数,那么就会从总样本中拉取max_samples*X.shape[0]个样本X,而X.shape[0]代表总数如果样本数设置为“auto”,则max_samples=min(256,n_samples),n_samples为总样本数污染:floatin(0.,0.5),可选(默认=0.1),取值范围为(0.,0.5),表示给定数据集中异常数据的比例。数据集中的污染量实际上就是训练数据中异常数据的数量,比如异常数据在数据集中所占的比例。定义此参数值的作用是定义决策函数中的阈值。如果设置为'auto',则决策函数的阈值与论文中定义的相同0.20版更改:默认值从0.1更改为0.22版的'auto'
