Альтернативные способы еще больше улучшить оценку модели

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

Псевдомаркировка

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

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

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

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

Почему это работает?

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

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

Удаление выбросов с помощью прогнозов модели

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

Существует более продвинутый способ работы с выбросами. Этот метод позволяет не только удалять выбросы с точки зрения слишком больших/малых значений одного признака, но также имеет дело с взаимодействиями выброса признаков.

Техника очень проста в своей основной идее:

  • Во-первых, модель обучается и настраивается стандартным образом, включая выбор функций, настройку гиперпараметров и так далее.
  • Затем прогнозы делаются в режиме OOF (Out-Of-Folds) для строк обучающих данных.
  • Ошибка (или любая другая релевантная метрика для конкретной проблемы) прогноза вычисляется для каждой строки.
  • Строки с наибольшими ошибками определяются как выбросы. Процент удаляемых строк может различаться в каждом случае.
  • Модель повторно обучается на обучающих данных с удалением идентифицированных строк-выбросов.

Почему это работает?

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

  • есть выброс в одном или нескольких существенных признаках;
  • этикетка неверна (из-за ошибки в маркировке, человеческой ошибки или по какой-либо другой причине);
  • это какой-то конкретный редкий случай, который модель не смогла извлечь из заданных данных.

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

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

Увеличение данных

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

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

Существуют различные методы увеличения данных для всех типов данных — числовых данных, временных рядов, изображений и текстовых данных. Например, изображения можно поворачивать, обрезать или наклонять по-разному. С логической точки зрения картинка на изображении (а значит, и оригинальная этикетка тоже) не меняется. Но для модели. это новое изображение выглядит иначе и помогает сделать модель более надежной.

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

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

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

Объяснение прогнозов модели

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

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

Но график важности функций — не единственный источник информации об использовании функций. Есть больше возможностей копнуть глубже во внутренности модели. LIME и SHAP — некоторые из них (технические подробности о них я оставлю для вашего собственного исследования, если интересно). Преимущество этих подходов заключается не только в проверке того, какие функции используются моделью, но и в проверке направления влияния функций. Это дает нам понимание того, что более низкие значения конкретной функции приводят к более низким или более высоким значениям цели. Это знание позволяет нам использовать знание предметной области, чтобы судить, имеет ли смысл такая интерпретация признаков.

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

Несколько заключительных слов

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

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

Спасибо за прочтение!