TATECHATLAS
◎ Русский
Математика и модели / Руководство

Выбор метрики регрессии для неотрицательных данных в scikit-learn

Выбирайте метрику регрессии для неотрицательных данных, сначала определив цель прогноза, затем выбрав согласованную функцию потерь, например MAE, RMSE или pinball, и наконец сравнив с постоянным базовым прогнозом, используя показатель в стиле D2.

В этом материале

Начните с цели прогноза и цели принятия решений, а не с перечня метрик. Для неотрицательных величин, таких как количества или суммы, mean_absolute_error представляет собой простую неотрицательную функцию потерь со значением 0.0 в качестве лучшего результата и линейной интерпретацией затрат, тогда как root_mean_squared_error также неотрицательна, имеет лучшее значение 0.0, но сильнее штрафует крупные ошибки. Если требуется консервативная верхняя оценка, обучите квантильный регрессор и оцените его с помощью оценщика на основе функции pinball, например make_scorer(mean_pinball_loss, alpha=0.95). Сравнивайте с постоянным базовым прогнозом, используя показатель в стиле D2, и оценивайте несколько метрик вместе в перекрёстной проверке или при поиске гиперпараметров. Если функция оценки навязывается извне, используйте её напрямую; в противном случае предпочтите одну и ту же строго согласованную метрику и для обучения, и для оценки.

Начните с цели прогноза, а не с перечня метрик

Выбор метрики должен следовать цели принятия решений и прогнозируемому функционалу, а не перечню доступных оценок. В руководстве по оценке моделей в scikit-learn первый вопрос заключается в том, навязывается ли функция оценки извне, например, соревнованием или бизнес-контрактом. Если она навязывается, используйте эту функцию оценки напрямую. Если вы можете выбирать, руководство советует начать с конечной цели и применения прогноза, а затем различать прогнозирование и принятие решений.

Для регрессии ответ обычно рассматривается как случайная величина с распределением, поэтому точечный прогноз обычно нацелен на функционал, такой как среднее, медиана или квантиль. После того как функционал определён, руководство рекомендует использовать строго согласованную функцию оценки для этого функционала. Строго согласованная функция оценки соответствует измерению расстояния между прогнозами и истинным целевым функционалом по наблюдениям, и её можно использовать как функцию потерь при обучении, так и как метрику оценки. Это согласование важно, потому что оно сохраняет единый язык для обучения и оценки.

Для неотрицательных целей, таких как количества или суммы, это означает, что нужно решить, нужен ли прогноз, похожий на среднее, похожий на медиану, или квантиль, например верхняя граница, а затем выбрать метрику, согласованную с этим выбором. Перечень метрик вторичен по отношению к этому решению.

Если бизнес-влияние примерно линейно зависит от абсолютной ошибки для неотрицательных величин, начните с mean_absolute_error, потому что её легко объяснить заинтересованным сторонам, и лучшее значение равно 0.0. Если крупные ошибки обходятся disproportionately дорого, перейдите на root_mean_squared_error и чётко укажите, что она сильнее штрафует большие отклонения. Для квантильных целей, таких как консервативная верхняя оценка, обучите квантильный регрессор и оцените его с помощью оценщика на основе функции pinball при выбранном alpha, затем сравните с постоянным базовым прогнозом, используя показатель в стиле D2, чтобы улучшение измерялось относительно простого правила, а не произвольного числа.

Используйте MAE, когда важна абсолютная ошибка для количеств или сумм

Средняя абсолютная ошибка - это неотрицательная функция потерь для регрессии со значением 0.0 в качестве лучшего результата, и её просто интерпретировать, потому что она усредняет абсолютные отклонения. В документации scikit-learn она описывается как неотрицательное значение с плавающей запятой, где лучшее значение равно 0.0, и она поддерживает веса наблюдений и агрегацию по нескольким выходам.

Для неотрицательных целей MAE часто является хорошим первым выбором, когда бизнес-влияние примерно линейно зависит от абсолютной ошибки. Если ошибка в 3 единицы обходится примерно в три раза дороже, чем ошибка в 1 единицу, MAE лучше соответствует этой интуиции, чем метрика с квадратичными потерями. В примере показана небольшая неотрицательная серия, где средняя абсолютная ошибка равна 1.0.

Одно практическое предостережение: MAE линейна по каждой абсолютной ошибке, поэтому она менее чувствительна к очень большим ошибкам, чем метрики с квадратичными потерями, но не игнорирует их. Меньшая чувствительность к выбросам не означает игнорирования крайних ошибок.

from sklearn.metrics import mean_absolute_error

y_true = [0, 2, 5, 9]
y_pred = [1, 2, 4, 10]

mae = mean_absolute_error(y_true, y_pred)
print(mae)
# 1.0

Используйте RMSE или среднеквадратическую ошибку, когда большие ошибки дороги

Среднеквадратическая ошибка также является неотрицательной функцией потерь для регрессии со значением 0.0 в качестве лучшего результата, и она была добавлена в scikit-learn в версии 1.4. Поскольку она возводит ошибки в квадрат перед усреднением, а затем извлекает квадратный корень, она сильнее подчёркивает крупные отклонения, чем MAE.

Это делает RMSE разумным выбором, когда большие ошибки обходятся disproportionately дорого, например, когда недопрогноз или перепрогноз неотрицательной суммы имеет нелинейную стоимость. В примере используются те же входные данные, что и в примере с MAE, и показывается немного большее значение, потому что наибольшая ошибка сильнее вносит вклад при возведении в квадрат.

Распространённое заблуждение - рассматривать RMSE как стандартное отклонение ошибок в общем случае. Это равенство требует особых условий, таких как нулевое среднее значение ошибки и соответствующий делитель, поэтому безопаснее описывать RMSE по её профилю чувствительности, а не приравнивать к стандартному отклонению ошибок. Также при переводе относительных изменений пересчитывайте их из исходного знаменателя и сохраняйте квадратный корень при каждом переводе RMSE.

from sklearn.metrics import root_mean_squared_error

y_true = [0, 2, 5, 9]
y_pred = [1, 2, 4, 10]

rmse = root_mean_squared_error(y_true, y_pred)
print(rmse)
# 1.118033988749895

Рассмотрите квантиль и функцию потерь pinball для несимметричного риска на неотрицательных данных

Когда целью не является центральный точечный прогноз, а консервативная верхняя оценка для неотрицательного спроса, квантильная регрессия и функция потерь pinball полезны. В документации scikit-learn показана mean_pinball_loss, и объясняется, что можно создать оценщик с конкретным alpha, например make_scorer(mean_pinball_loss, alpha=0.95).

Этот оценщик можно использовать для оценки обобщающей способности квантильного регрессора через перекрёстную проверку, а также для настройки гиперпараметров, если переключить знак так, чтобы большее значение означало лучший результат. В документации также указана примерная тема о интервалах прогноза для градиентного бустинга в регрессии, где функция потерь pinball используется для оценки и настройки квантильной регрессии на данных с несимметричным шумом и выбросами.

Это важно для неотрицательных данных, потому что риск может быть асимметричным: недопрогноз спроса может быть дороже перепрогноза или наоборот. Квантильная цель позволяет нацелиться на эту асимметрию напрямую, а функция потерь pinball даёт согласованный способ её оценки.

from sklearn.metrics import mean_pinball_loss, make_scorer

mean_pinball_loss_95p = make_scorer(mean_pinball_loss, alpha=0.95)

# Illustrative use with a quantile regressor:
# cross_val_score(estimator, X, y, cv=5, scoring=mean_pinball_loss_95p)

Используйте показатели навыков в стиле D2 для сравнения с постоянным базовым прогнозом

В документации scikit-learn D2 описывается как доля объяснённого отклонения, и это обобщение R2, где квадратичная ошибка заменяется выбранной функцией отклонения, такой как Tweedie, pinball или средняя абсолютная ошибка. Это форма показателя навыка и вычисляется как единица минус отношение отклонения модели к отклонению нулевой модели.

Нулевой прогноз зависит от выбранной функции отклонения: для Tweedie это среднее значение y_true, для абсолютной ошибки это медиана, а для функции потерь pinball это квантиль alpha. Постоянная модель, которая всегда прогнозирует это нулевое значение, получает D2, равный 0.0, лучший возможный результат равен 1.0, а показатель может быть отрицательным, потому что модель может быть сколь угодно хуже нулевой модели.

Для неотрицательной регрессии это полезно, потому что оно контекстуалирует улучшение относительно простого постоянного базового прогноза вместо произвольного абсолютного числа. Если вы выбираете D2 на основе pinball, то базовый прогноз сам становится соответствующим квантилем, что согласуется с целью квантильного прогноза.

Оценивайте несколько метрик вместе в перекрёстной проверке и поиске

Scikit-learn позволяет оценивать несколько метрик в GridSearchCV, RandomizedSearchCV и cross_validate. В документации описаны три способа задания нескольких метрик оценки: как итерируемый объект со строковыми именами метрик, как словарь, сопоставляющий имя оценщика с функцией оценки или заранее определённой строкой, или как вызываемый объект, возвращающий словарь оценок.

Для неотрицательной регрессии это полезно, потому что одна метрика редко рассказывает всю историю. Вы можете захотеть MAE для линейной интерпретируемости, RMSE для чувствительности к крупным ошибкам и оценщик на основе pinball для квантильной цели, все оцененные на одних и тех же разбиениях перекрёстной проверки.

Практическое замечание из документации: пользовательские оценщики, используемые с n_jobs больше 1, более надёжны, когда они импортируются из другого модуля, а не определены встроенно. Также обращайте внимание на соглашения о знаках при обёртке функции потерь в оценщик, потому что greater_is_better должно соответствовать тому, является ли метрика функцией потерь или оценкой.

from sklearn.model_selection import cross_validate
from sklearn.metrics import mean_absolute_error, root_mean_squared_error, make_scorer

scoring = {
    'mae': make_scorer(mean_absolute_error),
    'rmse': make_scorer(root_mean_squared_error),
}

# cv_results = cross_validate(estimator, X, y, scoring=scoring, cv=5)

Используйте базовые оценщики как проверку регрессии на здравый смысл

В документации scikit-learn базовые оценщики описываются как простая проверка на здравый смысл при обучении с учителем: сравнивайте ваш оценщик с простыми правилами эвристики. DummyClassifier реализует несколько стратегий для классификации, и та же идея в духе применима к базовым прогнозам в регрессии, где постоянное значение или простое правило помогает судить, улучшает ли модель тривиальные прогнозы.

В документации подчёркивается, что при этих базовых стратегиях метод predict полностью игнорирует входные данные, что именно и делает их полезными в качестве базовых прогнозов: они показывают, как выглядит производительность, когда модель не использует информацию из признаков.

Для неотрицательной регрессии постоянный базовый прогноз может быть особенно информативным в сочетании с показателем в стиле D2, потому что нулевая модель определяется относительно выбранной функции отклонения. Если ваша модель не может превзойти разумное постоянное правило, это серьёзный сигнал для пересмотра признаков, преобразования цели или метрики оценки.

Согласуйте функцию потерь при обучении, метрику оценки и бизнес-оценку

В руководстве по оценке моделей говорится, что после выбора строго согласованной функции оценки лучше использовать её и для обучения, и для оценки. Эта рекомендация особенно актуальна для неотрицательной регрессии, потому что функционал цели и структура затрат должны управлять метрикой, а не удобство.

Если функция оценки навязывается извне, используйте её напрямую, даже если она не является самой удобной функцией потерь для обучения. Если вы можете выбирать, выберите метрику, соответствующую цели прогноза, а затем согласуйте обучение и оценку с ней там, где это возможно.

На практике это может означать использование MAE или RMSE для точечного прогноза, ориентированного на среднее или медиану, использование функции потерь pinball для квантильной цели и использование показателя в стиле D2 для передачи улучшения относительно постоянного базового прогноза. Ключевой момент - метрика должна отражать проблему принятия решений, и та же логика должна направлять обучение и оценку, когда у вас есть свобода выбирать.

Что проверить

  • Сначала определите функционал прогноза: среднее, медиана, квантиль или полное распределение, потому что выбор метрики зависит от этого выбора.
  • Используйте mean_absolute_error, когда важна абсолютная ошибка для неотрицательных количеств или сумм, а бизнес-влияние примерно линейно.
  • Используйте root_mean_squared_error, когда большие ошибки обходятся disproportionately дорого, поскольку она сильнее подчёркивает крупные отклонения, чем MAE.
  • Для квантильных целей создайте оценщик через make_scorer(mean_pinball_loss, alpha=...) и оценивайте или настраивайте квантильный регрессор с его помощью.
  • Сравнивайте модели с постоянным базовым прогнозом, используя показатель в стиле D2, помня, что нулевой прогноз зависит от выбранной функции отклонения.
  • Оценивайте несколько метрик вместе, передавая список, словарь или вызываемый объект, возвращающий словарь, в GridSearchCV, RandomizedSearchCV или cross_validate.
  • Используйте базовый оценщик как проверку регрессии на здравый смысл, чтобы увидеть, улучшает ли модель тривиальное правило.
  • Если функция оценки навязывается извне, используйте её напрямую; в противном случае согласуйте функцию потерь при обучении и метрику оценки с одной и той же строго согласованной функцией оценки.

Приведённые источники не дают полного правила выбора для каждого случая регрессии с неотрицательными данными. Выбор метрики всё ещё зависит от приложения, структуры затрат и функционала цели, который прогнозируется. Само наличие неотрицательных данных не определяет лучшую метрику. Пользовательские оценщики и многометрическая оценка могут требовать дополнительной осторожности при параллелизации и соблюдении соглашений о знаках, например, когда необходимо правильно установить greater_is_better для функции потерь. Примеры в источниках иллюстративны и могут зависеть от деталей набора данных, случайных состояний или версий библиотеки.

Источники

  1. scikit-learn: model evaluation ↗
  2. scikit-learn: mean_absolute_error ↗
  3. scikit-learn: root_mean_squared_error ↗
Наверх ↑