Отрицательный R²: что именно модель проиграла среднему
В отчёте R² равен -3. Число кажется невозможным: показатель воспринимают как процент от нуля до ста. На самом деле R² может быть отрицательным и показывает конкретное отношение ошибок.
Понять эталон внутри формулы
R² равен единице минус отношение суммы квадратов ошибок модели к сумме квадратов отклонений фактов от их среднего. Среднее берётся по оцениваемой выборке. Если модель ошибается больше этого постоянного предсказания, результат отрицателен. Нижнего общего предела у R² нет.
Это математический эталон оценки, а не готовая стратегия прогноза: среднее будущего теста при реальном применении заранее неизвестно. Рабочий baseline нужно обучить только по train и оценить отдельно. Смешение этих двух средних создаёт неверное толкование метрики.
Восстановить показатель вручную
Для фактов 10, 12 и 14 среднее теста равно 12. Модель постоянно предсказывает 8. Её квадратичная ошибка гораздо выше отклонений фактов от 12. Одновременно считаем MAE в исходных единицах, чтобы понять практический размер промаха.
Проверка вручную использует те же массивы, что r2_score. Это помогает обнаружить неверное соответствие строк или случайное масштабирование цели.
import numpy as np
from sklearn.metrics import r2_score, mean_absolute_error
y = np.array([10., 12., 14.])
pred = np.array([8., 8., 8.])
sse = np.sum((y - pred) ** 2)
sst = np.sum((y - y.mean()) ** 2)
score = r2_score(y, pred)
print({"R2": score, "SSE": sse, "SST": sst, "MAE": mean_absolute_error(y, pred)})
assert np.isclose(score, 1 - sse/sst)
assert score == -6 and mean_absolute_error(y, pred) == 4R² равен -6: ошибка модели в семь раз больше знаменателя формулы. MAE равна четырём единицам. Это разные описания тех же прогнозов: относительное к вариации фактов и абсолютное.
Проверить узкий и постоянный тест
На тесте с очень близкими фактами знаменатель мал, поэтому даже умеренные ошибки дают резко отрицательный R². Сравнивать его между сегментами разной вариативности нужно осторожно. Покажите MAE или RMSE и распределение цели рядом.
Для постоянной цели знаменатель нулевой. r2_score по умолчанию использует force_finite=True и заменяет нечисловые результаты на удобные для поиска значения. Если диагностируете такой срез, проверьте постоянство цели и настройку force_finite явно. По одной цифре без размера и диапазона теста вывод делать трудно.
После обнаружения отрицательного R² проверьте порядок строк, единицы цели и обратное преобразование прогноза. Затем сравните с обученным baseline на той же выборке. Только после этого имеет смысл объяснять проблему сложностью модели.
В рабочем отчёте сохраните границы теста, число наблюдений и исходные прогнозы. Это позволит понять, ухудшилась модель или изменилась вариация проверяемого сегмента.
Закрепить на практике
В бесплатном уроке MAE, MSE и RMSE вы отработаете ошибки в единицах цели. Это полезная база для чтения R² из статьи: сравните относительный балл с размером реального промаха. Откройте бесплатный урок и задачи. Полная последовательность тем — в бесплатном курсе.
Продолжить на практике
- Машинное обучение с нуля на Python: первая модель ↗
Бесплатный курс машинного обучения на Python: обучите первую модель в scikit-learn, проверьте её качество и решите 106 задач в браузере.
