Примечание
Перейти в конец чтобы скачать полный пример кода или запустить этот пример в браузере через JupyterLite или Binder.
Кривая компромисса ошибок обнаружения (DET)#
В этом примере мы сравниваем две бинарные классификационные метрики с несколькими порогами: Receiver Operating Characteristic (ROC) и Detection Error Tradeoff (DET). Для этого мы оцениваем два разных классификатора для одной и той же задачи классификации.
ROC-кривые показывают долю истинно положительных (TPR) по оси Y и долю ложноположительных (FPR) по оси X. Это означает, что верхний левый угол графика является «идеальной» точкой — FPR равен нулю, а TPR равен единице.
Кривые DET являются вариацией кривых ROC, где на оси y отображается Частота Ложных Отрицаний (FNR) вместо TPR. В этом случае начало координат (нижний левый угол) является "идеальной" точкой.
Примечание
См.
sklearn.metrics.roc_curveдля дополнительной информации о кривых ROC.См.
sklearn.metrics.det_curveдля дополнительной информации о кривых DET.Этот пример частично основан на Сравнение классификаторов пример.
См. Рабочая характеристика приёмника (ROC) с перекрёстной проверкой для примера оценки дисперсии ROC-кривых и ROC-AUC.
# 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.207 секунд)
Связанные примеры
Рабочая характеристика приёмника (ROC) с перекрёстной проверкой
Многоклассовая рабочая характеристика приемника (ROC)