Краткая демонстрация мощи простой разработки функций с использованием данных о ценах продажи домов и модели LightGBM.

Краткая предыстория

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

Процесс можно разбить на более конкретные этапы (ни исчерпывающие, ни последовательные):

  1. Очистка данных — например. замена или вменение отсутствующих данных.
  2. Кодирование данных — преобразование категориальных типов данных в числовые типы данных.
  3. (Повторное) масштабирование данных — соответствующее преобразование числовых данных либо в соответствии с желаемым распределением, либо в желаемом диапазоне, что может быть необходимо из-за использования штрафов за регуляризацию или для повышения производительности нейронных сетей.
  4. Разложение данных — «составные» элементы данных можно разделить на составные части. Например, элемент данных, содержащий некоторое указание на комбинацию пол x возраст (например, «молодой мужчина»), может быть разделен на два отдельных элемента, один из которых описывает пол, а другой возраст.
  5. Перекомпоновка данных — отдельные элементы данных могут быть объединены в один элемент данных. Например, отдельные элементы данных пол и возраст можно объединить в один составной признак пол x возраст.

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

Зачем инженерные функции?

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

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

Примером этого является включение взаимодействия пол x возраст в прогнозирование убытков по автострахованию: мы обычно признаем, что страховой «риск» может варьироваться в зависимости от возраста (обычно выше в младшем и старшем возрасте) и с полом (обычно выше у мужчин, чем у женщин). Но как быть с молодыми мужчинами? Или старые самки? Включение в модель только возраста и пола в качестве основных эффектов потенциально может охватывать большую часть эффекта, но также включение члена взаимодействия может повысить мощность модели.

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

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

Например:

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

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

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

Есть несколько способов, с помощью которых мы могли бы обнаружить это:

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

Эксперимент

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

Во-первых, давайте получим некоторые данные. В этом примере мы будем использовать данные конкурса Kaggle House Prices — Advanced Regression Techniques (доступны для общего доступа, загружены 17/12/2021 из House Prices — Advanced Regression Techniques | Kaggle), который основан на набор данных Ames Housing, составленный Дином Де Коком для использования в образовании по науке о данных — Примеры: (amstat.org)).

В двух словах:

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

Гипотеза: простое проектирование признаков может повысить прогностическую силу модели LightGBM, предсказывающую цену продажи.

Ключевые правила

Чтобы быть честными при проверке нашей гипотезы, мы установим следующие ограничения:

  1. Целевые значения не будут преобразованы никоим образом.
  2. Оценка производительности модели будет проводиться на данных вне свертывания с использованием стратегии 5-кратной перекрестной проверки.
  3. Кодирование, масштабирование и преобразование будут определяться типом функции; это означает, что новые функции будут обрабатываться так же, как и исходные функции. В нашем примере мы не будем выполнять числовое преобразование и будем использовать стандартную обработку LightGBM для категориальных функций.
  4. Гиперпараметры модели будут постоянными для всех прогонов модели, и не будет настройки гиперпараметров.

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

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

Давайте идти!

Обработка необработанных данных

Как упоминалось ранее, нам нужно обработать недостающие данные. Мы сделаем это следующими способами:

  1. Если отсутствие вызвано подходом к сбору данных, мы заполним пропущенные значения соответствующим значением (например, «Нет» или 0).
  2. В случае непредвиденной пропажи мы вменяем недостающую стоимость на основе характеристик других домов по соседству. Если мы рассматриваем категориальный признак, отсутствующее значение будет заменено наиболее распространенным значением в окрестности. Если мы рассматриваем числовой признак, отсутствующее значение будет заменено медианным значением в окрестности.

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

Подготовка базовых данных

Простой небольшой скрипт для разделения входных данных, идентификатора перекрестной проверки и целевой переменной:

Подготовка дополненных данных

А теперь самое интересное — создание новых функций.

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

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

Тем не менее, это функции и эффекты, которые модели LightGBM не придется разрабатывать самостоятельно.

Кстати говоря, давайте посмотрим, как мы справились с моделированием и прогнозированием вне сгиба…

Построение модели и прогнозирование

Мы собираемся использовать подход LightGBM перекрестной проверки. Это позволяет нам обучать k моделей на соответствующих складках одним вызовом (и без использования цикла).

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

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

  1. Создайте список (не индекс!) названий функций.
  2. Создайте список функций (имен функций), которые являются категориальными.
  3. Преобразуйте каждую категориальную функцию в тип category data.
  4. Подайте списки и данные в LightGBM в качестве параметров.

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

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

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

И результаты!

Результаты нашего эксперимента таковы:

Кажется, у нас есть полная проверка — то есть по 5 различным показателям модель, построенная на расширенном наборе данных, превосходит модель, построенную на базовом наборе данных. Это очень сильный результат!

Завершение

… с некоторой бессвязностью.

  • В этой статье мы рассмотрели некоторые теории разработки функций, а именно виды разработки функций, с которыми мы можем столкнуться в реальной жизни. Мы кратко коснулись наложения моделей как подхода к разработке функций, но не вдавались в подробности.
  • Мы также рассказали о некоторых мотивах относительно того, почему мы должны рассмотреть разработку функций. Как всегда в моих статьях, мои списки не являются исчерпывающими, и мы, скорее всего, только коснулись поверхности айсберга разработки функций.
  • Мы поэкспериментировали с разработкой некоторых функций, используя образец набора данных. Параметры эксперимента оставались постоянными, варьировался только набор входных данных. По 5 различным показателям производительности моделей, рассчитанным на основе прогнозов модели вне сгиба, мы увидели, что модели, построенные с использованием расширенного набора данных, превосходят модели, построенные с использованием базовых данных.
  • Это не означает, что так будет всегда или что улучшение производительности всегда будет столь значительным. Изменение некоторых элементов в пайплайне — например. внедрение более сложной обработки данных или введение этапа настройки гиперпараметров может изменить результаты.
  • Здесь мы выполнили очень базовую разработку функций. В будущем я хотел бы попробовать некоторые более продвинутые методы, такие как неотрицательная матричная факторизация, анализ главных компонентов и стохастическое встраивание окрестностей с t-распределением. Эти методы намного сложнее, чем простые суммирования и различия, которые мы проводили!
  • Чтобы оценить влияние новых функций, мы решили полностью перестроить модели. Поскольку это может оказаться невозможным в реальном сценарии, нам, возможно, придется использовать другой подход к оценке ценности новых функций, возможно, путем «повышения» существующей модели. Было бы интересно выполнить аналогичный поэкспериментируйте с этим подходом — возможно, на потом!

Как всегда, я надеюсь, вам понравилось читать это так же, как мне понравилось писать!

С Новым годом, и пусть 2022 год принесет много хорошего.