使用 LOF 进行异常值检测

Beginner

This tutorial is from open-source community. Access the source code

简介

局部离群因子(Local Outlier Factor,LOF)算法是一种无监督机器学习方法,用于检测数据中的异常值。它计算给定数据点相对于其邻居的局部密度偏差,并将密度远低于其邻居的样本视为离群值。

在本实验中,我们将使用 LOF 来检测数据集中的离群值。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入库

我们将分别导入 numpymatplotlib 用于数据处理和可视化。我们还将从 sklearn.neighbors 中导入 LocalOutlierFactor 用于异常值检测。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import LocalOutlierFactor

生成带有异常值的数据

我们将生成一个包含 120 个数据点的数据集,其中有 100 个内点和 20 个异常值。然后我们将绘制这些数据以直观显示异常值。

np.random.seed(42)

X_inliers = 0.3 * np.random.randn(100, 2)
X_inliers = np.r_[X_inliers + 2, X_inliers - 2]
X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))
X = np.r_[X_inliers, X_outliers]

plt.scatter(X[:, 0], X[:, 1], color="k", s=3.0)
plt.axis("tight")
plt.xlim((-5, 5))
plt.ylim((-5, 5))
plt.xlabel("Data points")
plt.title("Data with Outliers")
plt.show()

拟合用于异常值检测的模型

我们将使用 LocalOutlierFactor 来拟合用于异常值检测的模型,并计算训练样本的预测标签。

clf = LocalOutlierFactor(n_neighbors=20, contamination=0.1)
y_pred = clf.fit_predict(X)
X_scores = clf.negative_outlier_factor_

绘制结果

我们将绘制数据点,并使用半径与异常值分数成正比的圆圈来表示。

plt.scatter(X[:, 0], X[:, 1], color="k", s=3.0, label="Data points")
## plot circles with radius proportional to the outlier scores
radius = (X_scores.max() - X_scores) / (X_scores.max() - X_scores.min())
scatter = plt.scatter(
    X[:, 0],
    X[:, 1],
    s=1000 * radius,
    edgecolors="r",
    facecolors="none",
    label="Outlier scores",
)
plt.axis("tight")
plt.xlim((-5, 5))
plt.ylim((-5, 5))
plt.xlabel("Outlier Detection")
plt.legend(
    handler_map={scatter: HandlerPathCollection(update_func=update_legend_marker_size)}
)
plt.title("Local Outlier Factor (LOF)")
plt.show()

总结

在本实验中,我们学习了如何使用局部离群因子(Local Outlier Factor,简称 LOF)进行异常值检测。我们生成了一个包含异常值的数据集,拟合了异常值检测模型,并绘制了结果。LOF 是一种强大的无监督机器学习方法,可用于在广泛的应用中检测异常。