RMSLE (Root Mean Squared Logarithmic Error) — это корень из среднеквадратичной логарифмической ошибки. Это мощная метрика, особенно полезная для специфических типов данных.
Что такое RMSLE?
RMSLE — это метрика, которая измеряет разницу между логарифмами фактических и предсказанных значений. Она менее чувствительна к большим выбросам, чем RMSE, и обладает интересными свойствами для работы с данными, имеющими большой разброс.
Формула RMSLE
RMSLE = √[ (1/n) × Σ (log(yᵢ + 1) - log(ŷᵢ + 1))² ]
Или эквивалентно:
RMSLE = √[ (1/n) × Σ (log((yᵢ + 1)/(ŷᵢ + 1)))² ]
Где:
- yᵢ — фактическое значение
- ŷᵢ — предсказанное значение
- log — натуральный логарифм (обычно)
- n — количество наблюдений
Как рассчитывается RMSLE? Простой пример
Рассмотрим прогноз продаж:
| Факт (yᵢ) | Прогноз (ŷᵢ) | log(yᵢ + 1) | log(ŷᵢ + 1) | Разность² |
|---|---|---|---|---|
| 100 | 90 | log(101) ≈ 4.615 | log(91) ≈ 4.511 | (0.104)² ≈ 0.0108 |
| 1000 | 1200 | log(1001) ≈ 6.909 | log(1201) ≈ 7.090 | (-0.181)² ≈ 0.0328 |
| 50 | 70 | log(51) ≈ 3.932 | log(71) ≈ 4.263 | (-0.331)² ≈ 0.1096 |
| 200 | 180 | log(201) ≈ 5.303 | log(181) ≈ 5.198 | (0.105)² ≈ 0.0110 |
Расчет RMSLE:
- Сумма квадратов разностей: 0.0108 + 0.0328 + 0.1096 + 0.0110 = 0.1642
- Среднее значение: 0.1642 / 4 = 0.04105
- Квадратный корень: √0.04105 ≈ 0.2026
Ключевые особенности RMSLE
1. Асимметричность штрафов
RMSLE по-разному наказывает за занижение и завышение прогноза:
- Сильнее штрафует за занижение (когда ŷᵢ < yᵢ)
- Меньше штрафует за завышение (когда ŷᵢ > yᵢ)
Пример:
- Факт: 100, Прогноз: 50 → большая ошибка
- Факт: 100, Прогноз: 150 → меньшая ошибка
2. Относительная, а не абсолютная ошибка
RMSLE учитывает относительную ошибку, а не абсолютную:
- Ошибка между 1000 и 2000 ≈ ошибке между 1 и 2
- В RMSE первая ошибка была бы в 1000 раз больше!
3. Устойчивость к выбросам
Поскольку используется логарифм, большие значения не доминируют в метрике так сильно, как в RMSE.
Преимущества RMSLE
- Подходит для данных с большим разбросом: Когда данные охватывают несколько порядков величины (например, от 1 до 1,000,000)
- Устойчивость к выбросам: Не позволяет экстремальным значениям полностью доминировать в оценке ошибки
- Соответствует человеческому восприятию: Люди часто воспринимают ошибки относительными, а не абсолютными
- Работает с гетероскедастичными данными: Когда изменчивость данных непостоянна
Недостатки RMSLE
- Сложность интерпретации: Не так интуитивна, как MAE или MAPE
- Асимметричность: Не всегда желательно разное отношение к завышению и занижению
- Не определена для отрицательных значений: Так как логарифм от отрицательного числа не определен
- Чувствительность к малым значениям: Может быть чувствительна, когда и фактические, и предсказанные значения близки к нулю
Когда использовать RMSLE?
Идеальные случаи для RMSLE:
- Прогнозирование продаж: Когда есть большие различия между продажами разных товаров
- Предсказание цен на недвижимость: Цены могут варьироваться от десятков тысяч до миллионов
- Прогнозирование спроса: От единичных покупок до массовых продаж
- Предсказание веб-трафика: От нескольких посещений до вирусного контента
- Работа с экспоненциальными распределениями
Пример из практики:
Задача: Предсказать ежедневные продажи в розничной сети:
- Одни товары продаются 1-2 штуки в день
- Другие — тысячи штук в день
RMSE будет доминироваться ошибками для товаров-хитов, игнорируя точность для нишевых товаров. RMSLE уравновешивает вклад всех товаров.
Сравнение с другими метриками
| Ситуация | Факт | Прогноз | RMSE | RMSLE |
|---|---|---|---|---|
| Малая ошибка | 100 | 90 | 10 | 0.105 |
| Большая ошибка | 1000 | 500 | 500 | 0.693 |
| Относительная ошибка | 10 | 5 | 5 | 0.693 |
| Относительная ошибка | 1000 | 500 | 500 | 0.693 |
Видно, что RMSLE дает одинаковую оценку для одинаковых относительных ошибок, независимо от масштаба.
Практическая реализация
В Python вычисление RMSLE выглядит так:
import numpy as np
def rmsle(y_true, y_pred):
"""
Вычисляет RMSLE между фактическими и предсказанными значениями
"""
# Добавляем 1 чтобы избежать log(0)
log_true = np.log1p(y_true) # log1p(x) = log(x + 1)
log_pred = np.log1p(y_pred)
squared_errors = (log_true - log_pred) ** 2
return np.sqrt(np.mean(squared_errors))
# Пример использования
y_true = np.array([100, 1000, 50, 200])
y_pred = np.array([90, 1200, 70, 180])
print(f"RMSLE: {rmsle(y_true, y_pred):.4f}")Резюме
RMSLE — это специализированная метрика, которая особенно полезна когда:
- Данные имеют большой разброс (несколько порядков величины)
- Относительные ошибки важнее абсолютных
- Вы хотите уменьшить влияние выбросов
- Занижение прогноза критичнее, чем завышение
Для стандартных задач с равномерно распределенными данными лучше подходят MAE или RMSE, но для специфических случаев с широким диапазоном значений RMSLE может быть оптимальным выбором.