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: список или одномерная последовательность вещественных чисел — исследуемые пороги классификации.
Требования к расчётам:
- Для каждого порога из
thresholdsобъект относится к положительному классу , если , и к классу иначе. - Для каждого порога рассчитайте целочисленные количества четырёх исходов:
TP,FP,FN,TN(типаint), а также вещественные метрикиprecision,recallиFPR(типаfloat). - Если при данном пороге модель не выдала ни одного положительного предсказания (), установите
precision = 0.0согласно оговорённой конвенцииzero_division=0. - Для всей выборки по исходным непрерывным значениям
scoresрассчитайте интегральные метрики качества ранжирования:
roc_auc: площадь под ROC-кривой черезsklearn.metrics.roc_auc_scoreлибо эквивалентный математический расчёт с корректным разрешением ничьих скоров;average_precision: средняя точность черезsklearn.metrics.average_precision_scoreлибо эквивалентное ступенчатое взвешивание с группировкой ничьих (запрещено использовать неверное трапециевидное интегрирование).
- Функция возвращает словарь
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
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
