Spec-Zone.ru › TensorFlow

tf.keras.metrics.AUC

Аппроксимирует AUC (площадь под кривой) для ROC- или PR-кривых.

Наследуется от: Metric

tf.keras.metrics.AUC(
    num_thresholds=200,
    curve='ROC',
    summation_method='interpolation',
    name=None,
    dtype=None,
    thresholds=None,
    multi_label=False,
    num_labels=None,
    label_weights=None,
    from_logits=False
)

Используется в блокнотах

Используется в руководствах
  • Классификация на несбалансированных данных
  • Федеративное обучение с большими моделями и эффективным использованием ресурсов клиента с помощью `federated_select` и разреженной агрегации

AUC (площадь под кривой) ROC-кривой (рабочей характеристики приёмника; используется по умолчанию) или PR-кривой (точность-полнота) — это показатели качества бинарных классификаторов. В отличие от точности и подобно потерям на основе перекрёстной энтропии, ROC-AUC и PR-AUC оценивают все рабочие точки модели.

Этот класс аппроксимирует AUC с помощью суммы Римана. На этапе накопления метрики предсказания распределяются по заранее заданным диапазонам значений. Затем AUC вычисляется путём интерполяции средних значений в каждом диапазоне. Эти диапазоны определяют оцениваемые рабочие точки.

Эта метрика создаёт четыре локальные переменные: true_positives, true_negatives, false_positives и false_negatives, которые используются для вычисления AUC. Для дискретизации кривой AUC используется равномерно распределённый набор пороговых значений, позволяющий вычислить пары значений полноты и точности. Поэтому площадь под ROC-кривой вычисляется как высота значений полноты, умноженная на долю ложноположительных результатов, а площадь под PR-кривой — как высота значений точности, умноженная на полноту.

В конечном итоге это значение возвращается как auc — идемпотентная операция, которая вычисляет площадь под дискретизированной кривой значений точности и полноты (вычисленных с помощью упомянутых выше переменных). Переменная num_thresholds задаёт степень дискретизации: чем больше пороговых значений, тем точнее аппроксимация истинного AUC. Качество аппроксимации может значительно различаться в зависимости от num_thresholds. Параметр thresholds можно использовать для указания пороговых значений вручную, чтобы распределить предсказания более равномерно.

Для наиболее точной аппроксимации реального AUC значения predictions должны быть распределены примерно равномерно в диапазоне [0, 1] (если from_logits=False). Если это условие не выполняется, качество аппроксимации AUC может быть низким. Установка summation_method в значение 'minoring' или 'majoring' помогает оценить погрешность аппроксимации, задавая нижнюю или верхнюю границу AUC.

Если sample_weight равно None, веса по умолчанию равны 1. Используйте sample_weight со значением 0, чтобы исключить значения из расчёта.

Аргументы
num_thresholds (Необязательно) Количество пороговых значений, используемых при дискретизации ROC-кривой. Значения должны быть > 1. По умолчанию равно 200.
curve (Необязательно) Задаёт имя вычисляемой кривой: 'ROC' (по умолчанию) или 'PR' для кривой точности-полноты.
summation_method (Необязательно) Задаёт используемый метод суммирования Римана. 'interpolation' (по умолчанию) применяет схему суммирования по средним точкам для ROC. Для PR-AUC интерполируются положительные и отрицательные результаты (true/false), но не отношение, соответствующее точности (подробности см. в Davis & Goadrich, 2006); 'minoring' применяет суммирование слева для возрастающих интервалов и справа для убывающих; 'majoring' действует наоборот.
name (Необязательно) Строковое имя экземпляра метрики.
dtype (Необязательно) Тип данных результата метрики.
thresholds (Необязательно) Список значений с плавающей точкой, используемых в качестве пороговых значений для дискретизации кривой. Если задан, параметр num_thresholds игнорируется. Значения должны находиться в диапазоне [0, 1]. Пороговые значения на концах диапазона, равные {-epsilon, 1+epsilon} для небольшого положительного значения эпсилон, будут автоматически добавлены к списку, чтобы корректно обрабатывать предсказания, равные точно 0 или 1.
multi_label Логическое значение, указывающее, следует ли обрабатывать многометочные данные как таковые: в этом случае AUC вычисляется отдельно для каждой метки, а затем усредняется по меткам, или (если False) следует ли объединить данные в одну метку перед вычислением AUC. Во втором случае, если в AUC передаются многометочные данные, каждая пара «метка-предсказание» рассматривается как отдельная точка данных. Для данных с несколькими классами следует задать значение False.
num_labels (Необязательно) Количество меток, используется, если multi_label равно True. Если num_labels не задан, переменные состояния создаются при первом вызове update_state.
label_weights (Необязательно) Список, массив или тензор неотрицательных весов, используемых для вычисления AUC многометочных данных. Если multi_label равно True, веса применяются к отдельным значениям AUC меток при их усреднении для получения многометочного AUC. Если значение False, веса используются для взвешивания предсказаний отдельных меток при вычислении матрицы ошибок по объединённым данным. Обратите внимание: это отличается от class_weights тем, что class_weights задаёт вес примера в зависимости от значения его метки, тогда как label_weights зависит только от индекса этой метки перед объединением; поэтому label_weights не следует использовать для данных с несколькими классами.
from_logits Логическое значение, указывающее, являются ли предсказания (y_pred в update_state) вероятностями или логитами сигмоидной функции. Как правило, при использовании функции потерь Keras аргумент конструктора from_logits функции потерь должен соответствовать аргументу конструктора from_logits метрики AUC.

Пример:

m = keras.metrics.AUC(num_thresholds=3)
m.update_state([0, 0, 1, 1], [0, 0.5, 0.3, 0.9])
# threshold values are [0 - 1e-7, 0.5, 1 + 1e-7]
# tp = [2, 1, 0], fp = [2, 0, 0], fn = [0, 1, 2], tn = [0, 2, 2]
# tp_rate = recall = [1, 0.5, 0], fp_rate = [1, 0, 0]
# auc = ((((1 + 0.5) / 2) * (1 - 0)) + (((0.5 + 0) / 2) * (0 - 0)))
#     = 0.75
m.result()
0.75
m.reset_state()
m.update_state([0, 0, 1, 1], [0, 0.5, 0.3, 0.9],
               sample_weight=[1, 0, 0, 1])
m.result()
1.0

Использование с API compile():

# Reports the AUC of a model outputting a probability.
model.compile(optimizer='sgd',
              loss=keras.losses.BinaryCrossentropy(),
              metrics=[keras.metrics.AUC()])

# Reports the AUC of a model outputting a logit.
model.compile(optimizer='sgd',
              loss=keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=[keras.metrics.AUC(from_logits=True)])
Атрибуты
dtype
thresholds Пороговые значения, используемые для оценки AUC.
variables

Методы

add_variable

Посмотреть исходный код

add_variable(
    shape, initializer, dtype=None, aggregation='sum', name=None
)

add_weight

Посмотреть исходный код

add_weight(
    shape=(), initializer=None, dtype=None, name=None
)

from_config

Посмотреть исходный код

@classmethod
from_config(
    config
)

get_config

Посмотреть исходный код

get_config()

Возвращает сериализуемую конфигурацию метрики.

interpolate_pr_auc

Посмотреть исходный код

interpolate_pr_auc()

Формула интерполяции основана на разделе 4 работы Davis & Goadrich (2006).

https://www.biostat.wisc.edu/~page/rocpr.pdf

Здесь мы выводим и используем замкнутую формулу, отсутствующую в статье, следующим образом:

Precision = TP / (TP + FP) = TP / P

Предполагая, что TP (истинно положительные), FP (ложно положительные) и их сумма P = TP + FP (предсказанные положительные результаты) линейно изменяются на каждом интервале [A, B] между соседними пороговыми значениями, получаем

Precision slope = dTP / dP
                = (TP_B - TP_A) / (P_B - P_A)
                = (TP - TP_A) / (P - P_A)
Precision = (TP_A + slope * (P - P_A)) / P

Площадь интервала равна (наклон / общий вес положительных результатов), умноженному на

int_A^B{Precision.dP} = int_A^B{(TP_A + slope * (P - P_A)) * dP / P}
int_A^B{Precision.dP} = int_A^B{slope * dP + intercept * dP / P}

где intercept = TP_A - slope * P_A = TP_B - slope * P_B, в результате чего получаем

int_A^B{Precision.dP} = TP_B - TP_A + intercept * log(P_B / P_A)

Возвращая множитель (slope / общий вес положительных результатов), который мы отложили, получаем

slope * [dTP + intercept *  log(P_B / P_A)] / total_pos_weight

где dTP == TP_B - TP_A.

Обратите внимание: если P_A == 0, приведённое выше вычисление упрощается до

int_A^B{Precision.dTP} = int_A^B{slope * dTP}
                       = slope * (TP_B - TP_A)

что эквивалентно присвоению постоянной точности на протяжении первой корзины, в которой есть >0 истинно положительных результатов.

Возвращает
pr_auc аппроксимацию площади под PR-кривой.

reset_state

Посмотреть исходный код

reset_state()

Сбрасывает все переменные состояния метрики.

Эта функция вызывается между эпохами и шагами, когда метрика вычисляется во время обучения.

result

Посмотреть исходный код

result()

Вычисляет текущее значение метрики.

Возвращает
Скалярный тензор или словарь скалярных тензоров.

stateless_reset_state

Посмотреть исходный код

stateless_reset_state()

stateless_result

Посмотреть исходный код

stateless_result(
    metric_variables
)

stateless_update_state

Посмотреть исходный код

stateless_update_state(
    metric_variables, *args, **kwargs
)

update_state

Посмотреть исходный код

update_state(
    y_true, y_pred, sample_weight=None
)

Накапливает статистику матрицы ошибок.

Аргументы
y_true Эталонные значения.
y_pred Предсказанные значения.
sample_weight Необязательные веса для каждого примера. Может быть тензором с рангом 0 или тем же рангом, что и y_true, и должен допускать трансляцию до формы y_true. По умолчанию равно 1.

__call__

Посмотреть исходный код

__call__(
    *args, **kwargs
)

Вызывает self как функцию.

© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/keras/metrics/AUC

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API