1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Python_Ai_Road-eat_tensorflow2_in_30_days

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
5-6,评估指标metrics.md 12 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 03.12.2024 15:14 374a95e

5-6, Показатели оценки (метрики)

Функция потерь может выступать не только в качестве цели оптимизации при обучении модели, но и как один из показателей оценки качества модели. Однако обычно качество модели оценивают с других точек зрения.

Это и есть показатели оценки. Как правило, функцию потерь можно использовать в качестве показателя оценки, например, 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.

I. Часто используемые встроенные показатели оценки

  • 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 (сумма).

II. Пользовательские показатели оценки

Мы используем 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/Python_Ai_Road-eat_tensorflow2_in_30_days.git
git@api.gitlife.ru:oschina-mirror/Python_Ai_Road-eat_tensorflow2_in_30_days.git
oschina-mirror
Python_Ai_Road-eat_tensorflow2_in_30_days
Python_Ai_Road-eat_tensorflow2_in_30_days
master