📜  Scikit学习-异常检测(1)

📅  最后修改于: 2023-12-03 14:47:18.277000             🧑  作者: Mango

Scikit-learn 异常检测

Scikit-learn 是 Python 中重要的机器学习库之一,它提供了许多强大的工具来进行数据挖掘和模型构建。在 Scikit-learn 中,异常检测是一个非常有用的技术,它可以用于发现数据集中的异常观测值。本文将介绍 Scikit-learn 中的异常检测技术,并提供相关的代码示例。

异常检测

异常检测是指在数据集中寻找与其他数据点非常不同或独特的数据点的过程。异常检测可以分为两类:有监督异常检测和无监督异常检测。

有监督异常检测需要训练一个模型来学习正常数据点,然后使用该模型预测未来观测值是否是异常值。例如,在分类问题中,我们可以将未标记的输入数据点预测为与诸如 SVM 或随机森林之类的分类器中的已标记类别不同的类别。这种方法需要已经具有标签的数据集,并且较少用于异常检测。

无监督异常检测是寻找与其他数据点非常不同或独特的数据点的过程。互相区分有两种:基于概率的方法和基于距离的方法。基于概率的方法假设正常数据符合某种分布或模型,并将不符合该模型的数据点视为异常。基于距离的方法根据两个数据点之间的距离将每个点分配到正常或异常类。

在 Scikit-learn 中进行异常检测

Scikit-learn 提供了多种无监督异常检测方法。以下是其中的一些:

1. 局部离群因子(Local Outlier Factor, LOF)

局部离群因子是一种基于密度的方法,它的思想是在局部邻域内计算每个数据点的密度,并将密度相对较小的点标记为异常值。 它可以在高维数据中有效地找到局部异常值。

from sklearn.neighbors import LocalOutlierFactor
import numpy as np

# 创建一个随机数据集
X = np.random.randn(100, 2)

# 创建一个包含异常数据的数据集
X_with_outliers = np.vstack([X, np.array([[10, 10], [-10, -10]])])

# 训练 LOF 模型来识别异常值
clf = LocalOutlierFactor(n_neighbors=20)
y_pred = clf.fit_predict(X_with_outliers)

# 标记正常数据和异常数据
normal = y_pred == 1
abnormal = y_pred == -1

# 绘制结果
import matplotlib.pyplot as plt
plt.scatter(X_with_outliers[normal][:, 0], X_with_outliers[normal][:, 1], c='blue')
plt.scatter(X_with_outliers[abnormal][:, 0], X_with_outliers[abnormal][:, 1], c='red')
plt.show()

这将生成一个散点图,其中红色点表示异常值,蓝色点表示正常值。

2. 孤立森林(Isolation Forest)

孤立森林是一种快速高效的异常检测算法,它基于随机森林。 它通过对数据进行随机切分并比较切分的次数来计算数据点的异常分数。 异常分数越低表示越异常。

from sklearn.ensemble import IsolationForest

# 创建一个随机数据集
X = np.random.randn(100, 2)

# 创建一个包含异常数据的数据集
X_with_outliers = np.vstack([X, np.array([[10, 10], [-10, -10]])])

# 训练孤立森林模型来识别异常值
clf = IsolationForest(max_samples=100, random_state=42)
clf.fit(X_with_outliers)
y_pred = clf.predict(X_with_outliers)

# 标记正常数据和异常数据
normal = y_pred == 1
abnormal = y_pred == -1

# 绘制结果
import matplotlib.pyplot as plt
plt.scatter(X_with_outliers[normal][:, 0], X_with_outliers[normal][:, 1], c='blue')
plt.scatter(X_with_outliers[abnormal][:, 0], X_with_outliers[abnormal][:, 1], c='red')
plt.show()

孤立森林的输出与 LOF 相同,如果点是异常值,则输出为-1。

3. 单类 SVM

单类 SVM 是一种基于支持向量机的方法,它将标记为正常数据的样本看做是样本空间中的一个紧密包围,并且将其余的点视为异常。 如果一个新的数据点距离这个包围很远,那么就会被标记为异常值。

from sklearn.svm import OneClassSVM

# 创建一个随机数据集
X = np.random.randn(100, 2)

# 创建一个包含异常数据的数据集
X_with_outliers = np.vstack([X, np.array([[10, 10], [-10, -10]])])

# 训练单类 SVM 模型来识别异常值
clf = OneClassSVM(gamma='auto')
clf.fit(X_with_outliers)
y_pred = clf.predict(X_with_outliers)

# 标记正常数据和异常数据
normal = y_pred == 1
abnormal = y_pred == -1

# 绘制结果
import matplotlib.pyplot as plt
plt.scatter(X_with_outliers[normal][:, 0], X_with_outliers[normal][:, 1], c='blue')
plt.scatter(X_with_outliers[abnormal][:, 0], X_with_outliers[abnormal][:, 1], c='red')
plt.show()

这将生成一个散点图,其中红色点表示异常值,蓝色点表示正常值。

结论

在 Scikit-learn 中,有多种无监督方法来识别异常值。 这些方法在寻找与其他数据点非常不同或独特的数据点方面很有用。它们中的许多方法(例如孤立森林)也可以应用于异常值检测以外的许多领域。