Как управлять категорическими переменными в моделях деревьев решений

Введение: почему в деревьях решений важны переменные

Модели дерева решений являются одними из наиболее интерпретируемых алгоритмов машинного обучения, что делает их выбором для задач классификации и регрессии в таких областях, как финансы, здравоохранение и маркетинг. Их прозрачные правила принятия решений позволяют заинтересованным сторонам понять, почему делается прогноз. Однако производительность и надежность дерева решений в значительной степени зависят от того, как предварительно обрабатываются категориальные переменные. Категориальные данные - значения, такие как [FLT: 1], [FLT: 2]] тип продукта [[FLT: 3]] или [FLT: 4]] сегмент клиента не может быть напрямую введен в большинство алгоритмов деревьев без надлежащего кодирования. Наивный подход может ввести предвзятость, увеличить вычислительные накладные расходы или даже нарушить способность модели захватывать значимые расколы. Эта статья предоставляет всеобъемлющее руководство по обработке категориальных переменных в моделях дерева решений, охватывающих методы кодирования, поддержку нативных алгоритмов и лучшие практики для создания надежных, высокоэффективных моделей.

Понимание категориальных переменных

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

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

Общие методы кодирования

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

Обычная кодировка (Ordinal Encoding)

Кодирование этикеток присваивает уникальное целое число каждой категории, обычно 0, 1, 2, ... для категорий K. Этот метод прост и эффективен для памяти, потому что он не увеличивает количество функций. Однако он подразумевает искусственное порядковое отношение, которое может ввести в заблуждение дерево решений. Например, дерево может узнать, что разделение , уровень образования >= 2 отделяет «мастер» от «бакалавр», что справедливо для порядковых данных. Но для номинальных данных, таких как цвета, кодирование этикеток будет ложно предполагать, что «зеленый» (2) больше, чем «красный» (0), что приводит к бессмысленным расколам.

Когда использовать: Только для порядковых категориальных признаков, где целое число порядка отражает истинную иерархию.Многие реализации scikit-learn требуют, чтобы вы вручную предоставили правильный порядок через отображение, или использовали с заранее заданным списком категорий.

Одногорячее кодирование

Одногорячее кодирование создает K бинарных фиктивных переменных, каждый из которых представляет наличие (1) или отсутствие (0) категории. Этот метод исключает любое искусственное упорядочивание и, как правило, безопасен для номинальных данных. Большинство библиотек дерева решений, включая scikit-learn's , хорошо работают с одногорячими функциями, потому что разделения являются простыми тестами «присутствует ли категория?».

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

Практический совет: Однократный кодирование только после разделения данных на обучающие и тестовые наборы, чтобы избежать утечки данных. Бросьте одну категорию (использовать в пандах get dummies) для линейных моделей, но для деревьев решений, сохраняющих все колонки K, обычно хорошо, потому что дерево будет обрабатывать их независимо.

Частота / Целевой код

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

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

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

Бинарное кодирование

Бинарное кодирование сначала преобразует категории в целые ярлыки (0 к K-1), а затем представляет каждое целое число в двоичной форме, создавая новые столбцы log2 (K). Это компромисс между одногорячим и кодированием ярлыков: оно производит меньше функций, чем одногорячее, но менее интерпретируемые расколы. Некоторые практикующие находят его эффективным для функций высокой сердечности в моделях на основе деревьев.

Hashing Encoding скачать

Функциональное хеширование (или хеширование) применяет хеш-функцию к каждой категории и принимает модуль количества выходных контейнеров. Это может резко уменьшить размеры и полезно, когда количество категорий огромно (например, IP-адреса). Однако столкновения (разные категории, отображающие на один и тот же bin) могут ухудшить качество модели. Это редко первый выбор для деревьев решений, если ограничения памяти не являются серьезными.

Поддержка коренных жителей в библиотеках деревьев решений

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

scikit-learn (Десятилетие / Случайный лес / ГрадиентБуст)

scikit-learn не обрабатывает категориальные признаки. Все входные данные должны быть числовыми. Вы должны кодировать категориальные переменные перед их поступлением в модель. Однако последние версии (≥0,24) ввели и , которые принимают категориальные признаки непосредственно через параметр — но это ограничено реализацией на основе гистограммы. Для классических DecisionTree и RandomForest по-прежнему требуется ручное кодирование.

документация по ординальному кодеру

Световой GBM

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

Поддержка категориальных функций LightGBM

CatBoost

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

Категория CatBoost: документация

XGBoost

По состоянию на версию 1.6, XGBoost ввел экспериментальную поддержку категориальных признаков через параметр и аргумент . Он использует подход на основе разделения, аналогичный LightGBM. Однако реализация все еще созревает; многие практикующие продолжают использовать ручное кодирование с XGBoost.

Выбор правильной стратегии кодирования

Выбор метода кодирования зависит от нескольких факторов:

  • Кардинальность — Для номинальных признаков низкой сердечности (≤10 категорий) одногорячее кодирование просто и эффективно. Для умеренной кардинальности (10–100) рассмотрим двоичное кодирование или целевое кодирование. Для высокой кардинальности (>100) используют нативную поддержку (LightGBM/CatBoost) или частотное/целевое кодирование.
  • Модельная библиотека — Если вы уже используете CatBoost или LightGBM, пусть библиотека обрабатывает категориальные.
  • Порядок категорий — Порядковые функции должны использовать порядковое кодирование. Кодирование этикеток без сохранения порядка рискованно для номинальных данных.
  • Интерпретируемость — Одногорячие закодированные функции производят прозрачные расколы (например, ). Бинарное или целевое кодирование снижает интерпретируемость, которая может быть приемлемой для задач, ориентированных на прогнозирование, но не для нормативных требований.
  • Глубина дерева и переобучение — Кодирование цели может привести к переобучению, если не упорядочено; одногорячее кодирование может привести к очень мелким расколам для редких категорий.

Обработка особенностей высокой кардиологии

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

  • Значительно увеличить использование памяти и время обучения.
  • Дерево делится на редкие категории, которые не обобщаются.
  • Сделайте модель чувствительной к новым категориям, которые появляются в производстве (если не обрабатывается с «неизвестным» броском).

Решения включают:

  1. Целевая кодировка с сглаживанием — Замените каждую категорию целевой средней, но уменьшите оценки для небольших категорий до глобальной средней.
  2. Частотное кодирование — Используйте подсчет каждой категории в качестве числового признака. Это часто хорошо работает с моделями деревьев, потому что частые категории с большей вероятностью являются надежными предикторами.
  3. Хеширование характеристик — Категории карт для фиксированного числа контейнеров (например, 2^16) с использованием хеш-функции. Это практичный выбор для очень высокой кардинальности, но может вводить шум от столкновений.
  4. Группировка редких категорий — объединение всех категорий, которые появляются меньше, чем, скажем, 5 раз, в одну «другую» группу.Это снижает кардинальность и стабилизирует модель.
  5. Использование методов, специфичных для дерева — Библиотеки, такие как LightGBM, могут эффективно обрабатывать кардинальные величины до нескольких тысяч без взрыва матрицы функций, потому что они учатся группировать категории внутри.

Влияние на производительность модели и интерпретируемость

Метод кодирования напрямую влияет как на точность, так и на интерпретируемость деревьев решений. Например, одногорячее кодирование дает расколы, которые легко объяснить: «если занятие является «инженерным», то ветвь остается». Напротив, кодирование этикеток может создавать условия разделения, такие как «оккупация > = 3,5», что бессмысленно, если метки не соответствуют истинному порядку. Структура дерева может стать менее интуитивной.

С точки зрения производительности выбор может изменить, какие переменные выбраны в качестве корневых расщеплений. Неправильное кодирование может заставить дерево отдавать предпочтение признакам, которые появляются чаще или имеют более высокую дисперсию в закодированных значениях, что приводит к субоптимальным расщеплениям. Эксперименты показали, что использование правильного порядкового кодирования (например, отображение уровня образования до 0,1,2,3) последовательно повышает точность по сравнению с простым кодированием меток на порядковых признаках. Для номинальных признаков одногорячее кодирование часто превосходит кодирование меток, потому что дерево может тестировать отдельные категории без навязывания ложного порядка.

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

Практические советы и лучшие практики

  • Всегда делится перед кодированием — вычислите статистику кодирования (например, целевые средства, частоты) только на обучающем наборе, затем примените те же самые отображения к тестовому набору.
  • Используйте конвейер — В scikit-learn объединяйте и кодеры в , чтобы избежать утечки данных и упростить перекрестную валидацию.
  • Проверка невидимых категорий — В производстве могут появляться новые категории. Решите стратегию: игнорируйте (капля), отобразите на карте особое «неизвестное» значение или сохраните запасной вариант (например, глобальное среднее значение для кодирования цели).
  • Проверить множественные кодировки — Лучший метод зависит от набора данных. Запустите небольшой эксперимент перекрестной проверки, сравнивая одногорячее, метки, частоту и целевое кодирование (с надлежащей перекрестной валидации) на наборе проверки.
  • Используйте нативную поддержку, когда это возможно — Если вы можете выбрать модельную библиотеку, выберите CatBoost или LightGBM, чтобы избежать головной боли при кодировании вручную, особенно с функциями высокой сердечной недостаточности.
  • Будьте осторожны с кодированием меток для номинальных данных — это почти всегда вредит производительности.Если вы должны использовать кодирование меток (например, из-за ограничений памяти), по крайней мере, рандомизируйте назначение метки, чтобы уменьшить ложный эффект упорядочивания.
  • Bin или группа редких категорий — Хорошее эмпирическое правило: комбинировать категории, которые появляются менее чем в 1% тренировочных данных, в одну группу. Это снижает шум и стабилизирует модель.
  • Следить за утечкой данных в кодировании цели — Всегда использовать перекрестную валидацию или отдельные складки для вычисления средств цели, или использовать библиотеки, которые реализуют упорядочение (например, CatBoost). Утечка кодирования цели может вызвать сверхоптимистическую производительность во время валидации и плохого обобщения.

Заключение

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

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

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