Какой самый популярный loss в линейной регрессии?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Популярные loss функции в линейной регрессии
Выбор функции потерь (loss function) критически важен для обучения моделей регрессии. Различные loss функции по-разному штрафуют за ошибки и приводят к разным поведениям модели.
1. Mean Squared Error (MSE) — самый популярный
Это стандартная и наиболее часто используемая loss функция для линейной регрессии.
Формула:
MSE = (1/n) * Σ(y_i - ŷ_i)²
Где n — количество образцов, y_i — истинное значение, ŷ_i — предсказанное значение.
Реализация:
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# Данные
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 5, 4, 5])
# Обучение модели (использует MSE по умолчанию)
model = LinearRegression()
model.fit(X, y)
# Предсказания
y_pred = model.predict(X)
# Вычисление MSE
mse = mean_squared_error(y, y_pred)
print(f"MSE: {mse}")
# Матричная форма для линейной регрессии
# MSE = (1/n) * ||y - Xw||²
# где w — веса модели
Почему MSE популярен:
- Квадратичные ошибки штрафуют больших ошибок больше, чем малых
- Имеет простое аналитическое решение в закрытой форме
- Производная гладкая, что облегчает оптимизацию (градиентный спуск)
- Статистически: при нормальном распределении ошибок MSE — это Maximum Likelihood Estimator (MLE)
Недостатки:
- Чувствителен к выбросам (квадрат амплифицирует большие ошибки)
- Не интерпретируется в исходных единицах (так как возведён в квадрат)
2. Root Mean Squared Error (RMSE)
Квадратный корень из MSE, более интерпретируемая метрика.
Формула:
RMSE = √(MSE) = √((1/n) * Σ(y_i - ŷ_i)²)
Пример:
from sklearn.metrics import mean_squared_error
import math
mse = mean_squared_error(y, y_pred)
rmse = math.sqrt(mse)
print(f"RMSE: {rmse}")
# Или напрямую
from sklearn.metrics import mean_squared_error
rmse = mean_squared_error(y, y_pred, squared=False)
Преимущества:
- Интерпретируется в исходных единицах измерения y
- Если модель предсказывает цену в рублях, RMSE показывает среднюю ошибку в рублях
Недостатки:
- Не имеет закрытого решения, требует численной оптимизации
- Всё ещё чувствителен к выбросам
3. Mean Absolute Error (MAE)
Средняя абсолютная ошибка, более робустна к выбросам.
Формула:
MAE = (1/n) * Σ|y_i - ŷ_i|
Пример:
from sklearn.metrics import mean_absolute_error
mae = mean_absolute_error(y, y_pred)
print(f"MAE: {mae}")
# Сравнение с MSE при выбросах
y_with_outlier = np.array([2, 4, 5, 4, 50]) # последнее значение - выброс
y_pred_with_outlier = np.array([2.1, 3.9, 5.1, 3.8, 4.2])
mae_outlier = mean_absolute_error(y_with_outlier, y_pred_with_outlier)
mse_outlier = mean_squared_error(y_with_outlier, y_pred_with_outlier)
print(f"MAE с выбросом: {mae_outlier}")
print(f"MSE с выбросом: {mse_outlier}") # MSE гораздо больше
Преимущества:
- Робустна к выбросам (не возводит ошибку в квадрат)
- Интерпретируема в исходных единицах
- Все ошибки штрафуются одинаково
Недостатки:
- Не имеет закрытого решения
- Не дифференцируема в нуле (может быть проблема для некоторых оптимизаторов)
- Не соответствует нормальному распределению ошибок
4. Huber Loss
Комбинация MSE и MAE: близка к MSE для малых ошибок, но более робустна к выбросам как MAE.
Формула:
Huber(y, ŷ) =
{ (y - ŷ)² / 2, если |y - ŷ| ≤ δ
{ δ * (|y - ŷ| - δ/2), если |y - ŷ| > δ
Параметр δ контролирует переход между квадратичной и линейной частями.
Пример:
from sklearn.linear_model import HuberRegressor
# Huber регрессор использует Huber loss
model_huber = HuberRegressor(epsilon=1.35, max_iter=1000)
model_huber.fit(X, y)
y_pred_huber = model_huber.predict(X)
print(f"Коэффициент: {model_huber.coef_[0]}")
Преимущества:
- Балансирует между MSE и MAE
- Более робустна к выбросам, чем MSE
- Всё ещё дифференцируема
Недостатки:
- Нужно выбирать параметр δ
- Более сложная реализация
5. Log-Cosh Loss
Гладкая аппроксимация к MAE, удобна для градиентного спуска.
Формула:
Log-Cosh = Σ log(cosh(y_i - ŷ_i))
Характеристики:
- Приблизительно равна MSE для малых ошибок
- Приблизительно равна MAE для больших ошибок
- Всегда дифференцируема
6. Quantile Loss
Используется для квантильной регрессии, позволяет прогнозировать доверительные интервалы.
Формула:
Quantile Loss = Σ(q * max(y_i - ŷ_i, 0) + (1-q) * max(ŷ_i - y_i, 0))
Где q — квантиль (например, 0.5 для медианы).
Пример:
from sklearn.linear_model import QuantileRegressor
# Прогнозирование 25-го, 50-го и 75-го перцентилей
for quantile in [0.25, 0.5, 0.75]:
model = QuantileRegressor(quantile=quantile)
model.fit(X, y)
print(f"Q{int(quantile*100)}: {model.predict(X)}")
Сравнение loss функций в контексте выбросов
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression, HuberRegressor, QuantileRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error
# Данные с выбросом
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 5, 4, 50]) # выброс
# Обычная линейная регрессия (MSE)
model_mse = LinearRegression()
model_mse.fit(X, y)
# Huber регрессор
model_huber = HuberRegressor(epsilon=1.35)
model_huber.fit(X, y)
# Результаты
print(f"MSE коэффициент: {model_mse.coef_[0]:.2f}")
print(f"Huber коэффициент: {model_huber.coef_[0]:.2f}")
# MSE будет сильно смещена из-за выброса
# Huber будет более устойчива
Когда использовать какую loss функцию?
MSE (Mean Squared Error):
- Стандартный выбор
- Когда ошибки примерно нормально распределены
- Когда большие ошибки нужно штрафовать сильно
- Простая интерпретация через RMSE
MAE (Mean Absolute Error):
- Когда в данных много выбросов
- Когда все ошибки имеют одинаковую важность
- Когда нужна робустность
Huber Loss:
- Компромисс между MSE и MAE
- Когда данные содержат некоторые выбросы
- Когда нужна гладкая функция
Quantile Loss:
- Когда нужны интервалы уверенности
- Когда интересует не средняя, а медиана
- Асимметричные штрафы за ошибки в разных направлениях
Вывод
MSE остаётся самой популярной loss функцией в линейной регрессии благодаря своей простоте, интерпретируемости и математическим удобствам. Однако для практических задач с выбросами часто лучше использовать MAE или Huber Loss. Выбор loss функции должен зависеть от конкретной задачи, распределения ошибок и чувствительности к выбросам.