"Начиная"

Учимся на ошибках машинного обучения

Как найти слабые места регрессионной модели

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

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

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

В этом посте я более подробно расскажу о подходе к оценке производительности регрессионной модели.

Ошибки регрессии: слишком много или слишком мало?

Когда мы прогнозируем непрерывную переменную (например, цену, спрос и т. Д.), Здравый смысл определяет ошибку просто: мы хотим, чтобы прогнозы модели были как можно ближе к фактическим.

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

Недооценка или переоценка целевого значения может иметь различные последствия для бизнеса. Особенно, если поверх вывода модели есть бизнес-логика.

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

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

Чтобы объяснить эту концепцию анализа смещения ошибок, давайте рассмотрим пример.

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

Допустим, у нас есть модель, которая прогнозирует спрос на аренду городских велосипедов. (Если вы хотите поиграть с этим вариантом использования, этот набор данных прогнозирования спроса на велосипеды доступен в открытом доступе).

Мы обучили модель, смоделировали развертывание и сравнили ее производительность в «производстве» с тем, насколько хорошо она работает на обучающей выборке.

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

Здесь мы видим значительное увеличение ошибки между эталонной производительностью в обучении и текущей производственной эффективностью.

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

Все выглядит не идеально, и мы хотим глубже разобраться в происходящем. То же самое и с заинтересованными сторонами в нашем бизнесе. Почему возникают эти ошибки? Где именно? Поможет ли переподготовка улучшить качество? Нам нужно разработать новые функции или создать дополнительную пост-обработку?

Вот идея, как это исследовать.

Глядя на края

Сводные показатели качества показывают нам среднюю производительность. Однако это крайние случаи, которые часто могут дать нам полезную информацию. Посмотрим прямо туда!

Мы можем сгруппировать прогнозы, в которых есть много ошибок, и извлечь из них что-то полезное.

Как мы можем реализовать этот подход?

Давайте возьмем каждый прогноз и вычислим ошибку. Затем мы создаем две группы по типам ошибок:

  • Завышение. Случаи, когда модель предсказывает значения, которые выше фактических.
  • Недооценка. Случаи, когда модель предсказывает значения ниже фактических.

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

Остальные 90% прогнозов - это «большинство». Ошибка в этой группе должна быть близка к средней.

Так мы можем визуализировать предлагаемые сегменты. Мы хотели бы видеть такую ​​ситуацию: большинство прогнозов близки к фактическим значениям. Анализ выбросов может дать значимое понимание.

Чем это может быть полезно?

Возьмем пример временного ряда. Если мы построили отличную модель и «узнали» весь сигнал из данных, ошибка должна быть случайной. Никакого рисунка быть не должно. За исключением нескольких вероятных выбросов, ошибка будет близка к средней во всех группах. Иногда немного больше, иногда меньше. Но в среднем примерно так же.

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

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

Обнаружение недостатков

В нашем случае мы видим, что ошибка как в группе переоценки, так и в группе недооценки значительно выше, чем в группе «большинства».

Затем мы можем попытаться исследовать и изучить новые закономерности.

Для этого мы смотрим на объекты внутри обеих 5% -групп и смотрим, какие значения характеристик им соответствуют. По возможности, по возможности.

Наша цель - определить, существует ли связь между значениями конкретных функций и высокой ошибкой. Чтобы получить более глубокое представление, мы также делаем различие между переоценкой и недооценкой.

Представьте, что мы прогнозируем расходы на здравоохранение и постоянно переоцениваем цену для пациентов определенной демографии? Или ошибка объективная, но большая, и наша модель не работает на определенном сегменте? Это своего рода понимание, которое мы хотим найти.

Мы можем создать сложный (и тяжелый в вычислительном отношении) алгоритм для поиска неэффективных сегментов. В качестве разумной замены мы можем просто проводить этот анализ по каждому признаку.

Как это сделать? Давайте изобразим распределение функций и наш целевой спрос и выделим цветом примеры, в которых мы допустили большое количество ошибок.

В нашем сценарии использования прогноза спроса на велосипеды мы уже можем получить некоторые идеи. Если мы построим график функции «влажность», мы можем заметить, что наша модель теперь значительно переоценивает потребность, когда значения влажности находятся между 60 и 80 (график справа).

Мы видели эти значения в нашем наборе обучающих данных (на графике слева), но ошибка была несмещенной и одинаковой во всем диапазоне.

Мы можем заметить и другие закономерности. Например, по температуре. Модель также переоценивает спрос при температуре выше 30 ° C.

Теперь мы можем подозревать, что что-то случилось с погодой, и появились новые связанные закономерности. На самом деле мы обучили модель, используя данные только по холодным месяцам в году. Когда дело дошло до «производства», лето только началось. С новой погодой появились новые сезонные модели, которые модель не могла уловить раньше.

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

Как сделать то же самое для моей модели?

Мы реализовали этот подход в библиотеке с открытым исходным кодом Evidently. Чтобы использовать его, вы должны подготовить данные своего модельного приложения в виде фрейма данных pandas, включая функции модели, прогнозы и фактические (целевые) значения.

Библиотека будет работать с одним или двумя DataFrame - если вы хотите сравнить производительность вашей модели в производственной среде с данными обучения или каким-либо другим прошлым периодом.

Отчет о производительности регрессии будет генерировать набор графиков производительности модели и таблицу смещения ошибок. Таблица помогает изучить взаимосвязь между значениями функций и типом и размером ошибки.

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

Полную документацию вы можете прочитать на Github.

Когда это полезно?

Мы считаем, что такой анализ может быть полезен более чем один раз в жизненном цикле вашей модели. Вы можете использовать это:

  1. Для анализа результатов модельного теста. Например, после проверки модели в автономном тесте, после A / B-теста или теневого развертывания.
  2. Для постоянного мониторинга вашей модели в производстве. Вы можете делать это при каждом запуске пакетной модели или запланировать это как обычное задание.
  3. Чтобы принять решение о переобучении модели. Просматривая отчет, вы можете определить, пора ли обновить модель или поможет ли переобучение.
  4. Для отладки моделей в производстве. Если качество модели не соответствует требованиям, вы можете определить сегменты, в которых модель неэффективна, и решить, как с ними бороться. Например, вы можете предоставить больше данных для низкоэффективных сегментов, перестроить модель или добавить к ней бизнес-правила.

Если вам нужен практический пример, вот учебник по отладке производительности модели машинного обучения в производственной среде: Как сломать модель за 20 дней.