Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере через JupyterLite или Binder.
Обнаружение выбросов с помощью локального фактора выбросов (LOF)
Алгоритм локального фактора выбросов (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.075 секунды)
Связанные примеры
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/neighbors/plot_lof_outlier_detection.html