Как происходит оценка ошибки модели машинного обучения?

«Как происходит оценка ошибки модели машинного обучения?» — вопрос из категории Метрики и функции потерь, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оценка ошибки модели — это процесс измерения ее производительности с использованием специальных функций потерь (Loss Functions) на этапе обучения и метрик (Metrics) на этапе валидации/тестирования.

1. Функции потерь (для оптимизации): Эти функции дифференцируемы и используются алгоритмом оптимизации (градиентный спуск) для обновления весов.

  • Для регрессии:
    • Среднеквадратичная ошибка (MSE): MSE = (1/n) * Σ(y_true - y_pred)². Сильно штрафует большие ошибки.
    • Средняя абсолютная ошибка (MAE): MAE = (1/n) * Σ|y_true - y_pred|. Менее чувствительна к выбросам.
  • Для классификации:
    • Бинарная/категориальная перекрестная энтропия (Binary/Cross-Entropy Loss): Измеряет расхождение между распределением предсказанных вероятностей и истинными метками. Loss = - Σ y_true * log(y_pred).

2. Метрики оценки (для интерпретации): Эти метрики дают понятную человеку оценку качества, но не всегда дифференцируемы.

  • Для регрессии: (коэффициент детерминации), RMSE (корень из MSE).
  • Для классификации:
    • Accuracy (Точность): Доля правильных предсказаний. Может быть неинформативна при несбалансированных классах.
    • Precision (Точность), Recall (Полнота), F1-Score: Более надежные метрики для несбалансированных данных. F1 — гармоническое среднее Precision и Recall.
    • ROC-AUC: Показывает способность модели разделять классы, независимо от порога классификации.

Практический пример сравнения метрик:

from sklearn.metrics import mean_squared_error, r2_score, f1_score

# Для регрессии
y_true_reg = [3.0, 5.0, 2.5, 7.0]
y_pred_reg = [2.5, 5.2, 4.0, 8.0]
print(f"MSE: {mean_squared_error(y_true_reg, y_pred_reg):.2f}")
print(f"R²: {r2_score(y_true_reg, y_pred_reg):.2f}")

# Для бинарной классификации
y_true_clf = [1, 0, 1, 1, 0]
y_pred_clf = [1, 0, 0, 1, 1] # Предсказанные классы (не вероятности!)
print(f"F1-Score: {f1_score(y_true_clf, y_pred_clf):.2f}")

Выбор конкретной функции потерь и метрики строго зависит от бизнес-задачи. Например, в задаче обнаружения мошенничества (где класс "мошенничество" редок) часто максимизируют Recall, чтобы пропустить как можно меньше мошеннических операций.