Что такое функция потерь? Это метод оценки того, насколько хорошо ваш алгоритм моделирует набор данных. Если Loss больше , значит, вам нужно улучшить свой алгоритм. Итак, мы можем сказать, что функция потерь является основной частью любого алгоритма.

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

Давайте рассмотрим некоторые из предопределенных функций потерь. В целом существует 2 категории: регрессионная потеря и классификационная потеря. Я думаю, важно понять Что? Почему? и Как? каждой потери.

Регрессионные потери

Среднеквадратическая ошибка (MSE)/среднеквадратичная ошибка (RMSE)

Какие?

  1. В статистике среднеквадратическая ошибка (MSE) определяется как среднее или среднее квадрата разницы между фактическими и расчетными значениями.

2. Порядок единицы MSE выше, чем единица ошибки, поскольку ошибка возводится в квадрат. Чтобы получить тот же порядок единиц, много раз берется квадратный корень из MSE. Это называется среднеквадратичной ошибкой (RMSE).
RMSE = SQRT(MSE)

Почему?

  1. Результат всегда положительный. Таким образом, вы всегда будете стремиться минимизировать его, независимо от знаков в прогнозируемом и фактическом значениях.
  2. Возведение в квадрат означает, что большие ошибки приводят к большему количеству ошибок, чем меньшие ошибки, а это означает, что модель наказывается за большие ошибки.
  3. Почему в квадрате? Это связано с тем, что в противном случае прогнозируемое значение иногда будет меньше, а иногда больше фактического значения, что может привести к отрицательной и положительной разнице между ними, что затем может привести к неправильному суммированию, а иногда и к 0, в худшем случае! что может заставить нас поверить, что наша модель идеальна!

Как?

  1. Можно использовать в Keras, указав «mse» или «mean_squared_error» в качестве функции потерь при компиляции модели.
model.compile(loss=’mean_squared_error’) model.compile(loss=’root_mean_squared_error’)

2. Из модуля Sklearn Python

from sklearn.metrics import mean_squared_error
mean_squared_error(y_true, y_pred)
mean_squared_error(y_true, y_pred, squared=False) ; if squared=False it returns RMSE instead of MSE

3. Использование модуля Numpy

mse = np.square(y_true — y_pred).mean(axis=0)
rmse = np.sqrt(mse)

Средняя абсолютная ошибка (MAE)

Какие?

  1. Средняя абсолютная ошибка (MAE) определяется как среднее или среднее значение абсолютной разницы между фактическими и расчетными значениями.

Почему?

  1. Он одинаково обрабатывает большие и маленькие ошибки. Не очень чувствителен к выбросам, в отличие от потери MSE.

Как?

  1. Можно использовать в Keras, указав «mean_absolute_error» в качестве функции потерь при компиляции модели.
model.compile(loss=’mean_absolute_error’)

2. Из модуля Sklearn Python

from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_true, y_pred)

3. Использование модуля Numpy

mae = np.absolute(y_true — y_pred).mean(axis=0)

Среднеквадратическая логарифмическая ошибка (MSLE)/RMSLE

Какие?

  1. Сначала вычислите натуральный логарифм каждого из прогнозируемых значений и фактических значений, затем вычислите среднеквадратичную ошибку. Это называется среднеквадратичной логарифмической ошибкой или MSLE.

Почему?

  1. Его интересует только относительная разница между фактическим и прогнозируемым значением или, другими словами, процентная разница между ними.
  2. Это означает, что он будет обрабатывать небольшие различия между небольшими фактическими и прогнозируемыми значениями примерно так же, как большие различия между большими фактическими и прогнозируемыми значениями. Так, например, если
    Actual = 30, Predicted = 20 ; тогда MSLE = 0,02861 и
    Факт = 30000 , Прогноз = 20000; тогда MSLE = 0,03100, но здесь MSE = 100000000
  3. Это полезно, когда диапазон целевых значений велик, т.е. может варьироваться от 10 до 10000 и даже больше.

Как?

  1. Можно использовать в Keras, указав «mean_squared_logarithmic_error» в качестве функции потерь при компиляции модели.
model.compile(loss=’mean_squared_logarithmic_error’)

2. Использование модуля Numpy

msle = np.sum(np.square(np.log(y_true+1) -np.log(y_pred+1))).mean(axis=0)
and simliarly we can have, rmsle = np.sqrt(msle)

Хубер Лосс

Какие?

  1. Потеря Хубера = комбинация MSE и MAE

Почему?

  1. Он предлагает лучшее из обоих миров, уравновешивая MSE и MAE вместе. Это квадратично (MSE), когда ошибка мала, иначе MAE.
  2. Использование MAE для больших значений потерь уменьшает вес, который мы придаем выбросам, так что мы по-прежнему получаем всестороннюю модель. В то же время мы используем MSE для меньших значений потерь, чтобы поддерживать квадратичную функцию вблизи центра.
  3. Используйте потерю Хьюбера каждый раз, когда чувствуете, что вам нужен баланс между приданием выбросам некоторого веса, но не слишком большого. В случаях, когда выбросы очень важны для вас, используйте MSE! В тех случаях, когда вас совершенно не волнуют выбросы, используйте MAE!

Как?

  1. Можно использовать в Keras, указав «huber_loss» в качестве функции потерь при компиляции модели.
model.compile(loss=’huber_loss’) or model.compile(loss=tf.keras.losses.Huber())

2. Использование Склеарна

from sklearn.linear_model import HuberRegressor
huber = HuberRegressor().fit(X, y)

3. Использование Tensorflow

def huber_loss_fn(y_true, y_pred, delta=1):
 error = y_true — y_pred
 is_small_error = tf.abs(error) < delta
 squared_loss = tf.square(error) / 2
 linear_loss = delta * (tf.abs(error) — delta/2)
 return tf.where(is_small_error, squared_loss, linear_loss)

Классификационные потери

Бинарная перекрестная потеря энтропии

Какие?

В двоичной классификации мы предсказываем вероятность того, что X будет в классе 1.

Когда наблюдение принадлежит классу 1, первая часть формулы становится активной, а вторая часть исчезает, и наоборот, в случае, когда фактический класс наблюдения равен 0.

Почему?

  1. Он используется с двоичной классификацией, где целевые значения находятся в наборе {0, 1}. Затем он вычисляет оценку, которая штрафует вероятности на основе расстояния от ожидаемого значения. Это означает, насколько близко или далеко от фактического значения.

Как?

  1. В Керасе
model.compile(loss='binary_crossentropy')
model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=True))

2. В Склеарне

from sklearn.metrics import log_loss
log_loss(y_true, y_pred)

3. В Нампи

loss = -(y_true*np.log(y_pred)+(1-y_true)*np.log(1-y_pred)).mean()

Потеря шарнира

Какие?

Hinge Loss используется, в частности, для моделей SVM или там, где целевые значения находятся в наборе {-1, 1}.

hinge_loss = max(0, 1-y_true*y_pred)

Почему?

  1. В SVM у нас есть 2 класса -1 и 1, и мы пытаемся смоделировать границу решения. Таким образом, предсказанные значения показывают расстояние от границы решения.
  2. В таком случае, если класс прогнозируется как -1,6, а фактический - -1. Это означает, что он находится далеко от границы решения и, следовательно, будет иметь 0 потерь. Чем ближе он к границе, тем больше будет его потеря на шарнире, и она будет продолжать увеличиваться, если он пойдет не с той стороны границы.

Как?

  1. В Керасе
model.compile(loss='hinge')

2. В Склеарне

from sklearn.metrics import hinge_loss
hinge_loss(y_true, y_pred)

3. В Нампи

loss = np.max([0.0, 1 - y_true*y_pred])

Многоклассовая кросс-энтропийная потеря/категориальная кросс-энтропия

Какие?

Это функция потерь по умолчанию, используемая в многоклассовой классификации.

Почему?

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

Как?

  1. В Керасе
model.compile(loss='categorical_crossentropy')

2. В Склеарне

sklearn.metrics.log_loss(y_true, y_pred, labels=[all_labels])

Разреженные мультиклассовые кросс-энтропийные потери

Какие?

И категориальная кросс-энтропия, и разреженная категориальная кросс-энтропия имеют одну и ту же функцию потерь, как определено в приведенном выше уравнении. Единственная разница между ними заключается в том, как определяются метки истинности. … В разреженной категориальной кросс-энтропии метки истинности закодированы целым числом, например, [1], [2] и [3] и т. д., тогда как в категориальной кросс-энтропии они закодированы горячим способом.

Почему?

  1. Он используется в тех случаях, когда имеется большое количество меток и их однократное кодирование вызовет только проблемы.

Как?

  1. В Керасе
model.compile(loss='sparse_categorical_crossentropy')