Перейти к содержимому

MAE

MAE (Mean Absolute Error, средняя абсолютная ошибка) — одна из самых простых и интуитивно понятных метрик качества для задач регрессии.

MAE вычисляется по следующей формуле:

MAE(y,pred)=1ni=1nprediyi\operatorname{MAE}(y, pred) = \frac{1}{n} \sum_{i=1}^{n} |pred_i - y_i|

где:

  • nn — количество объектов в выборке;
  • yiy_i — истинное значение целевой переменной для ii-го объекта;
  • predipred_i — предсказание модели для ii-го объекта.

Для каждого объекта мы находим модуль разности между предсказанием и настоящим значением — то есть смотрим, насколько модель ошиблась, не обращая внимания на то, в какую сторону (в большую или меньшую). Затем все эти отклонения усредняются.

Пример. Пусть модель предсказывает цену квартиры (в тысячах рублей):

Настоящая цена (yy)Предсказание (predpred)Ошибка predy\lvert pred - y\rvert
50005200200
30002800200
70007100100
MAE=200+200+1003166.7 тыс. руб.\text{MAE} = \frac{200 + 200 + 100}{3} \approx 166.7 \text{ тыс. руб.}

Это значит, что в среднем предсказание модели отличается от настоящей цены примерно на 166,7 тысячи рублей.

Та же проверка в программе:

uses MLABC;
begin
var y := [5000, 3000, 7000];
var pred := [5200, 2800, 7100];
var mae := Metrics.MAE(y, pred);
Println('MAE:', mae:0:1);
end.

Вывод:

MAE: 166.7

MAE удобно понимать по графику линейной регрессии.

uses MLABC, PlotML;
begin
var df := DataFrame.FromCsvText('''
Площадь,Цена
35,4.8
42,5.7
50,7.9
58,7.9
65,8.2
72,10.4
80,10.5
90,12.5
''');
var X := df.ToMatrix(['Площадь']);
var y := df.ToVector('Цена');
var model := new LinearRegression;
model.Fit(X, y);
Plot.Title := 'Линейная регрессия';
Plot.XLabel := 'Площадь';
Plot.YLabel := 'Цена';
Plot.Points(X.Col(0), y);
var line := model.RegressionLine;
Plot.Line(line.K, line.B, Colors.Red);
var yPred := model.Predict(X);
Print('(');
var n := X.RowCount;
for var i := 0 to n - 1 do
begin
var x1 := X[i, 0];
Plot.LineGraph(
[x1, x1],
[y[i], yPred[i]],
Colors.Gray,
thickness := 1.5);
var erri := Abs(y[i] - yPred[i]);
if i > 0 then Print('+');
Print(erri:0:2);
end;
var mae := Metrics.MAE(y, yPred);
Println(') /', n, '=', mae:0:2);
Plot.Points(X.Col(0), yPred, Plot.PaletteColor(0), size := 5);
end.

Вывод:

( 0.18 + 0.21 + 0.94 + 0.12 + 0.75 + 0.52 + 0.44 + 0.24 ) / 8 = 0.42

На графике красная линия показывает предсказания модели. Синие точки — настоящие значения.

Графическое пояснение MAE

Вертикальные серые отрезки показывают ошибки модели для отдельных точек. Длина каждого такого отрезка — это абсолютное отклонение настоящего значения от предсказания. Среднее арифметическое этих длин и есть MAE.

  • Единицы измерения. MAE измеряется в тех же единицах, что и целевая переменная. Если цена — в рублях, то и MAE — в рублях; если это температура в градусах, то и MAE — в градусах. Это делает метрику удобной для интерпретации: результат легко связать с исходной величиной.
  • Чем меньше MAE, тем лучше модель предсказывает значения — идеальная модель имеет MAE=0\text{MAE} = 0.
  • Устойчивость к выбросам. Поскольку ошибки берутся по модулю (а не возводятся в квадрат, как в MSE), большие ошибки не «взрываются» и не доминируют над остальными. Из-за этого MAE меньше реагирует на редкие сильные промахи модели, чем, например, RMSE.
  • Не показывает направление ошибки. MAE не говорит, завышает модель предсказания или занижает — только насколько велика ошибка по модулю.

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