Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью 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()

Обратите внимание, что с помощью кривых 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 секунды)
Связанные примеры
© 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