Бинарная ROC AUC — площадь под ROC-кривой, эквивалентная доле правильно упорядоченных пар «позитив — негатив» с половиной балла за равные scores. Один класс не даёт определённой AUC.
Сформулируйте и выпишите определение что такое roc auc.
Бинарная ROC AUC — площадь под ROC-кривой, эквивалентная доле правильно упорядоченных пар «позитив — негатив» с половиной балла за равные scores. Один класс не даёт определённой AUC.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Сформулируйте и выпишите определение что такое roc auc.
Как считается roc auc score?
Напишите функцию, которая вычисляет roc_auc_score согласно выписанному определению.
А для произвольного числа классов с заданным порядком приоритета?
Модель работает следующим образом
y_score[i] >= threshold -> y_pred[i] = 1
y_score[i] < threshold -> y_pred[i] = 0
def test_roc_aur_score(): y_true = [0, 0, 0, 1, 0, 0] y_score = [0.2, 0.4, 0.31, 0.6, 0.3, 0.7] res_metric = roc_auc_score(y_true, y_score) assert res_metric == 0.8
y_true = [0, 1, 0, 0, 0, 1]
y_score = [0.7, 0.6, 0.31, 0.31, 0.3, 0.2]
res_metric = roc_auc_score(y_true, y_score)
assert res_metric == 0.375
y_true = [0, 0, 0, 1, 0, 0]
y_score = [0.2, 0.4, 0.31, 0.8, 0.3, 0.7]
res_metric = roc_auc_score(y_true, y_score)
assert res_metric == 1
y_true = [0, 0, 0, 0, 0, 0]
y_score = [0.2, 0.4, 0.31, 0.8, 0.3, 0.7]
res_metric = roc_auc_score(y_true, y_score)
assert res_metric == 0
Бонусные тесты для нескольких классов
y_true = [0, 1, 0, 0.5, 0, 1] y_score = [0.7, 0.6, 0.31, 0.31, 0.3, 0.2] res_metric = roc_auc_score(y_true, y_score) assert res_metric == 0.[phone]
y_true = [0, 0.1, 0.2, 0.3, 0.4, 0.6] y_score = [0, 0.1, 0.2, 0.3, 0.4, 0.6] res_metric = roc_auc_score(y_true, y_score) assert res_metric == 1
Ответ
Бинарная ROC AUC — площадь под ROC-кривой, эквивалентная доле правильно упорядоченных пар «позитив — негатив» с половиной балла за равные scores. Один класс не даёт определённой AUC.
Для упорядоченных классов можно явно выбрать обобщение: сравнивать все пары разных классов, считая больший класс приоритетнее. Это ordinal concordance, а не стандартный multiclass OvR/OvO. Ниже O(n²) по времени и O(1) дополнительной памяти; при отсутствии сравнимых пар возвращается 0 только ради соглашения теста.
def roc_auc_score(y_true, y_score):
if len(y_true) != len(y_score):
raise ValueError('Разные размеры')
wins = 0.0
pairs = 0
for i in range(len(y_true)):
for j in range(len(y_true)):
if y_true[i] > y_true[j]:
pairs += 1
wins += (y_score[i] > y_score[j]) + 0.5 * (y_score[i] == y_score[j])
return wins / pairs if pairs else 0.0
Предполагаются конечные числовые scores и метки в порядке приоритета. Для первого бонусного примера получается 9/22; ожидаемое значение в исходнике повреждено. Для одинаково возрастающих меток и scores результат 1.
Источник: scikit-learn.org.