Целью любой модели машинного обучения является понимание и изучение шаблонов из данных, которые в дальнейшем можно использовать для прогнозирования или ответов на вопросы, или просто для понимания лежащего в основе шаблона в данных, который иначе не очевиден. В большинстве случаев обучающая часть повторяется. Модель изучает некоторые шаблоны из данных, мы проверяем ее на некоторых новых данных, с которыми модель не сталкивалась во время обучения, мы видим, насколько хорошо или плохо она работала, мы настраиваем и корректируем некоторые параметры, а затем тестируем. снова. Этот процесс повторяется до тех пор, пока нам не будет представлена ​​достаточно хорошая модель (хотя некоторые модели из реального мира могут быть просто удовлетворительными и иметь огромное значение). В той части, где мы оцениваем и тестируем нашу модель, в игру вступают функции потерь.

Функции потерь принимают прогнозируемые значения модели и сравнивают их с фактическими значениями. Он оценивает, насколько хороша (или насколько плоха) модель с точки зрения ее способности отображать взаимосвязь между X (признак, независимая переменная, переменная-предиктор) и Y (цель, зависимая переменная, переменная отклика). Иногда просто знать, насколько плохо работает модель, может быть недостаточно, нам также может потребоваться рассчитать, насколько модель отличается от фактического значения. Зная величину отклонения между прогнозируемым значением и фактическим значением, мы можем соответствующим образом обучить нашу модель. Эта разница между фактическим значением и прогнозируемым значением называется убытком. Высокое значение потерь означает, что модель имеет плохую производительность.

Существует множество функций потерь для оценки регрессионных моделей.

Не существует «одной функции, чтобы управлять всеми».

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

Цель этой статьи — представить вам список всех функций потерь для регрессии с указанием их плюсов и минусов. Хотя все они могут быть реализованы с использованием таких библиотек, как SciPy, PyTorch, Scikit Learn, Keras и т. д., я реализовал код с помощью NumPy, так как это помогает лучше понять, что происходит внутри.

Без дальнейших церемоний, давайте начнем.

Оглавление

  1. Функция потерь и функция затрат
  2. Средняя абсолютная ошибка (MAE)
  3. Средняя ошибка смещения (MBE)
  4. Относительная абсолютная ошибка (RAE)
  5. Средняя абсолютная ошибка в процентах (MAPE)
  6. Среднеквадратическая ошибка (MSE)
  7. Среднеквадратичная ошибка (RMSE)
  8. Относительная квадратичная ошибка (RSE)
  9. Нормализованная среднеквадратическая ошибка (NRMSE)
  10. Относительная среднеквадратическая ошибка (RRMSE)
  11. Среднеквадратическая логарифмическая ошибка (RMSLE)
  12. Хубер Лосс
  13. Логарифмические потери
  14. Квантиль потерь

Функция потерь и функция затрат

Функция, которая вычисляет потери для 1 точки данных, называется функцией потерь.

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

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

Средняя абсолютная ошибка, также известная как потеря L1, является одной из самых простых функций потерь. Он рассчитывается путем взятия абсолютной разницы между прогнозируемыми значениями и фактическими значениями и ее усреднения по набору данных. Говоря математическим языком, это среднее арифметическое абсолютных ошибок. MAE измеряет только величину ошибок и не интересуется их направлением. Чем ниже MAE, тем выше точность модели.

Математически MAE можно выразить следующим образом:

где y_i = фактическое значение, y_hat_i = прогнозируемое значение, n = размер выборки

def mean_absolute_error(true, pred):
    abs_error = np.abs(true - pred)
    sum_abs_error = np.sum(abs_error)
    mae_loss = sum_abs_error / true.size
    return mae_loss

Плюсы

  • Это легко вычислить.
  • Все ошибки взвешиваются по одной шкале, поскольку берутся абсолютные значения.
  • Это полезно, если обучающие данные имеют выбросы, поскольку MAE не наказывает большие ошибки, вызванные выбросами.
  • Он обеспечивает равномерную оценку того, насколько хорошо работает модель.

Минусы

  • Иногда большие ошибки, возникающие из-за выбросов, в конечном итоге обрабатываются так же, как и низкие ошибки.
  • MAE следует мере точности, зависящей от масштаба, когда он использует ту же шкалу, что и измеряемые данные. Следовательно, его нельзя использовать для сравнения рядов с использованием разных мер.
  • Одним из основных недостатков МАЭ является то, что он не дифференцируем в нуле. Многие алгоритмы оптимизации склонны использовать дифференцирование для нахождения оптимального значения параметров.
  • Вычисление градиентов в MAE может оказаться сложной задачей.

Средняя ошибка смещения (MBE)

Смещение в «Средней ошибке смещения» — это тенденция процесса измерения к завышению или недооценке значения параметра. Смещение имеет только направление, которое может быть как положительным, так и отрицательным. Положительное смещение означает, что ошибка данных завышена, а отрицательное смещение означает, что ошибка занижена. Средняя ошибка смещения (MBE) — это среднее значение разницы между прогнозируемыми значениями и фактическими значениями. MBE количественно определяет общее смещение и фиксирует среднее смещение в прогнозе. Он почти аналогичен MAE, с той лишь разницей, что здесь не берется абсолютное значение. С MBE следует обращаться осторожно, так как положительные и отрицательные ошибки могут компенсироваться.

Формула МБЭ,

def mean_bias_error(true, pred):
    bias_error = true - pred
    mbe_loss = np.mean(np.sum(diff) / true.size)
    return mbe_loss

Плюсы

  • MBE — хорошая мера, если вы хотите проверить направление модели (т. е. есть ли положительное или отрицательное смещение) и исправить смещение модели.

Минусы

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

Относительная абсолютная ошибка (RAE)

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

RAE выражается как,

где y_bar — среднее значение n фактических значений.

RAE измеряет производительность прогностической модели и выражается в виде отношения. Значение RAE может варьироваться от нуля до единицы. Хорошая модель будет иметь значения, близкие к нулю, причем ноль является лучшим значением. Эта ошибка показывает, как средняя невязка связана со средним отклонением целевой функции от ее среднего значения.

def relative_absolute_error(true, pred):
    true_mean = np.mean(true)
    squared_error_num = np.sum(np.abs(true - pred))
    squared_error_den = np.sum(np.abs(true - true_mean))
    rae_loss = squared_error_num / squared_error_den
    return rae_loss

Плюсы

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

Минусы

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

Средняя абсолютная ошибка в процентах (MAPE)

Средняя абсолютная процентная ошибка рассчитывается путем деления разницы между фактическим значением и прогнозируемым значением на фактическое значение. К этому значению применяется абсолютный процент, и оно усредняется по набору данных. MAPE также известен как среднее абсолютное процентное отклонение (MAPD). Она линейно возрастает с увеличением ошибки. Чем меньше MAPE, тем лучше производительность модели.

def mean_absolute_percentage_error(true, pred):
    abs_error = (np.abs(true - pred)) / true
    sum_abs_error = np.sum(abs_error)
    mape_loss = (sum_abs_error / true.size) * 100
    return mape_loss

Плюсы

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

Минусы

  • Одним из основных недостатков MAPE является то, что значение знаменателя достигает нуля. Мы столкнулись с проблемой «деления на ноль», так как она не определена.
  • MAPE наказывает за отрицательные ошибки больше, чем за положительные. Следовательно, он предвзят, когда мы сравниваем точность методов прогнозирования, поскольку он выберет метод, значения которого по умолчанию слишком малы.
  • Поскольку используется операция деления, для одной и той же ошибки изменение фактического значения вызовет разницу в потерях. Рассмотрим сценарий, когда фактическое значение равно 100, а прогнозируемое значение равно 75, потери составят 25%. Хотя фактическое значение равно 50, а прогнозируемое значение равно 75, потери составят 50%. Но в обоих случаях фактическая ошибка будет одинаковой. то есть 25.

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

MSE — одна из наиболее распространенных функций регрессионных потерь. В среднеквадратичной ошибке, также известной как потеря L2, мы вычисляем ошибку, возводя в квадрат разницу между прогнозируемым значением и фактическим значением и усредняя ее по набору данных. MSE также известен как квадратичная потеря, поскольку штраф пропорционален не ошибке, а квадрату ошибки. Возведение ошибки в квадрат дает более высокий вес выбросам, что приводит к плавному градиенту для небольших ошибок. Алгоритмы оптимизации выигрывают от этого штрафа за большие ошибки, поскольку он помогает найти оптимальные значения параметров. MSE никогда не будет отрицательным, поскольку ошибки возводятся в квадрат. Величина ошибки колеблется от нуля до бесконечности. MSE увеличивается экспоненциально с увеличением ошибки. У хорошей модели значение MSE будет ближе к нулю.

def mean_squared_error(true, pred):
    squared_error = np.square(true - pred) 
    sum_squared_error = np.sum(squared_error)
    mse_loss = sum_squared_error / true.size
    return mse_loss

Плюсы

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

Минусы

  • Одно из преимуществ MSE становится недостатком при плохом прогнозе. Чувствительность к выбросам увеличивает высокие ошибки, возводя их в квадрат.
  • MSE будет иметь тот же эффект для одной большой ошибки, что и для множества меньших ошибок. Но в основном мы будем искать модель, которая работает достаточно хорошо на общем уровне.
  • MSE зависит от масштаба, поскольку его масштаб зависит от масштаба данных. Это делает его крайне нежелательным для сравнения между различными показателями.
  • Когда в данные вводится новый выброс, модель попытается учесть этот выброс. При этом будет получена другая линия наилучшего соответствия, что может привести к искажению окончательных результатов.

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

RMSE вычисляется путем извлечения квадратного корня из MSE. RMSE также называется среднеквадратичным значением Deviation.It измеряет среднюю величину ошибок и касается отклонений от фактического значения. Значение RMSE с нулем указывает на то, что модель идеально подходит. Чем ниже RMSE, тем лучше модель и ее прогнозы. Более высокое среднеквадратичное отклонение указывает на большое отклонение от остатка до истинного значения. RMSE можно использовать с различными функциями, поскольку это помогает выяснить, улучшает ли функция прогноз модели или нет.

def root_mean_squared_error(true, pred):
    squared_error = np.square(true - pred) 
    sum_squared_error = np.sum(squared_error)
    rmse_loss = np.sqrt(sum_squared_error / true.size)
    return rmse_loss

Плюсы

  • RMSE легко понять.
  • Он служит эвристикой для обучения моделей.
  • Он прост в вычислительном отношении и легко дифференцируем, чего требуют многие алгоритмы оптимизации.
  • RMSE не наказывает за ошибки так сильно, как MSE, из-за квадратного корня.

Минусы

  • Как и MSE, RMSE зависит от масштаба данных. Она увеличивается по величине, если увеличивается масштаб ошибки.
  • Одним из основных недостатков RMSE является его чувствительность к выбросам, и выбросы должны быть удалены, чтобы он функционировал должным образом.
  • RMSE увеличивается с увеличением размера тестовой выборки. Это проблема, когда мы вычисляем результаты на разных тестовых выборках.

Относительная квадратичная ошибка (RSE)

Чтобы рассчитать относительную квадратичную ошибку, вы берете среднеквадратичную ошибку (MSE) и делите ее на квадрат разницы между фактическим и средним значением данных. Другими словами, мы делим MSE нашей модели на MSE модели, которая использует среднее значение в качестве прогнозируемого значения.

def relative_squared_error(true, pred):
    true_mean = np.mean(true)
    squared_error_num = np.sum(np.square(true - pred))
    squared_error_den = np.sum(np.square(true - true_mean))
    rse_loss = squared_error_num / squared_error_den
    return rse_loss

Выходное значение RSE выражается в виде отношения. Он может варьироваться от нуля до бесконечности. Хорошая модель должна иметь значение, близкое к нулю, в то время как модель со значением больше 1 не является разумной.

Плюсы

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

Нормализованная среднеквадратическая ошибка (NRMSE)

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

  • RMSE / максимальное значение в серии
  • СКО / среднее значение
  • RMSE / разница между максимальным и минимальным значениями (если среднее значение равно нулю)
  • СКО/стандартное отклонение
  • RMSE / межквартильный диапазон
# implementation of NRMSE with standard deviation
def normalized_root_mean_squared_error(true, pred):
    squared_error = np.square((true - pred))
    sum_squared_error = np.sum(squared_error)
    rmse = np.sqrt(sum_squared_error / true.size)
    nrmse_loss = rmse/np.std(pred)
    return nrmse_loss

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

Относительная среднеквадратическая ошибка (RRMSE)

RRMSE — это безразмерная форма RMSE. Относительная среднеквадратическая ошибка (RRMSE) представляет собой среднеквадратичную ошибку, нормализованную среднеквадратичным значением, где каждый остаток масштабируется относительно фактического значения. Хотя RMSE ограничен масштабом исходных измерений, RRMSE можно использовать для сравнения различных методов измерения. Когда ваши прогнозы неточны, это приводит к увеличению RRMSE. RRMSE выражает ошибку относительно или в процентах. Точность модели,

  • Отлично, когда RRMSE ‹ 10%
  • Хорошо, когда RRMSE составляет от 10% до 20%
  • Справедливо, когда RRMSE составляет от 20% до 30%
  • Плохо, когда RRMSE > 30%

def relative_root_mean_squared_error(true, pred):
    num = np.sum(np.square(true - pred))
    den = np.sum(np.square(pred))
    squared_error = num/den
    rrmse_loss = np.sqrt(squared_error)
    return rrmse_loss

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

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

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

def root_mean_squared_log_error(true, pred):
    square_error = np.square((np.log(true + 1) - np.log(pred + 1)))
    mean_square_log_error = np.mean(square_error)
    rmsle_loss = np.sqrt(mean_square_log_error)
    return rmsle_loss

Плюсы

  • RMSLE не зависит от масштаба и полезен в диапазоне масштабов.
  • На него не влияют большие выбросы.
  • Он учитывает только относительную ошибку между фактическим значением и прогнозируемым значением.

Минусы

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

Хубер Лосс

Что, если вам нужна функция, которая узнает о выбросах, а также игнорирует их? Что ж, потеря Хубера для тебя. Потеря Хубера представляет собой комбинацию как линейного, так и квадратичного метода подсчета очков. Он имеет дельту гиперпараметра (𝛿), которую можно настроить в соответствии с данными. Потери будут линейными (потери L1) для значений выше дельты и квадратичными (потери L2) для значений ниже дельты. Он уравновешивает и сочетает в себе хорошие свойства как MAE (средняя абсолютная ошибка), так и MSE (среднеквадратическая ошибка). Другими словами, для значений потерь меньше дельты будет использоваться MSE, а для значений потерь больше дельты будет использоваться MAE. Выбор дельты (𝛿) чрезвычайно важен, потому что он определяет наш выбор выброса. Потеря Хубера уменьшает вес, который мы придаем выбросам для больших значений потерь, используя MAE, в то время как для меньших значений потерь он поддерживает квадратичную функцию с использованием MSE.

def huber_loss(true, pred, delta):
    huber_mse = 0.5 * np.square(true - pred)
    huber_mae = delta * (np.abs(true - pred) - 0.5 * (np.square(delta)))
    return np.where(np.abs(true - pred) <= delta, huber_mse, huber_mae)

Плюсы

  • Он дифференцируем в нуле.
  • Выбросы обрабатываются правильно из-за линейности выше дельты.
  • Гиперпараметр 𝛿 можно настроить для максимальной точности модели.

Минусы

  • Дополнительные условия и сравнения делают потери Хьюбера дорогостоящими в вычислительном отношении для больших наборов данных.
  • Чтобы максимизировать точность модели, 𝛿 необходимо оптимизировать, и это итеративный процесс.
  • Она дифференцируема только один раз.

Логарифмические потери

Log cosh вычисляет логарифм гиперболического косинуса ошибки. Эта функция более гладкая, чем квадратичная потеря. Он работает как MSE, но на него не влияют большие ошибки предсказания. Это очень похоже на потерю Хубера в том смысле, что представляет собой комбинацию как линейного, так и квадратичного методов оценки.

def log_cosh(true, pred):
    logcosh = np.log(np.cosh(pred - true))
    logcosh_loss = np.sum(logcosh)
    return logcosh_loss

Плюсы

  • Он имеет преимущества потери Хубера, будучи везде дважды дифференцируемым. Некоторые алгоритмы оптимизации, такие как XGBoost, отдают предпочтение двойным дифференцируемым функциям, таким как Huber, которые могут быть дифференцируемыми только один раз.
  • Он требует меньше вычислений, чем Хубер.

Минусы

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

Квантиль потерь

Функция потерь квантильной регрессии применяется для прогнозирования квантилей. Квантиль — это значение, которое определяет, сколько значений в группе находится ниже или выше определенного предела. Он оценивает условную медиану или квантиль отклика (зависимых) переменных по значениям предикторов (независимых) переменных. Функция потерь является расширением MAE, за исключением 50-го процентиля, где это MAE. Он обеспечивает интервалы прогнозирования даже для остатков с непостоянной дисперсией и не предполагает конкретного параметрического распределения для ответа.

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

В приведенной выше функции потерь 𝛾 имеет значение от 0 до 1. При недооценке будет преобладать первая часть формулы, а при переоценке - вторая часть. Выбранное значение квантиля (𝛾) дает разные штрафы за завышение и занижение прогноза. Когда 𝛾 = 0,5, недооценка и переоценка штрафуются одним и тем же коэффициентом, и получается медиана. Когда значение 𝛾 больше, переоценка наказывается больше, чем недооценка. Например, при 𝛾 = 0,75 модель будет штрафовать завышенную оценку, и она будет стоить в три раза больше, чем недооценка. Алгоритмы оптимизации, основанные на градиентном спуске, изучают квантили, а не среднее значение.

def quantile_loss(true, pred, gamma):
    val1 = gamma * np.abs(true - pred)
    val2 = (1-gamma) * np.abs(true - pred)
    q_loss = np.where(true >= pred, val1, val2)
    return q_loss

Плюсы

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

Минусы

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

Спасибо, что дочитали до конца! Я надеюсь, что эта статья была полезна в вашем путешествии по обучению. Я хотел бы услышать в комментариях о любых других функциях потерь, которые я пропустил. Удачной оценки!

Свяжитесь со мной в LinkedIn

Рекомендации