Scikit Learn - 异常检测



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

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

  • 点异常 - 当单个数据实例相对于其余数据被认为是异常时发生。

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

  • 集体异常 - 当一系列相关数据实例相对于整个数据集而不是单个值而言是异常时发生。

方法

可以使用两种方法,即离群点检测新奇性检测,进行异常检测。有必要了解它们之间的区别。

离群点检测

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

新奇性检测

它关注的是检测训练数据中未包含的新观察值中的未观察到的模式。在这里,训练数据没有被离群点污染。它也称为半监督异常检测。

Scikit-learn 提供了一组 ML 工具,可用于离群点检测和新奇性检测。这些工具首先通过使用 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方法使用的参数:

序号 参数及描述
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方法使用的属性:

序号 属性及描述
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 * 𝑋.shape[0] 个样本。如果我们选择 auto 作为其值,它将抽取 max_samples = min(256, n_samples)。

3

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

此参数告诉方法有多少比例的点应包含在原始 MCD 估计的支持中。

4

contamination - auto 或 float,可选,默认值 = 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 - 布尔值,可选(默认值 = False)

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

属性

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

序号 属性及描述
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方法使用的参数:

序号 参数及描述
1

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

它表示默认情况下 kneighbors 查询使用的邻居数量。如果使用 .,则将使用所有样本。

2

algorithm - 可选

用于计算最近邻居的算法。

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

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

  • 如果选择 brute,它将使用蛮力搜索算法。

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

3

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

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

4

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

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

5

metric - 字符串或可调用对象,默认值

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

6

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

它是 Minkowski 度量的参数。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方法使用的属性:

序号 属性及描述
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

一类SVM由Schölkopf等人提出,是一种无监督的异常检测方法。它在高维数据中也非常高效,并且可以估计高维分布的支持向量。它在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])
广告