Регрессия и первый проект

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 без дополнительных преобразований.