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

В этом примере мы сравниваем две бинарные классификационные метрики с несколькими порогами: Receiver Operating Characteristic (ROC) и Detection Error Tradeoff (DET). Для этого мы оцениваем два разных классификатора для одной и той же задачи классификации.

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

Кривые DET являются вариацией кривых ROC, где на оси y отображается Частота Ложных Отрицаний (FNR) вместо TPR. В этом случае начало координат (нижний левый угол) является "идеальной" точкой.

Примечание

# 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.207 секунд)

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

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

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

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

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

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

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

Визуализации с объектами Display

Визуализации с объектами Display

Галерея, созданная Sphinx-Gallery