MAE, MSE, RMSE и единицы ошибки
Содержание курса
Вычисление метрик через sklearn.metrics и вручную на малом примере
Стандартный способ считать метрики на тестовой выборке — sklearn.metrics. Вот полный рабочий пример на датасете diabetes:
import numpy as np
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error
bunch = load_diabetes(as_frame=True)
X, y = bunch.data, bunch.target
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
print(f"MAE = {mae:.2f}")
print(f"MSE = {mse:.2f}")
print(f"RMSE = {rmse:.2f}")
Оба вызова принимают аргументы в порядке (y_true, y_pred). Если перепутать порядок, sklearn не выдаст ошибку — числа посчитаются, но придерживайтесь правильного порядка: он закреплён в API и важен для других метрик, которые несимметричны.
RMSE получают как np.sqrt(mean_squared_error(...)) — это работает во всех версиях sklearn. Начиная со sklearn 1.4 доступна также отдельная функция root_mean_squared_error из того же модуля, но np.sqrt не создаёт неожиданностей при смене версии.
Чтобы убедиться, что функции sklearn делают именно то, что описано в формулах, возьмём первые пять строк тестовой выборки и повторим расчёт вручную:
y_true_5 = y_test.values[:5]
y_pred_5 = y_pred[:5]
errors = y_pred_5 - y_true_5
mae_manual = np.mean(np.abs(errors))
mse_manual = np.mean(errors ** 2)
rmse_manual = np.sqrt(mse_manual)
print(f"MAE вручную = {mae_manual:.4f}, sklearn = {mean_absolute_error(y_true_5, y_pred_5):.4f}")
print(f"MSE вручную = {mse_manual:.4f}, sklearn = {mean_squared_error(y_true_5, y_pred_5):.4f}")
print(f"RMSE вручную = {rmse_manual:.4f}, sklearn = {np.sqrt(mean_squared_error(y_true_5, y_pred_5)):.4f}")
Все три пары чисел совпадут до последнего знака — ручной расчёт и библиотечные функции реализуют одни и те же формулы. Разница лишь в удобстве: mean_absolute_error и mean_squared_error принимают любые array-like объекты и корректно работают с pandas Series без дополнительных преобразований.
