Какие функции потерь используются для регрессии?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Какие функции потерь используются для регрессии?
Функция потерь (loss function) - это метрика, которая измеряет, насколько хорошо модель предсказывает значения. Для регрессии используется целый набор функций потерь, каждая из которых имеет свои особенности и применяется в определенных сценариях. Выбор правильной функции потерь критичен для качества модели.
1. Mean Squared Error (MSE)
Одна из самых популярных функций потерь. Вычисляет среднее квадратичное отклонение между предсказаниями и истинными значениями.
Формула:
MSE = (1/n) * Σ(y_true - y_pred)^2
from sklearn.metrics import mean_squared_error
import numpy as np
y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])
mse = mean_squared_error(y_true, y_pred)
print(f"MSE: {mse:.4f}") # MSE: 0.3750
# В TensorFlow/Keras
from tensorflow.keras.losses import MeanSquaredError
loss_fn = MeanSquaredError()
Преимущества:
- Гладкая функция, хорошо работает с градиентными методами
- Штрафует большие ошибки сильнее
Недостатки:
- Очень чувствительна к выбросам (outliers) из-за возведения в квадрат
- Трудно интерпретировать в исходных единицах
2. Root Mean Squared Error (RMSE)
Производная от MSE, но результат в исходных единицах измерения, что упрощает интерпретацию.
Формула:
RMSE = sqrt(MSE) = sqrt((1/n) * Σ(y_true - y_pred)^2)
from sklearn.metrics import mean_squared_error
import numpy as np
y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
print(f"RMSE: {rmse:.4f}") # RMSE: 0.6124
Используется когда:
- Нужна интерпретируемость в исходных единицах
- Хотите знать среднюю ошибку в тех же единицах, что и целевая переменная
3. Mean Absolute Error (MAE)
Вычисляет среднее абсолютное отклонение. Менее чувствительна к выбросам, чем MSE.
Формула:
MAE = (1/n) * Σ|y_true - y_pred|
from sklearn.metrics import mean_absolute_error
import numpy as np
y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])
mae = mean_absolute_error(y_true, y_pred)
print(f"MAE: {mae:.4f}") # MAE: 0.5000
# В TensorFlow/Keras
from tensorflow.keras.losses import MeanAbsoluteError
loss_fn = MeanAbsoluteError()
Преимущества:
- Более устойчива к выбросам
- Легко интерпретировать
Недостатки:
- Менее гладкая в точке ошибки = 0 (проблемы с градиентом)
- Медленнее сходится при обучении
4. Huber Loss
Комбинирует MSE и MAE. Ведет себя как MSE для малых ошибок и как MAE для больших, что делает ее устойчивой к выбросам.
Формула: L_δ(y, y_pred) =
- 0.5*(y - y_pred)^2 если |y - y_pred| <= δ
- δ*(|y - y_pred| - 0.5*δ) иначе
from sklearn.linear_model import HuberRegressor
import numpy as np
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([1, 2, 3, 4, 5]) # с выбросом на конце
huber = HuberRegressor(epsilon=1.35, max_iter=100, alpha=0.0001)
huber.fit(X, y)
predictions = huber.predict(X)
print(predictions)
# В TensorFlow/Keras
from tensorflow.keras.losses import Huber
loss_fn = Huber(delta=1.0)
Когда использовать:
- Когда в данных есть выбросы, но вы не хотите их полностью игнорировать
- Когда нужна гладкая функция потерь
5. Quantile Loss
Используется для построения предсказаний на разных квантилях распределения, а не только на среднем.
def quantile_loss(y_true, y_pred, quantile):
error = y_true - y_pred
return np.mean(np.maximum(quantile * error, (quantile - 1) * error))
# Пример: предсказываем медиану (quantile=0.5)
y_true = np.array([1, 2, 3, 4, 5])
y_pred = np.array([1.1, 2.1, 2.9, 4.1, 5.2])
loss_q50 = quantile_loss(y_true, y_pred, 0.5)
loss_q75 = quantile_loss(y_true, y_pred, 0.75)
loss_q25 = quantile_loss(y_true, y_pred, 0.25)
print(f"Q50 Loss: {loss_q50:.4f}")
print(f"Q75 Loss: {loss_q75:.4f}")
print(f"Q25 Loss: {loss_q25:.4f}")
Применение:
- Когда важны не точечные предсказания, а интервалы
- Для probabilistic forecasting
6. Log-Cosh Loss
Гладкая аппроксимация MAE. Лучше работает с градиентом, чем MAE, но остается устойчивой к выбросам.
Формула:
L(y, y_pred) = log(cosh(y_pred - y))
import numpy as np
def log_cosh_loss(y_true, y_pred):
return np.mean(np.log(np.cosh(y_pred - y_true)))
y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])
loss = log_cosh_loss(y_true, y_pred)
print(f"Log-Cosh Loss: {loss:.4f}")
# В TensorFlow/Keras
from tensorflow.keras.losses import LogCosh
loss_fn = LogCosh()
Сравнение функций потерь
import matplotlib.pyplot as plt
import numpy as np
errors = np.linspace(-3, 3, 100)
mse = errors ** 2
mae = np.abs(errors)
huber = np.where(np.abs(errors) <= 1.5, 0.5 * errors**2, 1.5 * (np.abs(errors) - 0.75))
log_cosh = np.log(np.cosh(errors))
plt.figure(figsize=(10, 6))
plt.plot(errors, mse, label="MSE")
plt.plot(errors, mae, label="MAE")
plt.plot(errors, huber, label="Huber")
plt.plot(errors, log_cosh, label="Log-Cosh")
plt.xlabel("Ошибка (y_true - y_pred)")
plt.ylabel("Значение функции потерь")
plt.legend()
plt.grid(True, alpha=0.3)
plt.title("Сравнение функций потерь")
plt.show()
Практический выбор функции потерь
| Ситуация | Функция потерь | Причина |
|---|---|---|
| Стандартная задача регрессии | MSE / RMSE | Хорошо работает, интерпретируемо |
| Есть выбросы в данных | MAE / Huber | Устойчивость к выбросам |
| Нужны интервалы предсказания | Quantile Loss | Предсказание разных квантилей |
| Высокие требования к интерпретации | MAE | В исходных единицах |
| Deep learning модели | MSE или Huber | Гладкие функции для оптимизации |
Рекомендации
- Начните с MSE/RMSE - это baseline для большинства задач
- Если видите выбросы - переходите на MAE или Huber Loss
- Проверяйте на валидационном наборе - выбирайте функцию, которая лучше работает именно на ваших данных
- Используйте метрики оценки отдельно от функции потерь - даже если обучаетесь на MSE, оценивайте качество через MAE и RMSE
Выбор функции потерь - это важное решение, которое влияет как на процесс обучения, так и на качество финальной модели.