依据数据特征主要分为以下三类:
- 有监督
主要算法有NN(neural networks)、SVM、KNN - 半监督
代表算法One-Class-SVM(一种新颖性检测算法,不能完全说是异常检测)、Anomaly Trees - 无监督
(1)基于近邻的算法,如KNN, LOF(local outiler factor,适用于中等高维数据), COF(connectivity-based outilier factor), LoOP(local outiler probability), INFLO(the influenced outilerness), LOCI(the parameter-free local correlation integral),FastLOF
(2)基于聚类的算法,如CBLOF(the cluster-based local outlier factor)
(3)基于统计的算法,无论是参数的还是非参数的,都主要是对单变量数据进行操作的,而很少的多变量方法对大数据集计算过于密集。
(4)IForest算法(时间序列异常检测)。适合高维数据。
基于近邻的算法优于基于聚类的算法。
用于检测多元数据中的边缘对象。通常被称离群点检测或异常检测。
安装方式
pip install pyod
Individual Detection Algorithms单样本检测
单样本检测,也就是说只有一个类别的数据集与标签,因为在工厂设备中,控制系统的任务是判断是是否有意外情况出现,例如产品质量过低,机器产生奇怪的震动或者机器零件脱落等。相对来说容易得到正常场景下的训练数据,但故障系统状态的收集示例数据可能相当昂贵,或者根本不可能。如果可以模拟一个错误的系统状态,问题就好解决多了,但无法保证所有的错误状态都被模拟到,所以只能寻找单样本检测相关的算法。
PCA(子空间)
使用加权投影距离与特征向量超平面的总和作为异常值异常值得分。
class pyod.models.pca.PCA(n_components=None, n_selected_components=None, contamination=0.1, copy=True, whiten=False,
svd_solver='auto', tol=0.0, iterated_power='auto', random_state=None, weighted=True, standardization=True)
1、通过降维,将数据映射到低维特征空间,然后在特征空间不同维度上查看每个数据点跟其它数据的偏差;
2、通过降维,将数据映射到低维特征空间得到 k个特征向量,再根据这 k个特征向量从低维特征空间投射回原空间,将重构的数据与原有数据做比较,观察重构误差。
PCA主要参数
n_components (int,float,None或string)(默认为None)——要保留的组件数量。
如果未设置n_components,则保留所有组件:n_components == min(n_samples, n_features)
如果n_components ==‘mle’和svd_solver ==‘full’,则Minka的MLE用于猜测维度。
如果0 < n_components < 1且svd_solver ==‘full’,选择组件数量,使得需要解释的方差量大于n_components指定的百分比,对于 svd_solver ==‘arpack’, n_components不能等于n_features。
n_selected_components (int,optional (default = None))——用于计算异常值分数的所选主成分的数量。
它不一定等于主成分的总数。如果未设置,请使用所有主要组件。
svd_solver(string {‘auto’ ,‘full’ ,‘arpack’ ,‘randomized’}) -
‘auto’:
解析器由基于X.shape和 n_components的默认策略选择:如果输入数据大于500x500且要提取的组件数低于数据最小维数的80%,那么效率更高’随机化’方法已启用。否则,计算精确的完整SVD并随后截断。
‘full’ :
运行完全完整的SVD通过scipy.linalg.svd调用标准LAPACK解算器 并通过后处理选择组件
‘arpack’:
运行SVD截断为n_components通过scipy.sparse.linalg.svds调用ARPACK解算器 。它严格要求0 <n_components <X.shape [1]
‘randomized’:
通过Halko等人的方法进行随机SVD。
tol(float> = 0 ,可选(默认值为.0 )) - 由svd_solver =='arpack’计算的奇异值的容差。
iterated_power(int> = 0 ,或’auto’ ,(默认为’auto’ )) - 由svd_solver =='randomized’计算的幂方法的迭代次数。
weighted(bool,optional (default = True )) - 如果为True,则在分数计算中使用特征值。具有小特征值的特征向量在离群值分数计算中更为重要。
standardization(bool,optional (default = True )) - 如果为True,则首先执行标准化以将数据转换为零均值和单位方差。
MCD
一种鲁棒性很强的位置和分布估计算法。
class pyod.models.mcd.MCD(contamination=0.1, store_precision=True, assume_centered=False,
support_fraction=None,random_state=None)
首先拟合最小协方差行列式模型,然后计算马哈拉诺比斯距离作为数据的离群程度
使用条件:要求总体样本数大于样本的维数。(总体样本协方差矩阵逆矩阵存在(马氏距离))
PCA和MCD原理相似,但前者很快却效果一般,后者较慢但效果更好,因为后者比前者所考虑计算的更多,前者可以被认为是后者的简化版本。
MCD主要参数
assume_centered(bool)
True,则计算鲁棒位置和协方差估计的支持,并从中重新计算协方差估计,而不使数据居中。用于处理平均值显着等于零但不完全为零的数据。
False,则使用FastMCD算法直接计算稳健位置和协方差,无需额外处理。
support_fraction(float,0 <support_fraction <1) - 包含在原始MCD估计支持中的点的比例。
默认值为None,这意味着support_fraction的最小值将在算法中使用:[n_sample + n_features + 1] / 2
OCSVM(基于分类classifier based)
基于密度检测方法。
class pyod.models.ocsvm.OCSVM(kernel='rbf', degree=3, gamma='auto', coef0=0.0, tol=0.001, nu=0.5, shrinking=True,
cache_size=200, verbose=False, max_iter=-1, contamination=0.1)
新奇检测:在给定一组(干净的,只有positive或者negative)样本中,学习数据集的边界以便于区分新的数据点是否属于该类。
异常值检测:高维数据,且数据中含有离群点(异常点)。或者对上层数据的分布没有任何假设。当训练数据中包含离群点,模型训练时要匹配训练数据的中心样本,忽视训练样本中的其他异常点。
单分类算法简介
-
OCSVM
One Class Learning 比较经典的算法是One-Class-SVM,这个算法的思路非常简单,就是寻找一个超平面将样本中的正例圈出来,预测就是用这个超平面做决策,在圈内的样本就认为是正样本。
由于核函数计算比较耗时,在海量数据的场景用的并不多:
-
AutoEncode 自编码
另一个算法是基于神经网络的算法,在深度学习中广泛使用的自编码算法可以应用在单分类的问题上,自编码是一个BP神经网络,网络输入层和输出层是一样,中间层数可以有多层,中间层的节点个数比输出层少,最简单的情况就是中间只有一个隐藏层,如下图所示,由于中间层的节点数较少,这样中间层相当于是对数据进行了压缩和抽象,实现无监督的方式学习数据的抽象特征。
如果我们只有正样本数据,没有负样本数据,或者说只关注学习正样本的规律,那么利用正样本训练一个自编码器,编码器就相当于单分类的模型,对全量数据进行预测时,通过比较输入层和输出层的相似度就可以判断记录是否属于正样本。由于自编码采用神经网络实现,可以用GPU来进行加速计算,因此比较适合海量数据的场景。 -
Robust covariance
Robust covariance方法,基于协方差的稳健估计,假设数据是高斯分布的,那么在这样的案例中执行效果将优于One-Class SVM ; -
Isolation Forest
Isolation Forest方法,孤立森林是一个高效的异常点检测算法。
OneClass 与二分类,多分类的区别
- 单分类
单分类算法只关注与样本的相似或者匹配程度,对于未知的部分不妄下结论。 - 二分类
典型的二类问题:识别邮件是否是垃圾邮件,一类“是”,一类“不是”。 - 多分类
典型的多类问题:人脸识别,每个人对应的脸就是一个类,然后把待识别的脸分到对应的类。
而OneClassClassification,它只有一个类,属于该类就返回结果“是”,不属于就返回结果“不是”。
其区别就是在二分类问题中,训练集中就由两个类的样本组成,训练出的模型是一个二分类模型;
而OneClassClassification中的训练样本只有一类,因此训练出的分类器将不属于该类的所有其他样本判别为“不是”即可,而不是由于属于另一类才返回“不是”的结果。
现实场景中的OneCLassClassification例子:现在有一堆某商品的历史销售数据,记录着买该产品的用户信息,此外还有一些没有购买过该产品的用户信息,想通过二分类来预测他们是否会买该产品,也就是两个类,一类是“买”,一类是“不买”。当我们要开始训练二分类器的时候问题来了,一般来说没买的用户数会远远大于已经买了的用户数,当将数据不均衡的正负样本投入训练时,训练出的分类器会有较大的bisa(偏向值)。因此,这时候就可以使用OneClassClassification 方法来解决,即训练集中只有已经买过该产品的用户数据,在识别一个新用户是否会买该产品时,识别结果就是“会”或者“不会”。
OneClass算法简介
严格来说,OneCLassSVM不是一种outlier detection,而是一种novelty detection方法:它的训练集不应该掺杂异常点,因为模型可能会去匹配这些异常点。但在数据维度很高,或者对相关数据分布没有任何假设的情况下,OneClassSVM也可以作为一种很好的outlier detection方法。
One Class SVM这个问题的解决思路有很多。这里只讲解一种特别的思想SVDD,对于SVDD来说,我们期望所有不是异常的样本都是正类别,同时它采用一个超球体(超球面是指三维以上的空间中的球面,对应的二维空间中就是曲线,三维空间中就是球面)而不是一个超平面来做划分,该算法在特征空间中获得数据周围的球形边界,期望最小化这个超球体的体积,从而最小化异常点数据的影响。
假设产生的超球体参数为中心 o 和对应的超球体半径 r >0,超球体体积 V(r)被最小化,中心 o 是支持行了的线性组合;跟传统SVM方法相似,可以要求所有训练数据点 xi 到中心的距离严格小于r。但是同时构造一个惩罚系数为 C 的松弛变量 ζi ,优化问题入下所示:
(松弛变量 ζi 作用:使得模型不会被个别极端的数据点给“破坏”了)
采用拉格朗日对偶求解之后,可以判断新的数据点 z 是否在内,如果 z 到中心的距离小于或者等于半径 r ,则不是异常点,如果在超球体以外,则是异常点。
OCSVM主要参数
kernel(string ,optional (default =‘rbf’ )) - 指定要在算法中使用的内核类型。它必须是’linear’,‘poly’,‘rbf’,‘sigmoid’,‘precomputed’或者callable之一。如果没有给出,将使用’rbf’。如果给出了callable,则它用于预先计算内核矩阵。
nu(float,optional) - 训练误差分数的上限和支持向量分数的下界。应该在区间(0,1)中。默认为0.5。
degree(int,optional (default = 3 )) - 多项式核函数的次数(‘poly’)。被所有其他内核忽略。
LOF(局部,近邻)
基于密度检测方法。可量化每个数据点的异常程度。适用中等高维数据。
class pyod.models.lof.LOF(n_neighbors=20, algorithm='auto', leaf_size=30, metric='minkowski', p=2, metric_params=None,
contamination=0.1, n_jobs=1)
每一个样本的异常分数Score称为局部异常因子。局部性由k近邻给出,其距离用于估计局部密度。(通常使用欧几里得距离)
通过将样本的局部密度与其邻居的局部密度进行比较,密度明显低于其邻居的样本。这些被认为是异常值。
一个样本点周围的样本点所处位置的平均密度比上该样本点所在位置的密度。
比值越接近1,越可能是正常样本;
比值越大于1,则该点所在位置的密度越小于其周围样本所在位置的密度,这个点就越有可能是异常点。
LOF算法相关概念
1) d(p,o):两点p和o之间的距离;
2) k-distance:第k距离
对于点p的第k距离dk(p)定义如下:
dk(p)= d(p,o),
并且满足:
a) 在集合中至少有不包括p在内的k个点o‘∈C{x≠p}, 满足d(p,o‘) ≤ d(p,o);
b) 在集合中最多有不包括p在内的k−1个点o’∈C{x≠p},满足d(p,o’) < d(p,o);
p的第k距离,也就是距离p第k远的点的距离,不包括p,如图。
3) k-distance neighborhood of p:第k距离邻域
点p的第k距离邻域Nk(p),就是p的第k距离即以内的所有点,包括第k距离。
因此p的第k邻域点的个数 |Nk(p)| ≥ k
4) reach-distance:可达距离
点o到点p的第k可达距离定义为:
reach-distancek(p,o) = max{ k-distance(o), d(p,o)}
表示点p的第k邻域内点到p的平均可达距离的倒数。
也就是,点o到点p的第k可达距离,至少是o的第k距离,或者为o、p间的真实距离。
这也意味着,离点o最近的k个点,o到它们的可达距离被认为相等,且都等于dk(o)。
如图,离o1到p的第5可达距离为d(p,o1),o2到p的第5可达距离为d5(o2)。
reach-distancek(p,o1) = d(p,o1)
reach-distancek(p,o2) = d5(p,o2)
5) local reachability density:局部可达密度
点p的局部可达密度表示为:
表示点p的第k邻域内点到p的平均可达距离的倒数。
注意,是p的邻域点Nk(p)到p的可达距离,不是p到Nk(p)的可达距离,一定要弄清楚关系。并且,如果有重复点,那么分母的可达距离之和有可能为0,则会导致lrd变为无限大,下面还会继续提到这一点。
这个值的含义可以这样理解,首先这代表一个密度,密度越高,我们认为越可能属于同一簇,密度越低,越可能是离群点。如果p和周围邻域点是同一簇,那么可达距离越可能为较小的dk(o),导致可达距离之和较小,密度值较高;如果p和周围邻居点较远,那么可达距离可能都会取较大值d(p,o),导致密度较小,越可能是离群点。
6) local outlier factor:局部离群因子
点p的局部离群因子表示为:
表示点p的邻域点Nk(p)的局部可达密度与点p的局部可达密度之比的平均数。
如果这个比值越接近1,说明p的其邻域点密度差不多,p可能和邻域同属一簇,可能为边界点;
如果这个比值越小于1,说明p的密度高于其邻域点密度,p为密集点;
如果这个比值越大于1,说明p的密度小于其邻域点密度,p越可能是异常点。
LOF主要参数
n_neighbors(int,optional (default = 20 )) - 默认情况下用于kneighbors查询的邻居数。如果n_neighbors大于提供的样本数,则将使用所有样本。
algorithm({‘auto’ ,‘ball_tree’ ,‘kd_tree’ ,‘brute’} ,可选) -
用于计算最近邻居的算法:
'ball_tree’将使用BallTree
'kd_tree’将使用KDTree
'brute’将使用蛮力搜索。
'auto’将尝试根据传递给fit()方法的值来确定最合适的算法。
注意:在稀疏输入上拟合将使用强力来覆盖此参数的设置。
leaf_size(int,optional (default = 30 )) - 传递给BallTree或KDTree的叶子大小。
这可能会影响构造和查询的速度,以及存储树所需的内存。最佳值取决于问题的性质。
metric(字符串或可调用,默认’minkowski’) -用于距离计算的度量。
from scikit-learn: [‘cityblock’, ‘cosine’, ‘euclidean’, ‘l1’, ‘l2’, ‘manhattan’]
from scipy.spatial.distance: [‘braycurtis’, ‘canberra’, ‘chebyshev’, ‘correlation’, ‘dice’, ‘hamming’, ‘jaccard’, ‘kulsinski’, ‘mahalanobis’, ‘matching’, ‘minkowski’, ‘rogerstanimoto’, ‘russellrao’, ‘seuclidean’, ‘sokalmichener’, ‘sokalsneath’, ‘sqeuclidean’, ‘yule’]
p(整数,可选(默认值= 2 )) - 来自sklearn.metrics.pairwise.pairwise_distances的Minkowski度量的参数。
当p = 1时,这相当于使用manhattan_distance(l1)。
对于p = 2使用euclidean_distance(l2)。
对于任意p,使用minkowski_distance(l_p)。
COF(局部,近邻)
COF使用数据点的平均链接距离与数据点的k最近邻居的平均链接距离的平均值的比率作为观察的离群值得分。
class pyod.models.cof.COF(contamination=0.1, n_neighbors=20)
类似于LOF,但密度估计不一样。LOF是基于欧氏距离的,即默认数据是以球形分布的,假设是特征是线性相关的,LOF就无能为力。
COF中,近邻的局部密度是基于最短路径方法求得的,亦称链式距离(链接当前实例和所有k个近邻的最短距离之和)。
COF主要参数
n_neighbors(int,optional (default = 20 )) - 默认情况下用于kneighbors查询的邻居数。如果n_neighbors大于提供的样本数,则将使用所有样本。
CBLOF基于聚类的局部异常因子(全局,聚类)
CBLOF根据基于群集的本地异常因子计算异常值分数。基于密度
class pyod.models.cblof.CBLOF(n_clusters=8, contamination=0.1, clustering_estimator=None, alpha=0.9, beta=5,
use_weights=False, check_estimator=False, random_state=None, n_jobs=1)
CBLOF将数据集和由聚类算法生成的聚类模型作为输入。它使用参数alpha(α)和beta(β)将群集分为小群集和大群集。然后基于该点所属的聚类的大小以及到最近的大聚类的距离来计算异常分数。
异常值得分仅根据它们与最近的大型群集中心的距离来计算。
(|C1|+|C2|+|C3|+…+|Cn|)≥ |D|*α
|Cb|/|Cb+1| ≥ β
所有cluster的数量加起来应该占总集群的 α,并且大集群的规模要是小集群规模的 β 倍。最后,以每个样本到其聚类中心的距离乘以属于其聚类的实例来计算异常分数。
如果是大集群,直接用本集群数量乘以样本到集群中心的距离,如果是小集群,用本集群的数量乘以样本到最近的大集群中心的距离。
默认使用KMeans聚类算法。
CBLOF主要参数
n_clusters (int,optional (default = 8)) - 要形成的簇数以及要生成的质心数。
clustering_estimator (Estimator, optional (default =None)) -用于执行数据聚类的基本聚类算法。
无设置时,CBLOF将使用KMeans进行扩展。
估算器应该有标准的sklearn API,fit()和predict()。
估算器应该具有属性labels_和cluster_centers_。如果模型拟合后cluster_centers_(每个集群的中心)不在属性中,则将其计算为群集中样本的平均值。
alpha(float (0.5, 1), optional (default = 0.9)) -系数用于决定小的和大的簇。大型集群中的样本数与小型集群中的样本数之比。
beta(int or float in (1 , ) ,optional (default = 5) - 决定小型和大型集群的系数。对于列表按大小排序的列表| C1 |,| C2 |,…,| Cn |,beta = | Ck | / | Ck-1 |
use_weights(bool,optional (default = False )) - 如果设置为True,则群集的大小将用作异常值分数计算中的权重。
LOCI(局部,近邻)
局部相关积分。基于密度。不适合处理较大数据集
class pyod.models.loci.LOCI(contamination=0.1, alpha=0.5, k=3)
LOCI对于检测异常值和异常值组非常有效。它为每个点提供LOCI图,总结了该点周围区域内数据的大量信息,确定了簇、微簇、它们的直径以及簇间距离。现有的异常检测方法都不能与此功能匹配,因为它们对每个点只输出一个数字。
局部相关积分算法通过使用最大化方法来解决这个问题。其基本思想是,每一项记录都使用所有可能的k值,最后取最大分数。为了达到这一目标,LOCI通过使用半径r来定义r-邻域,该半径随着时间的推移而扩展。
在局部密度计算上类似于LoOP,也是用半高斯分布来估计的,但是这里用的是邻域的点的个数,而不是用的距离。
此外,局部密度估计在不同的位点上也是不同的:它比较了两个不同大小的邻域,而不是局部密度的比率。
参数 alpha 控制不同邻域的比率而去替代K值是要付出代价的。通常,基于最近邻的异常检测算法的计算复杂度为o(N2)。另外,由于半径r需要从一个实例扩展到最远,复杂性增加到o(N3),这使得LOCI不利于处理较大数据集。
LOCI主要参数
alpha(int,default = 0.5)-邻域参数度量一个邻域的大小应该被认为是“局部的”。The neighbourhood parameter measures how large of a neighbourhood should be considered “local”.
k(int,default = 3) - 用于确定是否应将某个点视为异常值的异常值截止阈值。
HBOS(全局,统计)
基于直方图的离群值检测。较大数据集计算时间快。
class pyod.models.hbos.HBOS(n_bins=10, alpha=0.1, tol=0.5, contamination=0.1)
它假设特征独立并通过构建直方图来计算边远程度。
该方法为每一个样本进行异常评分,评分越高越可能是异常点。
分别为每个特征作一个直方图,对某个实例,连乘所有特征中该实例所在的柱的反高度(代表密度估计)。这类似于分类算法中的朴素贝叶斯算法(连乘所有独立特征的概率)。
在半监督异常检测中非常受欢迎。
两种作图方式:1.固定的柱宽度。2.柱个数大致相同,但导致不同的柱宽度。 当有大量离群值的时候,第二种方法更强固。
评分模型为:
假设样本p第 i 个特征的概率密度为 ,则p的概率密度可以计算为:
两边取对数:
概率密度越大,异常评分越小,则两边乘以“-1”:
即:
连续数据计算概率密度,首先要离散化
对于样本集D,设置合适的“断点”集合,将特征的取值分割成若干个区间。统计区间的样本数,可以构建一个频数直方图H。假设第 i 个特征分割成m 个区间,每个区间统计的样本个数分别为:
频率(概率)分布表
取值 | 区间1 | 区间2 | ... | 区间m |
---|---|---|---|---|
频率 | h1/sum(h1h2...hm) | h2/sum(h1h2...hm) | ... | hm/sum(h1h2...hm) |
根据频数直方图H可以计算出所有特征的频率分布。
为什么频率越大,异常评分越小?
上图是特征c的样本分布例图。直观上,B样本是异常点,A点是正常点。由于,样本A(样本B)关于特征c的概率密度估计可以用特征c在相应区间的频率来近似。显然,特征的取值频率越大,样本的关于该特征的异常评分越小。
HBOS主要参数
n_bins (int, optional (default=10)) - bin的数量
alpha (float in (0, 1), optional (default=0.1)) 用于防止溢出的正则。
tol (float in (0, 1), optional (default=0.1)) 该参数决定的灵活性,同时处理落入箱之外的样本。
KNN(全局,近邻)
class pyod.models.knn.KNN(contamination=0.1, n_neighbors=5, method='largest', radius=1.0, algorithm='auto', leaf_size=30,
metric='minkowski', p=2, metric_params=None, n_jobs=1, **kwargs)
支持三个kNN探测器:
最大:使用到第k个邻居的距离作为离群值得分
平均值:使用所有k个邻居的平均值作为离群值得分
中位数:使用到k个邻居的距离的中值作为离群值得分
-
原理:
K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。 -
特点:
1)不具有显示的学习过程,仅仅利用训练集对特征空间划分,并将其作为分类的‘模型’
2)由于不需要模型训练,训练时间复杂度为0,计算复杂度和训练集中文档数目成正比,即:如果训练集中文档总数为n,那么它的分类时间复杂度为o(n) -
基本要素
k值的选择,距离度量(欧氏距离),分类决策规则 -
k值的选择
k值过小,意味着整体模型变得复杂,容易过拟合;
k值过大,意味着整体模型变得简单,缺点是学习的近似误差会增大;
通常采用交叉验证来选取k值 -
距离度量:
欧氏距离 -
分类决策规则:
多数表决,即由输入实例的k个临近的训练实例中的多数类决定输入实例的类 -
不足
1)可能会忽略掉样本容量很小的类
2)计算量大,对每一个待分类的样本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点(线性扫描法找k近邻,耗时,不推荐)。 -
K近邻法实现
主要问题在于如何对数据集进行快速的k近邻搜索。
推荐搜索方法:kd树 -
kd树(本质是二叉树)
kd树(K-dimension tree)是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。
kd树是是一种二叉树,表示对k维空间的一个划分,构造kd树相当于不断地用垂直于坐标轴的超平面将K维空间切分,构成一系列的K维超矩形区域。kd树的每个结点对应于一个k维超矩形区域。利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量。
KNN主要参数
n_neighbors(int,optional (default = 5 )) - k个邻居查询默认使用的邻居数。
method (str, optional (default=‘largest’)) –{‘largest’, ‘mean’, ‘median’}
‘largest’:使用到第k个邻居的距离作为离群值得分
‘mean’:使用所有k个邻居的平均值作为离群值得分
‘median’:使用到k个邻居的距离的中值作为离群值得分
radius(float,optional (default = 1.0 )) - 默认情况下radius_neighbors 查询使用的参数空间范围。
algorithm ({‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, optional)
用于计算最近邻居的算法:
'ball_tree’将使用BallTree
'kd_tree’将使用KDTree
'brute’将使用蛮力搜索。
'auto’将尝试根据传递给fit()方法的值来确定最合适的算法。
leaf_size(int,optional (default = 30 )) - 传递给BallTree或KDTree的叶子大小。这可能会影响构造和查询的速度,以及存储树所需的内存。最佳值取决于问题的性质。
SOD
子空间离群点检测
class pyod.models.sod.SOD(contamination=0.1, n_neighbors=20, ref_set=10, alpha=0.8)
子空间离群点检测(SOD)模式旨在检测高维特征空间中不同子空间的离群点。对于每个数据对象,SOD都探索由数据对象的邻居所张成的轴向平行子空间,并确定该对象与该子空间中的邻居的偏离程度。
SOD主要思想
将数据集映射到低维子空间,根据子空间中映射数据的稀疏程度来确定异常数据是否存在,在某个低维子空间中,如果一个点存在于一个密度非常低的局部区域,则称该点为一个孤立点。要发现孤立点需要先挖掘异常模式,即低密度区域。
先对数据进行网格化,将数据空间的每一维分成Φ 个等深度的区间。等深度是指数据映射到一维之后,每一个区间包含相等的 f = 1/ Φ的数据点。这些区间形成一个个单元,用来确定稀疏的低维区域。
数据集的 k 维子空间中的每一维上各取一个区间,组成一个 k 维的立方体。如果属性是统计独立的,那么在该区域中期望的记录数为 fk 。但是一般来说,数据都不是统计独立的,因此一个立方体中点的分布于平均行为都差很多,所以低于平均的偏差可以用来进行异常检测。
SOD主要参数
n_neighbors (int, optional (default=20)) k个邻居查询默认使用的邻居数。
ref_set (int, optional (default=10)) 指定创建引用集的共享最近邻居的数量。请注意ref_set必须小于n_neighbors。
alpha (float in (0., 1.), optional (default=0.8)) 指定选择子空间的下限。
ABOD
基于角度的离群值检测。可以将其加权余弦分数与所有邻居的方差视为离群分数。
class pyod.models.abod.ABOD(contamination=0.1, n_neighbors=5, method='fast')
它考虑到每个点与其相邻点之间的关系,没有考虑这些邻居之间的关系。其加权余弦分数与所有相邻点的方差可视为偏离分数。 · ABOD在多维数据上表现良好。
- PyOD提供两种不同版本的ABOD:
- 快速ABOD:根据k最邻近的值进行估计
- 原始ABOD:考虑所有具有高时间复杂性的训练点
ABOD主要思想
对于一个在聚类簇内的点来说,由于簇内点靠近一个簇的中心,各方向都会有数据点,所形成的向量的夹角也是各方向的,所以它和其他点形成的不同向量之间的夹角大小差异是非常大的;而对于在聚类簇边界上的点,形成的向量之间的角度差异会小一些,因为点在簇的边界,向量的夹角有一定的方向;但和真正的离群点的角度差异相比,簇边界点角度大小的差异更大,因为大部分“未离群”的点多是在某一方向上的聚类簇内,离群点和多数点形成的角度会很小。
把每个夹角和所有夹角的平均值做比较,因此方差就成了第一衡量方式。 离群点的角度方差会相对较小,因为聚类簇内的点相对于离群点都在某一个具体的方向上;聚类簇的边界点的角度方差就比较大,聚类簇内的点的角度方差最大。
采用向量模的二次积的倒数,作为角度的加权系数,如果对应的两个点离查询点很远,即向量的模很大,那么角度的权值也就很小;如果对应的两个点离查询点很近,即向量的模很小,
那么角度的权值相对应的也就很大。
ABOD主要参数
n_neighbors (int, optional (default=10)) ——用于k个邻居查询的邻居数。
method (str, optional (default=‘fast’))
’fast’: fast ABOD。只考虑n_neighbors个训练点
‘default’: 具有所有训练点的原始ABOD。
SOS(无监督)
随机离群值选择
class pyod.models.sos.SOS(contamination=0.1, perplexity=4.5, metric='euclidean', eps=1e-05)
SOS采用相似性的概念来量化从一个数据点到另一数据点的关系。亲和力与两个数据点之间的相似度成正比。因此,数据点与异类数据点几乎没有亲和力。当所有其他数据点与它的亲和力不足时,将选择一个数据点作为异常值。
isolationForest
孤立森林
iForest中的树叫isolation tree,简称iTree。iTree树和决策树不太一样,其构建过程也比决策树简单,因为其中就是一个完全随机的过程。