Многие люди испытывают трудности с обработкой категориальных переменных.

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

Что такое категориальные переменные?

Категориальные переменные / характеристики - это характеристики любого типа, которые можно разделить на два основных типа:

  • Номинальный
  • Порядковый

Номинальные переменные - это переменные, которые имеют две или более категорий, с которыми не связан какой-либо порядок.

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

С другой стороны, порядковые переменные имеют «уровни» или категории с определенным порядком, связанным с ними. Например, порядковая категориальная переменная может быть функцией с тремя разными уровнями: низким, средним и высоким. Порядок важен.

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

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

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

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

1) Одно горячее кодирование
2) Кодирование метки
3) Порядковое кодирование
4) Кодирование Хельмерта

Для объяснения я буду использовать этот фрейм данных, который имеет две независимые переменные или характеристики (температура и цвет) и одну метку (цель). У него также есть Rec-No, который представляет собой порядковый номер записи. В этом фрейме данных всего 10 записей. Код Python будет выглядеть так, как показано ниже.

Мы будем использовать Pandas, Scikit-learn и category_encoders (библиотека материалов Scikit-learn), чтобы показать различные методы кодирования в Python.

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

В этом методе мы сопоставляем каждую категорию с вектором, который содержит 1 и 0, обозначающие наличие или отсутствие функции. Количество векторов зависит от количества категорий для функций. Этот метод создает много столбцов, что значительно замедляет обучение, если количество категорий для функции очень велико. В Pandas есть функция get_dummies, которая довольно проста в использовании. Для примера кода кадра данных будет следующим:

В Scikit-learn для этой цели есть OneHotEncoder, но он не создает дополнительный столбец функций (необходим другой код, как показано в приведенном ниже примере кода).

One Hot Encoding очень популярен. Мы можем представить все категории как N-1 (N = № категории), поскольку этого достаточно для кодирования той, которая не включена. Обычно для регрессии мы используем N-1 (отбрасываем первый или последний столбец новой функции One Hot Coded), но для классификации рекомендуется использовать все N столбцов без них, поскольку большая часть древовидного алгоритма строит дерево на основе все доступные переменные. Одно горячее кодирование с двоичными переменными N-1 следует использовать в линейной регрессии, чтобы гарантировать правильное количество степеней свободы (N-1). Линейная регрессия имеет доступ ко всем функциям во время обучения и поэтому полностью исследует весь набор фиктивных переменных. Это означает, что N-1 двоичные переменные предоставляют полную информацию об исходной категориальной переменной (полностью представляют) для линейной регрессии. Этот подход можно использовать для любого алгоритма машинного обучения, который рассматривает ВСЕ функции одновременно во время обучения. Например, поддержка векторных машин и нейронных сетей, а также алгоритмов кластеризации.

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

Кодировка метки

В этой кодировке каждой категории присваивается значение от 1 до N (здесь N - количество категорий для функции. Одна из основных проблем с этим подходом заключается в том, что между этими классами нет связи или порядка, но алгоритм может рассматривать их как некоторый порядок, или есть некоторая взаимосвязь. В приведенном ниже примере это может выглядеть так (Холодный ‹Горячий‹ Очень горячий ‹Теплый… .0‹ 1 ‹2‹ 3). Scikit-learn код для фрейма данных следующим образом:

Панды факторизовать также выполняют ту же функцию.

Порядковое кодирование

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

  • в соответствии с порядком данных (Pandas присвоено Hot (0), Cold (1), «Very Hot» (2) и Warm (3)) или
  • в соответствии с алфавитным порядком сортировки (scikit-learn присвоено значение «Холодный» (0), «Горячий» (1), «Очень горячий» (2) и «Теплый» (3)).

Если рассматривать шкалу температур как порядок, то порядковый номер должен быть от холодного до «очень горячего». «Порядковое кодирование присвоит значения как (Холодный (1)‹ Теплый (2) ‹Горячий (3)‹ »Очень горячий (4)). Обычно порядковое кодирование выполняется, начиная с 1.

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

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

Кодирование Гельмерта

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

Версия в category_encoders иногда называется обратным кодированием Гельмерта. Среднее значение зависимой переменной для уровня сравнивается со средним значением зависимой переменной на всех предыдущих уровнях. Следовательно, название «обратное» используется для отличия от прямого кодирования Гельмерта.

Заключение

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

Это мое личное исследование, если у вас есть какие-либо комментарии, пожалуйста, свяжитесь со мной.

Добро пожаловать на мою среднюю страницу

Github, LinkedIn, Захра Эльхамрауи, Upwork