Spec-Zone.ru › scikit-learn

Примечание

Перейти к концу для загрузки полного примера кода. или для запуска этого примера в вашем браузере через JupyterLite или Binder

Обнаружение новизны с помощью алгоритма LOF (Local Outlier Factor)

Алгоритм LOF (Local Outlier Factor) — это метод обнаружения аномалий, не требующий учителя, который вычисляет локальное отклонение плотности заданной точки данных по отношению к её соседям. В качестве аномалий он рассматривает образцы, плотность которых существенно ниже плотности их соседей. Этот пример демонстрирует, как использовать LOF для обнаружения новизны. Обратите внимание, что при использовании LOF для обнаружения новизны НЕЛЬЗЯ использовать методы predict, decision_function и score_samples на наборе обучения, так как это приведёт к неправильным результатам. Эти методы необходимо использовать только на новых, невиденных данных (которые не входят в набор обучения). См. Руководство пользователя для получения подробной информации о различиях между обнаружением выбросов и обнаружением новизны, а также о том, как использовать LOF для обнаружения выбросов.

Количество учитываемых соседей (параметр n_neighbors) обычно устанавливается 1) больше минимального числа образцов в кластере, чтобы другие образцы могли быть локальными выбросами по отношению к этому кластеру, и 2) меньше максимального количества близлежащих образцов, которые потенциально могут быть локальными выбросами. На практике такая информация обычно недоступна, и установка n_neighbors=20, как правило, работает хорошо.

Novelty Detection with LOF
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

import matplotlib
import matplotlib.lines as mlines
import matplotlib.pyplot as plt
import numpy as np

from sklearn.neighbors import LocalOutlierFactor

np.random.seed(42)

xx, yy = np.meshgrid(np.linspace(-5, 5, 500), np.linspace(-5, 5, 500))
# Generate normal (not abnormal) training observations
X = 0.3 * np.random.randn(100, 2)
X_train = np.r_[X + 2, X - 2]
# Generate new normal (not abnormal) observations
X = 0.3 * np.random.randn(20, 2)
X_test = np.r_[X + 2, X - 2]
# Generate some abnormal novel observations
X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))

# fit the model for novelty detection (novelty=True)
clf = LocalOutlierFactor(n_neighbors=20, novelty=True, contamination=0.1)
clf.fit(X_train)
# DO NOT use predict, decision_function and score_samples on X_train as this
# would give wrong results but only on new unseen data (not used in X_train),
# e.g. X_test, X_outliers or the meshgrid
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)
n_error_test = y_pred_test[y_pred_test == -1].size
n_error_outliers = y_pred_outliers[y_pred_outliers == 1].size

# plot the learned frontier, the points, and the nearest vectors to the plane
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.title("Novelty Detection with LOF")
plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), 0, 7), cmap=plt.cm.PuBu)
a = plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors="darkred")
plt.contourf(xx, yy, Z, levels=[0, Z.max()], colors="palevioletred")

s = 40
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c="white", s=s, edgecolors="k")
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c="blueviolet", s=s, edgecolors="k")
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c="gold", s=s, edgecolors="k")
plt.axis("tight")
plt.xlim((-5, 5))
plt.ylim((-5, 5))
plt.legend(
    [mlines.Line2D([], [], color="darkred"), b1, b2, c],
    [
        "learned frontier",
        "training observations",
        "new regular observations",
        "new abnormal observations",
    ],
    loc="upper left",
    prop=matplotlib.font_manager.FontProperties(size=11),
)
plt.xlabel(
    "errors novel regular: %d/40 ; errors novel abnormal: %d/40"
    % (n_error_test, n_error_outliers)
)
plt.show()

Общее время выполнения сценария: (0 минут 0,758 секунд)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_lof_novelty_detection.ipynb

Download Python source code: plot_lof_novelty_detection.py

Download zipped: plot_lof_novelty_detection.zip

Связанные примеры

Обнаружение выбросов с помощью алгоритма LOF (Local Outlier Factor)

Одноклассовая SVM с нелинейным ядром (RBF)

Сравнение алгоритмов обнаружения аномалий для обнаружения выбросов на наборах данных игрушечного типа

Одноклассовая SVM по сравнению с одноклассовой SVM, использующей стохастический градиентный спуск

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/neighbors/plot_lof_novelty_detection.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API