Scikit Learn - 异常检测

在这里,我们将了解 Sklearn 中的异常检测是什么,以及如何使用它来识别数据点。

异常检测是一种用于识别数据集中与其他数据不匹配的数据点的技术。它在商业领域有着广泛的应用,例如欺诈检测、入侵检测、系统健康监控、监控和预测性维护。异常,也称为离群值,可分为以下三类 −

  • 点异常 − 当单个数据实例相对于其他数据被视为异常时,就会发生这种情况。

  • 上下文异常 − 这种异常与上下文相关。如果某个数据实例在特定上下文中存在异常,就会发生异常。

  • 集体异常 − 如果一组相关数据实例相对于整个数据集而非单个值存在异常,就会发生异常。

方法

异常检测可以使用两种方法,即异常值检测和新颖性检测。有必要区分它们。

异常值检测

训练数据包含远离其余数据的异常值。这些异常值被定义为观测值。因此,异常值检测估计器总是尝试拟合训练数据最集中的区域,同时忽略异常观测值。它也被称为无监督异常检测。

新颖性检测

它关注的是检测新观测值中未包含在训练数据中的未观察到的模式。此时,训练数据不受异常值的污染。它也被称为半监督异常检测。

scikit-learn 提供了一套机器学习工具,可用于异常值检测和新颖性检测。这些工具首先使用 fit () 方法以无监督的方式从数据中实现对象学习,如下所示 −

estimator.fit(X_train)

现在,新的观测值将使用 predict() 方法按如下方式排序为内点(标记为 1)或外点(标记为 -1) −

estimator.fit(X_test)

估计器将首先计算原始评分函数,然后预测方法将利用该原始评分函数的阈值。我们可以借助 score_sample 方法访问此原始评分函数,并通过 contamination 参数控制阈值。

我们还可以定义 decision_function 方法,将异常值定义为负值,将正常值定义为非负值。

estimator.decision_function(X_test)

Sklearn 异常值检测算法

首先,我们来了解一下什么是椭圆包络。

拟合椭圆包络

该算法假设常规数据服从已知分布,例如高斯分布。对于异常值检测,Scikit-learn 提供了一个名为 covariance.EllipticEnvelop 的对象。

该对象对数据进行稳健的协方差估计,从而将椭圆拟合到中心数据点。它会忽略中心模式之外的点。

参数

下表列出了 sklearn 使用的参数。 covariance.EllipticEnvelop 方法 −

Sr.No 参数及说明
1

store_precision − 布尔值,可选,默认值 = True

如果预估精度已存储,我们可以指定它。

2

assume_centered −布尔值,可选,默认值 = False

如果设置为 False,则直接借助 FastMCD 算法计算稳健位置和协方差。如果设置为 True,则计算稳健位置和协方差的支持度。

3

support_fraction − 浮点数 (0., 1.),可选,默认值 = None

此参数指示方法在原始 MCD 估计值的支持度中包含多少比例的点。

4

contamination −浮点数 (0., 1.),可选,默认值 = 0.1

它提供了数据集中异常值的比例。

5

random_state − int,RandomState 实例或 None,可选,默认值 = none

此参数表示生成的伪随机数的种子,用于对数据进行混洗。以下是 − 的选项

  • int − 在本例中,random_state 是随机数生成器使用的种子。

  • RandomState 实例 − 在本例中,random_state 是随机数生成器。

  • None −在本例中,随机数生成器是 np.random 使用的 RandonState 实例。

属性

下表列出了 sklearn.covariance.EllipticEnvelop 方法 − 使用的属性。

Sr.No 属性和说明
1

support_ −数组类型,形状为 (n_samples,)

它表示用于计算位置和形状稳健估计的观测值掩码。

2

location_ − 数组类型,形状为 (n_features)

它返回估计的稳健位置。

3

covariance_ −数组类型,形状为 (n_features, n_features)

返回估计的稳健协方差矩阵。

4

precision_ − 数组类型,形状为 (n_features, n_features)

返回估计的伪逆矩阵。

5

offset_ − 浮点型

用于根据原始分数定义决策函数。 decision_function = score_samples -offset_

实现示例

import numpy as np^M
from sklearn.covariance import EllipticEnvelope^M
true_cov = np.array([[.5, .6],[.6, .4]])
X = np.random.RandomState(0).multivariate_normal(mean = [0, 0], cov=true_cov,size=500)
cov = EllipticEnvelope(random_state = 0).fit(X)^M
# 现在我们可以使用 predict 方法了。对于正常值,它将返回 1;对于异常值,它将返回 -1。
cov.predict([[0, 0],[2, 2]])

输出

array([ 1, -1])

孤立森林

对于高维数据集,一种有效的异常值检测方法是使用随机森林。scikit-learn 提供了 ensemble.IsolationForest 方法,该方法通过随机选择一个特征来隔离观测值。之后,它会在所选特征的最大值和最小值之间随机选择一个值。

这里,隔离样本所需的分裂次数等于从根节点到终止节点的路径长度。

参数

下表列出了 sklearn.ensemble.IsolationForest 方法 − 使用的参数。

Sr.No 参数 &描述
1

n_estimators − int,可选,默认值 = 100

它表示集成中基础估计器的数量。

2

max_samples − int 或 float,可选,默认值 = "auto"

它表示从 X 中抽取的用于训练每个基础估计器的样本数量。如果我们选择 int 作为其值,它将抽取 max_samples 个样本。如果我们选择 float 作为其值,它将抽取 max_samples ∗ 𝑋.shape[0] 个样本。如果我们选择 auto 作为其值,它将绘制 max_samples = min(256,n_samples)。

3

support_fraction − 浮点数 (0., 1.),可选,默认值 = None

此参数指示方法在原始 MCD 估计值的支持度中包含多少比例的点。

4

contamination − auto 或浮点数,可选,默认值 = auto

它提供了数据集中异常值的比例。如果我们将其设置为默认值,即 auto,它将像原始论文中一样确定阈值。如果设置为浮点数,污染范围将在 [0,0.5] 范围内。

5

random_state − int,RandomState 实例或 None,可选,默认值 = none

此参数表示生成的伪随机数的种子,用于对数据进行混洗。以下是选项 −

  • int − 在本例中,random_state 是随机数生成器使用的种子。

  • RandomState 实例 −在本例中,random_state 是随机数生成器。

  • None − 在本例中,随机数生成器是 np.random 使用的 RandonState 实例。

6

max_features − int 或 float,可选(默认值 = 1.0)

它表示从 X 中提取的特征数量,用于训练每个基础估计器。如果选择 int 作为其值,它将提取 max_features 个特征。如果选择 float 作为其值,它将提取 max_features * X.shape[𝟏] 个样本。

7

bootstrap − 布尔值,可选(默认值 = False)

其默认选项为 False,表示将以非重复采样的方式进行。另一方面,如果设置为 True,则表示各个树将拟合在经过替换抽样的训练数据的随机子集上。

8

n_jobs − int 或 None,可选(默认值 = None)

它表示 fit() 和 predict() 方法并行运行的作业数。

9

verbose − int,可选(默认值 = 0)

此参数控制树构建过程的详细程度。

10

warm_start − Bool,可选(默认值 = False)

如果 warm_start = true,我们可以重用之前调用的解决方案进行拟合,并可以向集成中添加更多估计器。但如果设置为 false,则需要拟合一个全新的森林。

属性

下表包含 sklearn 使用的属性。 ensemble.IsolationForest 方法 −

Sr.No 属性和说明
1

estimators_ − DecisionTreeClassifier 列表

提供所有已拟合子估计器的集合。

2

max_samples_ −整数

它提供实际使用的样本数量。

3

offset_ − 浮点型

它用于根据原始分数定义决策函数。decision_function = score_samples -offset_

实现示例

以下 Python 脚本将使用 sklearn。 ensemble.IsolationForest 方法对给定数据拟合 10 棵树

from sklearn.ensemble import IsolationForest
import numpy as np
X = np.array([[-1, -2], [-3, -3], [-3, -4], [0, 0], [-50, 60]])
OUTDClf = IsolationForest(n_estimators = 10)
OUTDclf.fit(X)

输出

IsolationForest(
   behaviour = 'old', bootstrap = False, contamination='legacy',
   max_features = 1.0, max_samples = 'auto', n_estimators = 10, n_jobs=None,
   random_state = None, verbose = 0
)

局部离群因子

局部离群因子 (LOF) 算法是另一种在高维数据上执行离群值检测的有效算法。scikit-learn 提供了 neighbors.LocalOutlierFactor 方法,该方法计算一个称为局部离群因子的分数,该分数反映了观测值的异常程度。该算法的主要逻辑是检测密度明显低于其邻居的样本。因此,它测量给定数据点相对于其邻居的局部密度偏差。

参数

下表包含 sklearn.neighbors.LocalOutlierFactor 方法使用的参数

Sr.No 参数 &说明
1

n_neighbors − int,可选,默认值 = 20

表示 kneighbors 查询默认使用的邻居数量。如果 ,则所有样本都将被使用。

2

算法 −可选

使用哪种算法计算最近邻。

  • 如果选择 ball_tree,则使用 BallTree 算法。

  • 如果选择 kd_tree,则使用 KDTree 算法。

  • 如果选择 brute,则使用暴力搜索算法。

  • 如果选择 auto,则根据我们传递给 fit() 方法的值决定最合适的算法。

3

leaf_size − int,可选,默认值 = 30

此参数的值会影响构建和查询的速度。它还会影响存储树所需的内存。此参数会传递给 BallTree 或 KdTree 算法。

4

contamination − auto 或 float,可选,默认值 = auto

它提供了数据集中异常值的比例。如果我们将其设置为默认值,即 auto,它将像原始论文中一样确定阈值。如果设置为 float,则污染范围将在 [0,0.5] 范围内。

5

metric − 字符串或可调用函数,默认值

它表示用于距离计算的度量。

6

P − int,可选(默认值 = 2)

这是明可夫斯基度量的参数。P=1 相当于使用 manhattan_distance,即 L1,而 P=2 相当于使用 euclidean_distance,即 L2。

7

novelty − 布尔值,(默认值 = False)

默认情况下,LOF 算法用于异常值检测,但如果我们将 novelty 设置为 true,则可以将其用于新颖性检测。

8

n_jobs − int 或 None,可选(默认值 = None)

它表示 fit() 和 predict() 方法并行运行的作业数。

属性

下表包含 sklearn.neighbors.LocalOutlierFactor 方法 − 使用的属性。

Sr.No 属性和说明
1

negative_outlier_factor_ − numpy 数组,形状为 (n_samples,)

提供训练样本的反向 LOF。

2

n_neighbors_ − 整数

提供用于邻居查询的实际邻居数量。

3

offset_ −浮点型

用于根据原始分数定义二分类标签。

实现示例

下面给出的 Python 脚本将使用 sklearn.neighbors.LocalOutlierFactor 方法,从与我们的数据集对应的任何数组构建 NeighborsClassifier 类。

from sklearn.neighbors import NearestNeighbors
samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
LOFneigh = NearestNeighbors(n_neighbors = 1, algorithm = "ball_tree",p=1)
LOFneigh.fit(samples)

输出

NearestNeighbors(
   algorithm = 'ball_tree', leaf_size = 30, metric='minkowski',
   metric_params = None, n_jobs = None, n_neighbors = 1, p = 1, radius = 1.0
)

示例

现在,我们可以使用以下 Python 脚本 − 从这个构建的分类器中查询距离 [0.5, 1., 1.5] 最近的点。

print(neigh.kneighbors([[.5, 1., 1.5]])

输出

(array([[1.7]]), array([[1]], dtype = int64))

单类 SVM

Schölkopf 等人提出的单类 SVM 是一种无监督异常值检测方法。它在高维数据中也非常有效,并且可以估计高维分布的支持度。它实现于Sklearn.svm.OneClassSVM 对象中的 支持向量机 模块。定义边界需要一个核函数(最常用的是 RBF)和一个标量参数。

为了更好地理解,我们使用 svm.OneClassSVM 对象 − 来拟合数据。

示例

from sklearn.svm import OneClassSVM
X = [[0], [0.89], [0.90], [0.91], [1]]
OSVMclf = OneClassSVM(gamma = 'scale').fit(X)

现在,我们可以按如下方式获取输入数据的 score_samples −

OSVMclf.score_samples(X)

输出

array([1.12218594, 1.58645126, 1.58673086, 1.58645127, 1.55713767])