Что показывает метрика R² (R-квадрат)?

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

Ответ

R² (коэффициент детерминации) — это метрика для оценки регрессионных моделей, которая показывает, какая доля дисперсии зависимой переменной (целевого признака) объясняется моделью.

Формула: R² = 1 - (SS_res / SS_tot)

  • SS_res — сумма квадратов остатков (ошибок модели).
  • SS_tot — общая сумма квадратов (дисперсия данных относительно среднего).

Интерпретация значений:

  • R² = 1: Идеальная модель. Все точки данных лежат точно на линии/гиперплоскости регрессии. Ошибок нет (SS_res = 0).
  • R² = 0: Модель работает не лучше, чем наивный прогноз средним значением целевой переменной. Модель объясняет 0% дисперсии.
  • R² < 0: Модель работает хуже, чем предсказание константным средним. Такое случается, когда модель сильно переобучена на тестовых данных или некорректно построена.
  • 0 < R² < 1: Модель объясняет соответствующую долю дисперсии. Например, R² = 0.85 означает, что 85% изменчивости целевой переменной учтено моделью.

Пример расчета в Python:

import numpy as np
from sklearn.metrics import r2_score
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

# Создаем синтетические данные
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)  # Линейная зависимость + шум

# Делим данные и обучаем модель
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)

# Вычисляем R²
r2 = r2_score(y_test, y_pred)
print(f"R² на тестовой выборке: {r2:.4f}")  # Например, 0.7421

# Что это значит? Наша линейная модель объяснила около 74% дисперсии y_test.
# Оставшиеся 26% — это необъясненная дисперсия (шум или влияние неучтенных факторов).

Важные ограничения R²:

  1. Не указывает на адекватность модели. Высокий R² не гарантирует, что модель корректно отражает взаимосвязи (может быть переобучение или пропущена нелинейность).
  2. Чувствителен к выбросам.
  3. Монотонно растет с добавлением признаков, даже бесполезных. Поэтому для моделей со многими признаками лучше смотреть на скорректированный R² (adjusted R²), который штрафует за сложность.