MLметрикирегрессияMAERMSE

Метрики регрессии: MAE, MSE, RMSE, R² простыми словами

2026-07-11 12 мин

Если коротко: MAE показывает среднюю ошибку модели в тех же единицах, что и целевая переменная, и почти не реагирует на редкие выбросы. MSE и RMSE наказывают крупные промахи сильнее, поэтому чувствительны к выбросам, зато RMSE тоже читается в единицах таргета. R² говорит, какую долю разброса данных модель вообще объяснила, но легко вводит в заблуждение и на новых данных может уходить в минус. Ниже разберу, чем они реально отличаются на практике, когда какую брать и почему RMSE математически не может быть меньше MAE.

Чем MAE отличается от MSE и RMSE?

Начну с самого понятного. У любой регрессии есть предсказание y_pred и правда y_true. Ошибка на одном объекте — это разница y_true - y_pred. Дальше вопрос только в том, как эти ошибки усреднить.

MAE (Mean Absolute Error) — берём модуль каждой ошибки и усредняем. Словами: MAE = среднее(|y_true - y_pred|). Если модель прогнозирует время доставки и MAE равен 8 минут, это значит: в среднем мы промахиваемся на 8 минут в любую сторону. Максимально интуитивная метрика, её понимает даже менеджер без статистики.

MSE (Mean Squared Error) — возводим каждую ошибку в квадрат и усредняем: MSE = среднее((y_true - y_pred)^2). Проблема в том, что единицы становятся «квадратными»: если таргет — рубли, то MSE в «рублях в квадрате», и это не читается глазами. Зато квадрат резко раздувает крупные промахи.

RMSE (Root Mean Squared Error) — это просто корень из MSE: RMSE = корень(MSE). Корень возвращает нас обратно в единицы таргета. Поэтому на практике MSE почти никогда не показывают людям — его считают для оптимизации, а отчитываются в RMSE. RMSE наследует от MSE чувствительность к выбросам, но при этом читается как «типичная ошибка в рублях/минутах/штуках».

Простое правило для головы: MAE — это «средняя ошибка честно», RMSE — «средняя ошибка, но с наценкой за крупные промахи».

Почему MAE устойчива к выбросам, а RMSE — нет?

Всё дело в квадрате. Представьте, что модель предсказывает сумму заказа и на 99 заказах ошибается на 100 рублей, а на одном выбросе — на 5000 рублей (клиент внезапно купил оптом).

Для MAE этот один промах вносит вклад 5000, а каждый нормальный — 100. Один аномальный объект тянет среднее вверх ровно на свою величину, линейно. Ничего страшного.

Для MSE тот же промах вносит 5000^2 = 25 000 000, тогда как нормальный — 100^2 = 10 000. То есть один выброс в квадрате весит как 2500 нормальных ошибок. RMSE, будучи корнем из этого, подскочит куда заметнее, чем MAE.

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

Кстати, это связано и с тем, что модель, обученная минимизировать MSE, тянется к среднему значению, а модель на MAE — к медиане. Медиана устойчива к выбросам, среднее — нет. Отсюда и разное поведение метрик.

Почему RMSE всегда больше или равна MAE?

Это не совпадение и не свойство конкретного датасета — это математический факт, который стоит понимать, чтобы не пугаться, когда видишь его в отчёте.

RMSE — это квадратичное среднее абсолютных ошибок, а MAE — их арифметическое среднее. Есть базовое неравенство: квадратичное среднее набора неотрицательных чисел всегда не меньше их арифметического среднего. Поэтому RMSE >= MAE для любых данных, всегда.

Равенство наступает только в одном случае — когда все абсолютные ошибки одинаковы. То есть если модель на каждом объекте промахивается ровно на одну и ту же величину, RMSE и MAE совпадут. Как только ошибки начинают отличаться друг от друга, RMSE отрывается вверх.

Из этого получается бесплатный диагностический трюк. Смотрите на отношение RMSE / MAE:

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

Что показывает R² и когда он врёт?

R² (коэффициент детерминации) отвечает на другой вопрос. MAE и RMSE говорят «на сколько единиц мы ошибаемся», а R² говорит «насколько наша модель лучше, чем тупо предсказывать среднее».

Формула словами: R² = 1 - (сумма квадратов ошибок модели) / (сумма квадратов отклонений от среднего). В знаменателе — разброс самого таргета вокруг его среднего, то есть ошибка самой примитивной «модели», которая всегда предсказывает среднее значение. В числителе — ошибка вашей модели. R² = 0.8 читается как «модель объяснила 80% разброса целевой переменной».

Границы такие: идеальная модель даёт R² = 1, модель уровня «всегда предсказываю среднее» даёт R² = 0. И вот первая ловушка — R² может быть отрицательным. Если на тестовых данных модель предсказывает хуже, чем константное среднее, знаменатель обгоняет единицу, и R² уходит в минус. Это не баг, это честный сигнал: модель бесполезна на этих данных.

Где R² врёт или как минимум недоговаривает:

Мой подход: R² — это метрика «для разговора», удобная, чтобы одним числом сказать «модель вообще осмысленная или нет». Но принимать решения только по нему я бы не стал.

Как связаны RMSE и MAPE для прогнозов?

RMSE и MAE — абсолютные метрики: они в единицах таргета. Это удобно внутри одной задачи, но неудобно, когда надо сравнить качество прогноза по разным товарам или регионам с разным масштабом. Ошибка в 100 штук — это много для товара, который продаётся по 200 в день, и ничто для товара с оборотом 50 000.

Здесь на сцену выходит MAPE (Mean Absolute Percentage Error) — средняя абсолютная ошибка в процентах. Словами: MAPE = среднее(|y_true - y_pred| / |y_true|), умноженное на 100. То есть каждую ошибку делим на реальное значение и получаем «на сколько процентов мы промахнулись». MAPE = 12% читается интуитивно и одинаково понятно для любого масштаба, поэтому в прогнозировании спроса и выручки её любят.

Но у MAPE есть острые углы, о которых спрашивают на собеседованиях:

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

Какую метрику выбрать под конкретную задачу?

Собрал то, чем сам руководствуюсь.

Хорошая привычка — считать сразу три-четыре метрики. Они не конкурируют, а дополняют друг друга: MAE про типичную ошибку, разрыв RMSE/MAE про выбросы, R² про осмысленность, MAPE про относительный масштаб.

Как посчитать всё это в sklearn?

Никакой ручной математики не нужно, всё есть в sklearn.metrics. Возьму игрушечный пример: модель предсказывает средний чек заказа, а мы сравниваем с фактом.

import numpy as np
from sklearn.metrics import (
    mean_absolute_error,
    mean_squared_error,
    r2_score,
    mean_absolute_percentage_error,
)

# факт (сумма заказа в рублях) и предсказание модели
y_true = np.array([1200, 950, 3100, 780, 1500, 9800, 640])
y_pred = np.array([1150, 1020, 2800, 900, 1400, 5200, 700])

mae = mean_absolute_error(y_true, y_pred)
mse = mean_squared_error(y_true, y_pred)
rmse = np.sqrt(mse)              # или mean_squared_error(y_true, y_pred, squared=False) в старых версиях
r2 = r2_score(y_true, y_pred)
mape = mean_absolute_percentage_error(y_true, y_pred)  # возвращает долю, не проценты

print(f"MAE:  {mae:.1f} руб.")
print(f"MSE:  {mse:.0f}")
print(f"RMSE: {rmse:.1f} руб.")
print(f"R2:   {r2:.3f}")
print(f"MAPE: {mape * 100:.1f} %")
print(f"RMSE/MAE: {rmse / mae:.2f}")

Обратите внимание на выброс в 9800 рублей, где модель промахнулась почти на 4600. Именно он раздувает RMSE относительно MAE — отношение RMSE / MAE заметно оторвётся от единицы, и это сразу подскажет, что в данных есть крупный промах. MAE при этом останется куда спокойнее.

Пара практических нюансов. mean_absolute_percentage_error возвращает долю (0.12), а не проценты, поэтому умножаю на 100 руками. И следите за версией sklearn: раньше RMSE считали через флаг squared=False, в свежих версиях есть отдельная функция root_mean_squared_error. Если сомневаетесь — берите корень из MSE через numpy, это работает везде.

Потренироваться считать метрики на живых датафреймах удобно в интерактивном Python-тренажёре — там pandas и numpy запускаются прямо в браузере. А синтаксис методов, если что-то забылось, всегда можно подсмотреть в справочнике по Python.

Что чаще всего спрашивают на собеседовании?

Пробегусь по типовым вопросам, чтобы вы не терялись.

«Почему не отчитываются в MSE?» — потому что единицы квадратные и нечитаемые; для людей есть RMSE в нормальном масштабе. «Может ли R² быть отрицательным?» — да, на тесте, если модель хуже константного среднего. «Чем MAE лучше RMSE?» — устойчивостью к выбросам и прямой интерпретацией. «Что оптимизирует линейная регрессия по умолчанию?» — сумму квадратов ошибок, то есть MSE. «Когда MAPE ломается?» — на нулевых и близких к нулю значениях таргета.

Часто дальше просят применить это к продуктовой задаче: как оценить прогноз выручки, спроса, LTV. Тут важно связать метрику с бизнес-контекстом, а не просто назвать формулу. Разбор таких кейсов есть в разделе практических кейсов, а типовые формулировки вопросов — в банке вопросов для собеседований. Если хотите системно прогнать теорию по метрикам, загляните в подборку продуктовых метрик и порешайте задачи на закрепление.

Регрессионные метрики — из тех тем, которые кажутся простыми, пока не начинаешь объяснять разницу между RMSE и MAE вслух под давлением интервьюера. Если хотите тренироваться на реальных вопросах с обратной связью и разбирать ML-метрики до автоматизма, в Pro-доступе открыты все задачи, кейсы и безлимитные AI мок-собеседования — это лучший способ довести формулировки до уровня «отвечаю не задумываясь».

Закрепи Python на задачах
402 Python-задачи через pandas/numpy/scipy — попробуй бесплатно.
Python-тренажёр →