ROC AUC, average precision и пороги: задача Python

Один порог даёт матрицу ошибок, а ROC AUC и average precision оценивают ранжирование по всем исходным скорам. Рассчитайте оба уровня оценки и обработайте порог без положительных предсказаний.

Программа курса «Классическое машинное обучение: алгоритмы и практика на Python».

Оценка исходов по порогам и интегральное качество ранжирования

Что уже дано

Проверяющая система выполняет решение в среде Python 3.12 с библиотеками numpy и scikit-learn. Никаких вспомогательных глобальных переменных, файлов или подготовленных датасетов перед запуском решения не создаётся. Проверяющие тесты напрямую импортируют и вызывают функцию evaluate_ranking_thresholds.

Что нужно сделать

Реализуйте функцию evaluate_ranking_thresholds(y_true, scores, thresholds).

Функция принимает:

  • y_true: одномерный массив или последовательность бинарных меток классов (строго 0 и 1), гарантированно содержащая хотя бы один объект каждого класса;
  • scores: одномерный массив или последовательность конечных вещественных скоров модели той же длины, где большее значение отражает уверенность в классе 1;
  • thresholds: список или одномерная последовательность вещественных чисел — исследуемые пороги классификации.

Требования к расчётам:

  1. Для каждого порога из thresholds объект относится к положительному классу , если , и к классу иначе.
  2. Для каждого порога рассчитайте целочисленные количества четырёх исходов: TP, FP, FN, TN (типа int), а также вещественные метрики precision, recall и FPR (типа float).
  3. Если при данном пороге модель не выдала ни одного положительного предсказания (), установите precision = 0.0 согласно оговорённой конвенции zero_division=0.
  4. Для всей выборки по исходным непрерывным значениям scores рассчитайте интегральные метрики качества ранжирования:
  • roc_auc: площадь под ROC-кривой через sklearn.metrics.roc_auc_score либо эквивалентный математический расчёт с корректным разрешением ничьих скоров;
  • average_precision: средняя точность через sklearn.metrics.average_precision_score либо эквивалентное ступенчатое взвешивание с группировкой ничьих (запрещено использовать неверное трапециевидное интегрирование).
  1. Функция возвращает словарь dict строго следующей структуры:
    {
        "threshold_metrics": [
            {
                "threshold": float(t),
                "TP": int(...),
                "FP": int(...),
                "FN": int(...),
                "TN": int(...),
                "precision": float(...),
                "recall": float(...),
                "FPR": float(...)
            },
            ...
        ],
        "roc_auc": float(...),
        "average_precision": float(...)
    }
    

Порядок элементов в threshold_metrics обязан строго соответствовать порядку порогов во входном списке thresholds.

Ввод и вывод

stdin не используется. Печатать через print в stdout ничего не нужно.

Проверяющая система вызывает функцию evaluate_ranking_thresholds(y_true, scores, thresholds) с тестовыми наборами данных и проверяет типы, ключи словарей и числовые значения возвращённой структуры.

Пример использования

y_true = [0, 0, 1, 0, 1, 0]
scores = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4]
thresholds = [0.7, 1.0]

res = evaluate_ranking_thresholds(y_true, scores, thresholds)
print(res["threshold_metrics"][0]["TP"], res["threshold_metrics"][0]["precision"])
print(res["threshold_metrics"][1]["precision"])
print(round(res["roc_auc"], 3), round(res["average_precision"], 3))

Результат:

1 0.3333333333333333
0.0
0.375 0.367
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи