Дни и рубли в одной регрессии: как сравнить модели с несколькими целями
Модель предсказывает срок доставки в днях и стоимость в рублях. Общая MAE выглядит аккуратно, но сложение дня и рубля не имеет понятного смысла. Изменение валюты способно поменять победителя, хотя прогнозы по сути те же.
Сначала получить вектор ошибок
mean_absolute_error умеет возвращать отдельную ошибку каждой цели через multioutput="raw_values". Начните с этого результата и подпишите единицы. Усреднение по умолчанию удобно, когда выходы сопоставимы, но не превращает разнородные показатели в единую полезность.
Для приёмки можно задать отдельные ограничения: ошибка срока не больше одного дня, стоимости — не больше ста рублей. Если нужен один балл выбора, допустимо нормировать ошибки на эти заранее согласованные масштабы. Получатся безразмерные отношения к допуску. Их веса тоже являются решением, а не свойством данных.
Показать смену предпочтения
Модель A ошибается на день и десять рублей, B — на десятую дня и тридцать рублей. Сырое среднее предпочитает A из-за меньшей денежной ошибки. Относительно допусков B выигрывает за счёт намного лучшего срока.
Пороговые масштабы заданы до сравнения. Подбирать их после просмотра результата, чтобы победила желаемая модель, означает менять критерий выбора задним числом.
import numpy as np
from sklearn.metrics import mean_absolute_error
y = np.array([[2., 1000.], [4., 2000.]])
pred_a = y + np.array([1., 10.])
pred_b = y + np.array([0.1, 30.])
mae_a = mean_absolute_error(y, pred_a, multioutput="raw_values")
mae_b = mean_absolute_error(y, pred_b, multioutput="raw_values")
tolerance = np.array([1., 100.])
score_a = np.mean(mae_a / tolerance)
score_b = np.mean(mae_b / tolerance)
print({"MAE_A_days_rubles": mae_a.tolist(), "MAE_B_days_rubles": mae_b.tolist(),
"relative_A": score_a, "relative_B": score_b})
assert mae_a.mean() < mae_b.mean()
assert score_b < score_a
assert np.allclose([score_a, score_b], [0.55, 0.2])Нормированный балл A равен 0.55, B — 0.2. Это среднее отношения ошибок к допускам, а не «процент точности». Отдельные ошибки по-прежнему нужны: общий балл может скрыть неприемлемый выход.
Не потерять ограничения за средним
Если один выход критичен, примените жёсткое ограничение до ранжирования остальных кандидатов. Хорошая стоимость не обязана компенсировать опасную ошибку срока. Сначала отберите модели, проходящие обязательные условия, затем сравнивайте оставшиеся.
При смене рублей на тысячи рублей одновременно измените масштаб денежного допуска. Тогда безразмерный балл сохранится. Это полезная проверка: выбор модели не должен зависеть от удобства записи единиц.
Разные цели могут иметь разную полноту разметки. Сохраняйте число известных фактов каждой цели и сравнивайте модели на одних объектах для соответствующего выхода. Иначе общий отчёт смешает изменение качества и состава данных.
В финальной таблице покажите ошибки с единицами, объёмы выборок, допуски и формулу общего балла. Тогда решение можно восстановить, а следующая команда не воспримет среднее дней и рублей как готовый универсальный показатель.
Закрепить на практике
В бесплатном уроке ошибок регрессии вы закрепите единицы MAE, MSE и RMSE. После этой базы разберите несколько целей из статьи и определите, какие ошибки можно сравнивать напрямую. Откройте бесплатный урок и задачи. Полная последовательность тем — в бесплатном курсе.
Продолжить на практике
- Машинное обучение с нуля на Python: первая модель ↗
Бесплатный курс машинного обучения на Python: обучите первую модель в scikit-learn, проверьте её качество и решите 106 задач в браузере.
