Spec-Zone.ru › scikit-learn

Примечание

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

Обнаружение выбросов на реальном наборе данных

В этом примере показана необходимость использования устойчивой оценки ковариации на реальном наборе данных. Она полезна как для обнаружения выбросов, так и для лучшего понимания структуры данных.

Мы выбрали два набора из двух переменных из набора данных Wine, чтобы проиллюстрировать, какой вид анализа можно провести с помощью нескольких инструментов обнаружения выбросов. В целях визуализации мы работаем с двумерными примерами, но следует иметь в виду, что в многомерном случае ситуация не так тривиальна, как это будет показано.

В обоих примерах ниже основной результат заключается в том, что эмпирическая оценка ковариации, как неустойчивая, сильно зависит от неоднородной структуры наблюдений. Хотя устойчивая оценка ковариации способна сосредоточиться на основном режиме распределения данных, она придерживается предположения, что данные должны быть распределены по Гауссу, что приводит к некоторой смещенной оценке структуры данных, но тем не менее в некоторой степени точной. One-Class SVM не предполагает никакой параметрической формы распределения данных и, следовательно, может моделировать сложную форму данных намного лучше.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Первый пример

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

from sklearn.covariance import EllipticEnvelope
from sklearn.inspection import DecisionBoundaryDisplay
from sklearn.svm import OneClassSVM

estimators = {
    "Empirical Covariance": EllipticEnvelope(support_fraction=1.0, contamination=0.25),
    "Robust Covariance (Minimum Covariance Determinant)": EllipticEnvelope(
        contamination=0.25
    ),
    "OCSVM": OneClassSVM(nu=0.25, gamma=0.35),
}
import matplotlib.lines as mlines
import matplotlib.pyplot as plt

from sklearn.datasets import load_wine

X = load_wine()["data"][:, [1, 2]]  # two clusters

fig, ax = plt.subplots()
colors = ["tab:blue", "tab:orange", "tab:red"]
# Learn a frontier for outlier detection with several classifiers
legend_lines = []
for color, (name, estimator) in zip(colors, estimators.items()):
    estimator.fit(X)
    DecisionBoundaryDisplay.from_estimator(
        estimator,
        X,
        response_method="decision_function",
        plot_method="contour",
        levels=[0],
        colors=color,
        ax=ax,
    )
    legend_lines.append(mlines.Line2D([], [], color=color, label=name))


ax.scatter(X[:, 0], X[:, 1], color="black")
bbox_args = dict(boxstyle="round", fc="0.8")
arrow_args = dict(arrowstyle="->")
ax.annotate(
    "outlying points",
    xy=(4, 2),
    xycoords="data",
    textcoords="data",
    xytext=(3, 1.25),
    bbox=bbox_args,
    arrowprops=arrow_args,
)
ax.legend(handles=legend_lines, loc="upper center")
_ = ax.set(
    xlabel="ash",
    ylabel="malic_acid",
    title="Outlier detection on a real data set (wine recognition)",
)
Outlier detection on a real data set (wine recognition)

Второй пример

Второй пример демонстрирует способность устойчивого оценщика минимальной ковариационной детерминанты ковариации сосредоточиться на основном режиме распределения данных: расположение, по-видимому, оценивается хорошо, хотя ковариация трудно оценивается из-за бананообразного распределения. Тем не менее, мы можем избавиться от некоторых выбросов. One-Class SVM способен уловить реальную структуру данных, но сложность заключается в корректировке параметра ширины ядра, чтобы получить хорошее компромиссное решение между формой матрицы рассеяния данных и риском переобучения данных.

X = load_wine()["data"][:, [6, 9]]  # "banana"-shaped

fig, ax = plt.subplots()
colors = ["tab:blue", "tab:orange", "tab:red"]
# Learn a frontier for outlier detection with several classifiers
legend_lines = []
for color, (name, estimator) in zip(colors, estimators.items()):
    estimator.fit(X)
    DecisionBoundaryDisplay.from_estimator(
        estimator,
        X,
        response_method="decision_function",
        plot_method="contour",
        levels=[0],
        colors=color,
        ax=ax,
    )
    legend_lines.append(mlines.Line2D([], [], color=color, label=name))


ax.scatter(X[:, 0], X[:, 1], color="black")
ax.legend(handles=legend_lines, loc="upper center")
ax.set(
    xlabel="flavanoids",
    ylabel="color_intensity",
    title="Outlier detection on a real data set (wine recognition)",
)

plt.show()
Outlier detection on a real data set (wine recognition)

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_outlier_detection_wine.ipynb

Download Python source code: plot_outlier_detection_wine.py

Download zipped: plot_outlier_detection_wine.zip

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

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

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

Линейный и квадратичный дискриминантный анализ с эллипсом ковариации

Устойчивая оценка ковариации против эмпирической оценки

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

Spec-Zone.ru

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