Помимо использования в качестве цели оптимизации во время обучения, функция потерь также выступает в роли оценочного показателя производительности модели. Однако в целом производительность модели оценивается с помощью других показателей.
Это показатели оценки. Функция потерь может использоваться как показатель. MAE, MSE, CategoricalCrossentropy — одни из наиболее распространённых показателей.
Однако показатели не обязательно могут выступать в роли функции потерь, такие как AUC, Accuracy, Precision. Это связано с тем, что показатели не обязаны быть непрерывно дифференцируемыми, в то время как это общее требование для функции потерь.
Несколько показателей можно указать через список во время компиляции модели.
При необходимости показатели можно настроить.
Для пользовательских показателей в качестве входных данных требуются два тензора y_true и y_pred, а на выходе получается скалярное значение рассчитанного показателя.
Также можно настроить показатели, унаследовав их от базового класса tf.keras.metrics.Metric и переписав методы init, update_state и result для реализации расчёта показателей.
Обычно обучение выполняется пакетно, а показатели рассчитываются только после целой эпохи, поэтому показатели на уровне классов более популярны. Нам нужно написать метод инициализации для создания необходимых промежуточных переменных (они связаны с результирующими показателями), написать метод update_state для обновления состояний этих промежуточных переменных после каждого пакета и написать метод result для окончательного вывода.
Если показатель записан как функция, то в качестве общего показателя можно использовать только усреднённый показатель по всем пакетам в эпохе. Обычно это отличается от результата, рассчитанного на всех этапах обучения в эпоху.
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 (TPR против FPR); используется для двоичной классификации. Интуитивное объяснение: выберите положительный образец и отрицательный образец, AUC — это вероятность того, что прогноз положительного образца больше прогноза отрицательного образца).
CategoricalAccuracy (Категориальная точность, аналогична Accuracy, за исключением требования однократного кодирования для входной метки y_true).
SparseCategoricalAccuracy (Разреженная категориальная точность, аналогично Accuracy, за исключением требования порядкового кодирования для метки y_true).
MeanIoU (Пересечение над объединением, обычно используется для сегментации изображений).
TopKCategoricalAccuracy (Точность TopK для множественной классификации, требуется однократное кодирование для входной метки y_true).
SparseTopKCategoricalAccuracy (Точность TopK для множественной классификации, требуется обычное кодирование для входной метки y_true).
Mean (Среднее значение).
Sum (Суммация).
Здесь мы используем статистику K-S (Колмогорова-Смирнова), которая часто используется в управлении финансовыми рисками, в качестве примера настраиваемых показателей.
Статистика K-S используется для задач двоичной классификации; KS = max(TPR - FPR), где TPR = TP / (TP + FN), FPR = FP / (FP Кривая TPR — это кумулятивная функция распределения (CDF) положительных образцов, а кривая FPR — CDF отрицательных образцов.
Статистика K-S — это максимум разности между CDF положительных и отрицательных выборок.
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 )