Scikit Learn - 异常检测


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

异常检测是一种用于识别数据集中与其余数据不太吻合的数据点的技术。它在商业中有许多应用,例如欺诈检测、入侵检测、系统健康监控、监视和预测性维护。异常,也称为异常值,可以分为以下三类 -

  • 点异常- 当单个数据实例被认为与其余数据相比异常时,就会发生这种情况。

  • 上下文异常- 这种异常是特定于上下文的。如果数据实例在特定上下文中异常,就会发生这种情况。

  • 集体异常- 当相关数据实例的集合对于整个数据集而不是单个值异常时,就会发生这种情况。

方法

异常检测可以使用两种方法,即异常值检测新颖性检测。有必要看看它们之间的区别。

异常值检测

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

新颖性检测

它涉及检测新观察中未观察到的模式,该模式未包含在训练数据中。在这里,训练数据没有受到异常值的污染。它也称为半监督异常检测。

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

estimator.fit(X_train)

现在,通过使用 Predict() 方法将新观测值排序为内值(标记为 1)离群值(标记为 -1),如下所示 -

estimator.fit(X_test)

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

我们还可以定义Decision_function方法,将异常值定义为负值,将内部值定义为非负值。

estimator.decision_function(X_test)

用于异常值检测的 Sklearn 算法

让我们首先了解什么是椭圆包络。

拟合椭圆包络线

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

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

参数

下表包含 sklearn 使用的参数。covariance.EllipticEnvelop方法 -

先生编号 参数及说明
1

store_ precision - 布尔值,可选,默认 = True

如果存储了估计的精度,我们可以指定它。

2

假设_centered - 布尔值,可选,默认 = False

如果我们将其设置为 False,它将借助 FastMCD 算法直接计算鲁棒位置和协方差。另一方面,如果设置为 True,它将计算鲁棒位置和协变量的支持。

3

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

该参数告诉该方法要包含多少比例的点来支持原始 MCD 估计。

4

污染- 浮动在 (0., 1.) 中,可选,默认 = 0.1

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

5

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

该参数表示在混洗数据时使用的生成的伪随机数的种子。以下是选项 -

  • int - 在这种情况下,random_state是随机数生成器使用的种子。

  • RandomState 实例- 在这种情况下,random_state是随机数生成器。

  • None - 在这种情况下,随机数生成器是 np.random 使用的 RandonState 实例。

属性

下表包含 sklearn 使用的属性。covariance.EllipticEnvelop方法 -

先生编号 属性和描述
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
# Now we can use predict method. It will return 1 for an inlier and -1 for an outlier.
cov.predict([[0, 0],[2, 2]])

输出

array([ 1, -1])

隔离森林

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

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

参数

下表包含 sklearn 使用的参数。ensemble.IsolationForest方法 -

先生编号 参数及说明
1

n_estimators - int,可选,默认 = 100

它表示集合中基本估计器的数量。

2

max_samples - int 或 float,可选,默认=“auto”

它表示从 X 中抽取用于训练每个基本估计器的样本数量。如果我们选择 int 作为其值,它将抽取 max_samples 个样本。如果我们选择float作为它的值,它将绘制max_samples *