Ответ
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²:
- Не указывает на адекватность модели. Высокий R² не гарантирует, что модель корректно отражает взаимосвязи (может быть переобучение или пропущена нелинейность).
- Чувствителен к выбросам.
- Монотонно растет с добавлением признаков, даже бесполезных. Поэтому для моделей со многими признаками лучше смотреть на скорректированный R² (adjusted R²), который штрафует за сложность.
Ответ 18+ 🔞
А, слушай, про R² объяснить? Ну это ж классика, ебать мои старые костыли. Представь себе: ты построил модель, которая что-то там предсказывает, а теперь хочешь понять, насколько она вообще адекватна, или ты просто хуй в пальто нарисовал.
R², он же коэффициент детерминации — это по сути показатель, который кричит тебе: «Смотри, чувак, вот насколько твоя умная модель лучше, чем тупейший прогноз — просто взять и предсказать среднюю температуру по больнице».
Формула у него простая, но страшная: R² = 1 - (SS_res / SS_tot)
SS_res— это сумма квадратов твоих косяков. То есть насколько твои предсказания от реальных значений отъехали. Чем больше — тем хуже, понятное дело.SS_tot— это общая сумбурность, разброс данных самих по себе. Дисперсия, короче.
А теперь расшифровка, что значат циферки:
- R² = 1: Это идеал, ёперный театр. Твоя модель попала в каждую точку данных, как снайпер. Ошибок ноль. На практике такого не бывает, разве что ты на тренировочных данных переобучился так, что у них волосы дыбом встали.
- R² = 0: Модель работает не лучше, чем если бы ты всем сказал: «Значение будет вот такое, среднее». Объясняет 0% происходящего. Пиздец, а не модель.
- R² < 0: Вот тут уже полный ахтунг. Это когда твоя «умная» модель хуже, чем просто предсказать среднее. Такое бывает, если модель настолько кривая, что ей доверия ебать ноль, или ты её на одних данных обучил, а тестируешь на совершенно других, и она просто охуела.
- 0 < R² < 1: Нормальная рабочая ситуация. Допустим, R² = 0.85. Это значит, что твоя модель объяснила 85% всей этой каши и неразберихи в данных. Оставшиеся 15% — это либо случайный шум, либо факторы, которые ты в модель не запихнул.
Вот тебе живой пример на 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)
# Считаем наш священный грааль
r2 = r2_score(y_test, y_pred)
print(f"R² на тестовой выборке: {r2:.4f}") # Допустим, выведет 0.7421
Что это значит? А то, что наша простая линейная модель смогла объяснить примерно 74% всей движухи в тестовых данных. Не идеал, но жить можно. Остальные 26% — это всё, что мы не учли, хитрая жопа данных, короче.
Но, чувак, главное — не обольщайся! У R² есть подводные ебучие камни:
- Высокий R² — не приговор к гениальности. Модель может быть переобученной пиздопроебибной конструкцией, которая на старых данных идеально работает, а на новых — накрылась медным тазом.
- Выбросы его ебут, как хотят. Одна кривая точка — и показатель скачет.
- Чем больше признаков ты в модель суёшь, даже бесполезных, тем R² будет выше. Он просто любит сложность. Поэтому для моделей с кучей признаков смотри на скорректированный R² (adjusted R²), который за лишнюю хуйню штрафует. А то так и до манды с ушами недалеко.