Примечание
Перейти в конец чтобы скачать полный пример кода или запустить этот пример в браузере через JupyterLite или Binder.
Обнаружение выбросов с помощью фактора локальных выбросов (LOF)#
Алгоритм Local Outlier Factor (LOF) — это метод обнаружения аномалий без учителя, который вычисляет отклонение локальной плотности данной точки данных относительно её соседей. Он считает выбросами выборки, которые имеют существенно более низкую плотность, чем их соседи. Этот пример показывает, как использовать LOF для обнаружения выбросов, что является стандартным случаем использования этого оценщика в scikit-learn. Обратите внимание, что когда LOF используется для обнаружения выбросов, он не имеет
predict, decision_function и score_samples методы. См. Руководство пользователя для подробностей о разнице между обнаружением
выбросов и обнаружением новизны и как использовать LOF для обнаружения новизны.
Количество рассматриваемых соседей (параметр n_neighbors) обычно устанавливается 1) больше минимального количества образцов, которое должен содержать кластер, чтобы другие образцы могли быть локальными выбросами относительно этого кластера, и 2) меньше максимального количества близлежащих образцов, которые потенциально могут быть локальными выбросами. На практике такая информация обычно недоступна, и выбор
n_neighbors=20 кажется, хорошо работает в целом.
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
Сгенерировать данные с выбросами#
import numpy as np
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]
n_outliers = len(X_outliers)
ground_truth = np.ones(len(X), dtype=int)
ground_truth[-n_outliers:] = -1
Обучить модель для обнаружения выбросов (по умолчанию)#
Используйте fit_predict для вычисления предсказанных меток обучающих выборок (когда LOF используется для обнаружения выбросов, оценщик не имеет predict,
decision_function и score_samples методы).
from sklearn.neighbors import LocalOutlierFactor
clf = LocalOutlierFactor(n_neighbors=20, contamination=0.1)
y_pred = clf.fit_predict(X)
n_errors = (y_pred != ground_truth).sum()
X_scores = clf.negative_outlier_factor_
Построить результаты#
import matplotlib.pyplot as plt
from matplotlib.legend_handler import HandlerPathCollection
def update_legend_marker_size(handle, orig):
"Customize size of the legend marker"
handle.update_from(orig)
handle.set_sizes([20])
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("prediction errors: %d" % (n_errors))
plt.legend(
handler_map={scatter: HandlerPathCollection(update_func=update_legend_marker_size)}
)
plt.title("Local Outlier Factor (LOF)")
plt.show()

Общее время выполнения скрипта: (0 минут 0.066 секунд)
Связанные примеры
Обнаружение новизны с помощью локального фактора выбросов (LOF)
Сравнение алгоритмов обнаружения аномалий для выявления выбросов на игрушечных наборах данных