Кривая权衡 ошибок обнаружения

Machine LearningMachine LearningBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом руководстве мы узнаем о кривых权衡 ошибок обнаружения (DET) и сравним их с кривыми характеристик приемника (ROC). Кривые DET - это вариант кривых ROC, где на оси y откладывается доля ложноотрицательных результатов (FNR) вместо доли истинноположительных результатов (TPR). Мы будем использовать scikit - learn, популярную библиотеку Python для машинного обучения, для генерации синтетических данных и сравнения статистической производительности двух классификаторов по разным порогам с использованием кривых ROC и DET.

Советы по работе с ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из - за ограничений в Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/ensemble("Ensemble Methods") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/pipeline("Pipeline") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/metrics("Metrics") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/ensemble -.-> lab-49103{{"Кривая权衡 ошибок обнаружения"}} sklearn/svm -.-> lab-49103{{"Кривая权衡 ошибок обнаружения"}} sklearn/preprocessing -.-> lab-49103{{"Кривая权衡 ошибок обнаружения"}} sklearn/pipeline -.-> lab-49103{{"Кривая权衡 ошибок обнаружения"}} sklearn/model_selection -.-> lab-49103{{"Кривая权衡 ошибок обнаружения"}} sklearn/metrics -.-> lab-49103{{"Кривая权衡 ошибок обнаружения"}} sklearn/datasets -.-> lab-49103{{"Кривая权衡 ошибок обнаружения"}} ml/sklearn -.-> lab-49103{{"Кривая权衡 ошибок обнаружения"}} end

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

Мы будем использовать функцию make_classification из scikit - learn для генерации синтетических данных. Эта функция генерирует случайную задачу классификации на n классов, с n_informative информативными признаками, n_redundant избыточными признаками и n_clusters_per_class кластерами для каждого класса. Мы сгенерируем 1000 образцов с 2 информативными признаками и случайным состоянием 1. Затем мы разделим данные на обучающую и тестовую выборки в соотношении 60/40.

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. Мы будем использовать функцию make_pipeline из scikit - learn для создания конвейера, который масштабирует данные с использованием StandardScaler и обучает классификатор LinearSVC. Мы также будем использовать класс RandomForestClassifier из scikit - learn для обучения случайного леса с максимальной глубиной 5, 10 оценщиками и максимумом 1 признака.

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, dual="auto")),
    "Random Forest": RandomForestClassifier(
        max_depth=5, n_estimators=10, max_features=1
    ),
}

Построение кривых ROC и DET

Мы будем использовать классы RocCurveDisplay и DetCurveDisplay из scikit - learn для построения кривых ROC и DET соответственно. Функция RocCurveDisplay.from_estimator вычисляет кривую ROC и рисует ее на заданной оси. Аналогично, функция DetCurveDisplay.from_estimator вычисляет кривую DET и рисует ее на заданной оси. Мы создадим два подграфика, один для кривых ROC и другой для кривых DET, и построим кривые для каждого классификатора.

import matplotlib.pyplot as plt
from sklearn.metrics import DetCurveDisplay, RocCurveDisplay

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

for name, clf in classifiers.items():
    clf.fit(X_train, y_train)

    RocCurveDisplay.from_estimator(clf, X_test, y_test, ax=ax_roc, name=name)
    DetCurveDisplay.from_estimator(clf, X_test, y_test, ax=ax_det, name=name)

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="--")

plt.legend()
plt.show()

Интерпретация результатов

Визуально оценить общую производительность различных алгоритмов классификации проще с использованием кривых DET, чем с использованием кривых ROC. Кривые DET дают прямую обратную связь о权衡 ошибок обнаружения для помощи в анализе точки работы. Затем пользователь может определить FNR, который он готов принять, жертвуя FPR (или наоборот).

Резюме

В этом уроке мы узнали о кривых权衡 ошибок обнаружения (DET) и сравнили их с кривыми Receiver Operating Characteristic (ROC). Мы использовали scikit - learn для генерации синтетических данных и сравнения статистической производительности двух классификаторов по разным порогам с использованием кривых ROC и DET. Кривые DET - это вариант кривых ROC, где на оси y откладывается False Negative Rate (FNR) вместо True Positive Rate (TPR). Кривые DET дают прямую обратную связь о权衡 ошибок обнаружения для помощи в анализе точки работы, что делает их полезным инструментом для оценки производительности алгоритмов классификации.