Spec-Zone.ru › scikit-learn

Примечание

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

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

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

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

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

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

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

В первом примере показано, как устойчивый оцениватель Minimum Covariance Determinant помогает сосредоточиться на значимом кластере при наличии выбросов. В этом случае оценка эмпирической ковариации смещается из-за точек за пределами основного кластера. Конечно, некоторые методы предварительного анализа выявили бы наличие двух кластеров (машины опорных векторов, модели гауссовых смесей, одномерное обнаружение выбросов и т. д.). Но если бы пример был многомерным, применить эти методы было бы не так просто.

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)

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

Во втором примере показана способность устойчивого оценивателя ковариации Minimum Covariance Determinant сосредоточиться на основной моде распределения данных: положение, по-видимому, оценено хорошо, хотя ковариацию трудно оценить из-за распределения банановидной формы. Тем не менее нам удаётся отсеять некоторые выбросы. Одноклассовый 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.413 секунды)

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

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

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

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

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

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

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

Spec-Zone.ru

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