Spec-Zone.ru › scikit-learn

Примечание

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

Кривая компромисса ошибок обнаружения (DET)

В этом примере мы сравним две метрики бинарной классификации с несколькими порогами: рабочую характеристику приёмника (ROC) и компромисс ошибок обнаружения (DET). Для этого мы оценим два разных классификатора для одной и той же задачи классификации.

На кривых ROC по оси Y отложена доля истинно положительных результатов (TPR), а по оси X — доля ложноположительных результатов (FPR). Это означает, что верхний левый угол графика — «идеальная» точка: FPR равна нулю, а TPR — единице.

Кривые DET представляют собой разновидность кривых ROC, на которых вместо TPR по оси Y отложена доля ложноотрицательных результатов (FNR). В этом случае «идеальной» точкой является начало координат (нижний левый угол).

Примечание

  • Дополнительную информацию о кривых ROC см. в разделе sklearn.metrics.roc_curve.
  • Дополнительную информацию о кривых DET см. в разделе sklearn.metrics.det_curve.
  • Этот пример в общих чертах основан на примере Сравнение классификаторов.
  • Пример оценки дисперсии кривых ROC и ROC-AUC см. в разделе Рабочая характеристика приёмника (ROC) с перекрёстной проверкой.
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Генерация синтетических данных

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

X, y = make_classification(
    n_samples=1_000,
    n_features=2,
    n_redundant=0,
    n_informative=2,
    random_state=1,
    n_clusters_per_class=1,
)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=0)

Определение классификаторов

Здесь мы определим два разных классификатора. Цель — наглядно сравнить их статистические показатели при различных порогах с помощью кривых ROC и DET.

from sklearn.dummy import DummyClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline
from sklearn.svm import LinearSVC

classifiers = {
    "Linear SVM": make_pipeline(StandardScaler(), LinearSVC(C=0.025)),
    "Random Forest": RandomForestClassifier(
        max_depth=5, n_estimators=10, max_features=1, random_state=0
    ),
    "Non-informative baseline": DummyClassifier(),
}

Сравнение кривых ROC и DET

Кривые DET обычно строят в шкале нормальных отклонений. Для этого отображение DET преобразует показатели ошибок, возвращаемые функцией det_curve, а также шкалу осей с помощью scipy.stats.norm.

import matplotlib.pyplot as plt

from sklearn.dummy import DummyClassifier
from sklearn.metrics import DetCurveDisplay, RocCurveDisplay

fig, [ax_roc, ax_det] = plt.subplots(1, 2, figsize=(11, 5))

ax_roc.set_title("Receiver Operating Characteristic (ROC) curves")
ax_det.set_title("Detection Error Tradeoff (DET) curves")

ax_roc.grid(linestyle="--")
ax_det.grid(linestyle="--")

for name, clf in classifiers.items():
    (color, linestyle) = (
        ("black", "--") if name == "Non-informative baseline" else (None, None)
    )
    clf.fit(X_train, y_train)
    RocCurveDisplay.from_estimator(
        clf,
        X_test,
        y_test,
        ax=ax_roc,
        name=name,
        curve_kwargs=dict(color=color, linestyle=linestyle),
    )
    DetCurveDisplay.from_estimator(
        clf, X_test, y_test, ax=ax_det, name=name, color=color, linestyle=linestyle
    )

plt.legend()
plt.show()
Receiver Operating Characteristic (ROC) curves, Detection Error Tradeoff (DET) curves

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

Кривые DET напрямую показывают компромисс ошибок обнаружения и помогают анализировать рабочую точку. Пользователь может решить, какой уровень FNR он готов принять в обмен на FPR (или наоборот).

Базовый уровень неинформативного классификатора для кривых ROC и DET

Чёрные пунктирные диагональные линии на графиках выше соответствуют DummyClassifier, использующему стратегию «prior» по умолчанию, и служат базовым уровнем для сравнения с другими классификаторами. Этот классификатор делает постоянные предсказания, независимые от входных признаков в X, поэтому он является неинформативным.

Чтобы лучше понять базовый уровень неинформативного классификатора для кривых ROC и DET, напомним следующие математические определения:

\(\text{FPR} = \frac{\text{FP}}{\text{FP} + \text{TN}}\)

\(\text{FNR} = \frac{\text{FN}}{\text{TP} + \text{FN}}\)

\(\text{TPR} = \frac{\text{TP}}{\text{TP} + \text{FN}}\)

Классификатор, который всегда предсказывает положительный класс, не будет иметь ни истинно отрицательных, ни ложно отрицательных предсказаний, что даёт \(\text{FPR} = \text{TPR} = 1\) и \(\text{FNR} = 0\), то есть:

  • одна точка в верхнем правом углу плоскости ROC,
  • одна точка в нижнем правом углу плоскости DET.

Аналогично, классификатор, который всегда предсказывает отрицательный класс, не будет иметь ни истинно положительных, ни ложно положительных предсказаний, поэтому \(\text{FPR} = \text{TPR} = 0\) и \(\text{FNR} = 1\), то есть:

  • одна точка в нижнем левом углу плоскости ROC,
  • одна точка в верхнем левом углу плоскости DET.

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_det.ipynb

Download Python source code: plot_det.py

Download zipped: plot_det.zip

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

Рабочая характеристика приёмника (ROC) с перекрёстной проверкой

Многоклассовая рабочая характеристика приёмника (ROC)

Кривая ROC с API визуализации

Визуализация с помощью объектов отображения

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

Spec-Zone.ru

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