使用 LOF 进行异常值检测

Machine LearningMachine LearningBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

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

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

虚拟机使用提示

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/neighbors("Nearest Neighbors") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/neighbors -.-> lab-49201{{"使用 LOF 进行异常值检测"}} ml/sklearn -.-> lab-49201{{"使用 LOF 进行异常值检测"}} end

导入库

我们将分别导入 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 是一种强大的无监督机器学习方法,可用于在广泛的应用中检测异常。