Собесов

alexeygrigorev/data-science-interviews: посчитать RMSE без библиотек

PythonМетрики качестваЛёгкаяJunior

Условие

Реализуйте функцию rmse(y_true, y_pred), которая принимает два списка одинаковой длины и возвращает корень из среднего квадрата ошибки. Считаем, что numpy недоступен.

Решение

Подход

Формула: sqrt(mean((y_true - y_pred)^2)). На чистом Python — один проход через zip, агрегируем сумму квадратов разностей и делим на длину, затем извлекаем корень.

Реализация

from math import sqrt
 
def rmse(y_true: list[float], y_pred: list[float]) -> float:
    if len(y_true) != len(y_pred):
        raise ValueError("Lengths differ")
    if not y_true:
        raise ValueError("Empty input")
    se = sum((a - b) ** 2 for a, b in zip(y_true, y_pred))
    return sqrt(se / len(y_true))

Подводные камни

  1. RMSE и MSE отличаются корнем — путаница в финальном ответе встречается у джунов почти всегда.
  2. RMSE чувствителен к выбросам сильнее, чем MAE: один промах в 100 раз больше остальных утопит метрику.
  3. На пустом списке деление на ноль; на разных длинах zip молча обрежет до короткого и даст неверный ответ.
  4. На очень больших списках желательно копить сумму инкрементально (или использовать math.fsum) для точности с плавающей точкой.

Эталонный ответ

sqrt(sum((a-b)**2 for a,b in zip(y,yhat)) / n) с проверкой длин и пустого входа.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти