Функция потерь может выступать не только в качестве цели оптимизации при обучении модели, но и как один из показателей оценки качества модели. Однако обычно качество модели оценивают с других точек зрения.
Это и есть показатели оценки. Как правило, функцию потерь можно использовать в качестве показателя оценки, например, MAE, MSE, CategoricalCrossentropy также являются часто используемыми показателями оценки.
Но показатели оценки не всегда могут быть использованы в качестве функции потерь, например, AUC, Accuracy, Precision. Это связано с тем, что от показателей оценки не требуется непрерывная дифференцируемость, тогда как функция потерь обычно должна быть непрерывно дифференцируемой.
При компиляции модели можно указать несколько показателей оценки в виде списка.
Если необходимо, можно настроить собственные показатели оценки.
Для создания собственных показателей оценки нужно принять два тензора y_true и y_pred в качестве входных параметров и вывести одно скалярное значение в качестве значения оценки.
Также можно создать подкласс tf.keras.metrics.Metric, переопределить методы инициализации, update_state и result для реализации логики вычисления показателей оценки, таким образом получив реализацию класса показателей оценки.
Поскольку процесс обучения обычно происходит партиями, а показатели оценки требуют прохождения всего epoch для получения общего результата, классы показателей оценки более распространены. То есть необходимо написать метод инициализации для создания некоторых промежуточных переменных, связанных с вычислением результатов показателей, написать метод update_state для обновления состояния промежуточных переменных после каждой batch, и написать метод result для вывода окончательного результата показателей.
Если вы пишете показатели оценки в форме функций, то можете взять только среднее значение результатов оценки для каждого batch в epoch в качестве результата оценки для всего epoch, но этот результат обычно отклоняется от результата, полученного при однократном вычислении на всём наборе данных epoch.
MeanSquaredError (среднеквадратичная ошибка, используется для регрессии, может быть сокращённо обозначена как MSE, функция имеет вид mse).
MeanAbsoluteError (средняя абсолютная ошибка, используется для регрессии, может быть сокращена до MAE, функция имеет вид mae).
MeanAbsolutePercentageError (средний процент ошибки, используется для регрессии, может быть сокращён до MAPE, функция имеет вид mape).
RootMeanSquaredError (корень из среднеквадратичной ошибки, используется для регрессии).
Accuracy (точность, используется для классификации, может быть представлена строкой «Accuracy», рассчитывается как (TP + TN) / (TP + TN + FP + FN), требует, чтобы y_true и y_pred были закодированы как номера классов).
Precision (прецизионность, используется для бинарной классификации, рассчитывается как TP / (TP + FP)).
Recall (полнота, используется для бинарной классификации, рассчитывается как TP / (TP + FN)).
TruePositives (истинно положительные результаты, используются для бинарной классификации).
TrueNegatives (истинно отрицательные результаты, используются для бинарной классификации).
FalsePositives (ложноположительные результаты, используются для бинарной классификации).
FalseNegatives (ложноотрицательные результаты, используются для бинарной классификации).
AUC (площадь под ROC-кривой, используется для бинарной классификации, интуитивно интерпретируется как вероятность того, что случайный положительный образец будет иметь предсказание выше, чем случайный отрицательный образец).
CategoricalAccuracy (категориальная точность, имеет то же значение, что и Accuracy, требует, чтобы y_true (label) был представлен в формате onehot кодирования).
SparseCategoricalAccuracy (разреженная категориальная точность, имеет то же значение, что и Accuracy, требует, чтобы y_true (label) был представлен в виде порядкового кодирования).
MeanIoU (пересечение по объединению, часто используется для сегментации изображений).
TopKCategoricalAccuracy (многоклассовая точность TopK, требует, чтобы y_true (label) был представлен в формате onehot кодирования).
SparseTopKCategoricalAccuracy (разреженная многоклассовая точность TopK, требует, чтобы y_true (label) был представлен в виде порядкового кодирования).
Mean (среднее значение).
Sum (сумма).
Мы используем KS-показатель, широко применяемый в области финансового мониторинга рисков, в качестве примера для демонстрации пользовательских показателей оценки.
KS-показатель подходит для задач бинарной классификации и рассчитывается как KS = max(TPR - FPR).
Где TPR = TP / (TP + FN) и FPR = FP / (FP + TN).
Кривая TPR фактически представляет собой кумулятивную функцию распределения (CDF) положительных образцов, а кривая FPR — кумулятивную функцию распределения отрицательных образцов.
Таким образом, KS-показатель представляет собой максимальное различие между кумулятивными функциями распределения положительных и отрицательных образцов.
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras import layers,models,losses,metrics
# Функция в форме пользовательского показателя оценки
@tf.function
def ks(y_true,y_pred):
y_true = tf.reshape(y_true,(-1,))
y_pred = tf.reshape(y_pred,(-1,))
length = tf.shape(y_true)[0]
t = tf.math.top_k(y_pred,k = length,sorted = False)
y_pred_sorted = tf.gather(y_pred,t.indices)
y_true_sorted = tf.gather(y_true,t.indices)
cum_positive_ratio = tf.truediv(
tf.cumsum(y_true_sorted),tf.reduce_sum(y_true_sorted))
cum_negative_ratio = tf.truediv(
tf.cumsum(1 - y_true_sorted),tf.reduce_sum(1 - y_true_sorted))
ks_value = tf.reduce_max(tf.abs(cum_positive_ratio - cum_negative_ratio))
return ks_value
y_true = tf.constant([[1],[1],[1],[0],[1],[1],[1],[0],[0],[0],[1],[0],[1],[0]])
y_pred = tf.constant([[0.6],[0.1],[0.4],[0.5],[0.7],[0.7],[0.7],
[0.4],[0.4],[0.5],[0.8],[0.3],[0.5],[0.3]])
tf.print(ks(y_true,y_pred))
0.625
# Класс в форме пользовательского показателя оценки
class KS(metrics.Metric):
def __init__(self, name = "ks", **kwargs):
super(KS,self).__init__(name=name,**kwargs)
self.true_positives = self.add_weight(
name = "tp",shape = (101,), initializer = "zeros")
self.false_positives = self.add_weight(
name = "fp",shape = (101,), initializer = "zeros")
@tf.function
def update_state(self,y_true,y_pred):
y_true = tf.cast(tf.reshape(y_true,(-1,)),tf.bool)
y_pred = tf.cast(100*tf.reshape(y_pred,(-1,)),tf.int32)
for i in tf.range(0,tf.shape(y_true)[0]):
if y_true[i]:
self.true_positives[y_pred[i]].assign(
self.true_positives[y_pred[i]]+1.0)
else:
self.false_positives[y_pred[i]].assign(
self.false_positives[y_pred[i]]+1.0)
return (self.true_positives,self.false_positives)
@tf.function
def result(self):
cum_positive_ratio = tf.truediv(
tf.cumsum(self.true_positives),tf.reduce_sum(self.true_positives))
cum_negative_ratio = tf.truediv( ```
tf.cumsum(self.false_positives), tf.reduce_sum(self.false_positives))
ks_value = tf.reduce_max(tf.abs(cum_positive_ratio - cum_negative_ratio))
return ks_value
y_true = tf.constant([[1], [1], [1], [0], [1], [1], [1], [0], [0], [0], [1], [0], [1], [0]])
y_pred = tf.constant([[0.6], [0.1], [0.4], [0.5], [0.7], [0.7],
[0.7], [0.4], [0.4], [0.5], [0.8], [0.3], [0.5], [0.3]])
myks = KS()
myks.update_state(y_true, y_pred)
tf.print(myks.result())
0.625
Если есть необходимость дальнейшего общения с автором по содержанию этой книги, пожалуйста, оставьте комментарий в публичном аккаунте «Алгоритм и вкусняшки». Автор ответит при наличии времени и возможностей.
Также можно оставить заявку на присоединение к группе обсуждения через обратную связь в личном кабинете публичного аккаунта, написав ключевое слово: присоединиться.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )