Если коротко: 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:
- Если оно близко к 1 — ошибки примерно однородны, крупных выбросов нет.
- Если оно заметно больше 1 (скажем, 1.5 и выше) — значит, есть небольшое число очень крупных промахов, которые раздувают RMSE. Это сигнал пойти и посмотреть на хвосты распределения ошибок.
Я часто считаю обе метрики именно ради этого разрыва — он рассказывает про структуру ошибок больше, чем каждая цифра по отдельности.
Что показывает R² и когда он врёт?
R² (коэффициент детерминации) отвечает на другой вопрос. MAE и RMSE говорят «на сколько единиц мы ошибаемся», а R² говорит «насколько наша модель лучше, чем тупо предсказывать среднее».
Формула словами: R² = 1 - (сумма квадратов ошибок модели) / (сумма квадратов отклонений от среднего). В знаменателе — разброс самого таргета вокруг его среднего, то есть ошибка самой примитивной «модели», которая всегда предсказывает среднее значение. В числителе — ошибка вашей модели. R² = 0.8 читается как «модель объяснила 80% разброса целевой переменной».
Границы такие: идеальная модель даёт R² = 1, модель уровня «всегда предсказываю среднее» даёт R² = 0. И вот первая ловушка — R² может быть отрицательным. Если на тестовых данных модель предсказывает хуже, чем константное среднее, знаменатель обгоняет единицу, и R² уходит в минус. Это не баг, это честный сигнал: модель бесполезна на этих данных.
Где R² врёт или как минимум недоговаривает:
- Он ничего не говорит про масштаб ошибки в единицах. R² = 0.9 звучит отлично, но если таргет — миллионы рублей, ваши 10% необъяснённого разброса могут быть огромными деньгами. Смотрите RMSE рядом.
- На обучающей выборке R² почти всегда растёт, когда добавляешь признаки, даже мусорные. Поэтому для сравнения моделей с разным числом фичей используют скорректированный R² (adjusted R²), который штрафует за лишние признаки.
- R² не ловит систематический сдвиг (bias). Модель может стабильно завышать прогноз, но иметь приличный 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 есть острые углы, о которых спрашивают на собеседованиях:
- Она взрывается, когда
y_trueблизко к нулю или равен нулю — деление на почти-ноль даёт гигантские проценты. Для товаров с редкими продажами MAPE непригодна. - Она асимметрична: недопрогноз и перепрогноз штрафуются по-разному, что подталкивает модель систематически занижать прогноз.
Поэтому на практике часто берут связку: RMSE (или MAE) как абсолютную метрику качества внутри задачи плюс MAPE как «процентную» для коммуникации с бизнесом и сравнения между сущностями. Иногда вместо MAPE используют её более устойчивые варианты вроде WAPE (сумма абсолютных ошибок, делённая на сумму факта) — она не разваливается на нулях. Логика та же: перейти от абсолютных единиц к относительным.
Какую метрику выбрать под конкретную задачу?
Собрал то, чем сам руководствуюсь.
- Хотите понятную бизнесу «типичную ошибку в рублях/минутах» и в данных есть законные выбросы — берите MAE. Она честная и устойчивая.
- Крупные промахи для бизнеса непропорционально болезненны, хотите, чтобы модель их особенно избегала — RMSE. Она сама «наказывает» модель за большие ошибки.
- Нужно одним числом сказать «модель осмысленная или мусор», сравнить с baseline — R². Но всегда рядом со шкальной метрикой.
- Сравниваете качество прогноза между товарами/регионами разного масштаба или общаетесь с бизнесом в процентах — MAPE или WAPE, помня про нули.
- Обучаете модель — почти всегда оптимизируете MSE (гладкая, дифференцируемая), а отчитываетесь в RMSE и MAE.
Хорошая привычка — считать сразу три-четыре метрики. Они не конкурируют, а дополняют друг друга: 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 мок-собеседования — это лучший способ довести формулировки до уровня «отвечаю не задумываясь».