Хеширование категориальных признаков python

Обновлено: 07.07.2024

Пакет sklearn.preprocessing обеспечивает несколько функций общей полезности и трансформаторные классы для изменения необработанных векторов характеристик в представление , которое является более подходящим для нисходящих потока оценок.

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

6.3.1. Стандартизация или удаление среднего и масштабирование дисперсии

Стандартизация наборов данных является общим требованием для многих оценщиков машинного обучения, реализованных в scikit-learn; они могут вести себя плохо, если отдельные функции не более или менее выглядят как стандартные нормально распределенные данные: гауссовские с нулевым средним и единичной дисперсией .

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

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

Модуль preprocessing предоставляет StandardScaler вспомогательный класс, который является быстрым и простым способом , чтобы выполнить следующую операцию на массив-типа набора данных:

Масштабированные данные имеют нулевое среднее значение и единичную дисперсию:

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

Можно отключить центрирование или масштабирование, передав with_mean=False или with_std=False в конструктор StandardScaler .

6.3.1.1. Масштабирование функций до диапазона

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

Вот пример масштабирования матрицы данных игрушки до диапазона [0, 1]:

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

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

Если MinMaxScaler дано явное указание, полная формула будет иметь следующий вид : feature_range=(min, max)

MaxAbsScaler работает очень похожим образом, но масштабируется таким образом, что обучающие данные лежат в пределах диапазона [-1, 1], путем деления на наибольшее максимальное значение в каждой функции. Он предназначен для данных, которые уже сосредоточены на нуле или разреженных данных.

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

6.3.1.2. Масштабирование разреженных данных

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

MaxAbsScaler был специально разработан для масштабирования разреженных данных, и это рекомендуемый способ сделать это. Однако StandardScaler может принимать scipy.sparse матрицы в качестве входных данных, если with_mean=False явно передается в конструктор. В противном случае ValueError будет поднят a , поскольку тихое центрирование нарушит разреженность и часто приведет к сбою выполнения из-за непреднамеренного выделения чрезмерного количества памяти. RobustScaler не может быть приспособлен к разреженным входам, но вы можете использовать этот transform метод для разреженных входных данных.

Обратите внимание, что средства масштабирования принимают форматы сжатых разреженных строк и сжатых разреженных столбцов (см. scipy.sparse.csr_matrix и scipy.sparse.csc_matrix ). Любой другой разреженный ввод будет преобразован в представление сжатых разреженных строк . Чтобы избежать ненужных копий памяти, рекомендуется выбирать восходящее представление CSR или CSC.

6.3.1.3. Масштабирование данных с помощью выбросов

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

Дальнейшее обсуждение важности центрирования и масштабирования данных доступно в этом FAQ: Следует ли нормализовать / стандартизировать / масштабировать данные?

Масштабирование против отбеливания

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

Чтобы решить эту проблему, вы можете использовать PCA с whiten=True для дальнейшего удаления линейной корреляции между функциями.

6.3.1.4. Центрирование ядерных матриц

Если у вас есть матрица ядра ядра $K$ который вычисляет скалярное произведение в пространстве функций, определяемом функцией $\phi$, a KernelCenterer может преобразовать матрицу ядра так, чтобы она содержала внутренние продукты в пространстве функций, определяемом $\phi$ с последующим удалением среднего в этом пространстве.

6.3.2. Нелинейное преобразование

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

6.3.2.1. Отображение в равномерное распределение

QuantileTransformer обеспечивает непараметрическое преобразование для отображения данных в равномерное распределение со значениями от 0 до 1:

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

Это можно подтвердить на независимом тестовом наборе с аналогичными замечаниями:

6.3.2.2. Отображение в гауссово распределение

PowerTransformer в настоящее время предоставляет два таких преобразования мощности, преобразование Йео-Джонсона и преобразование Бокса-Кокса.

Преобразование Йео-Джонсона определяется следующим образом:


в то время как преобразование Бокса-Кокса задается следующим образом:


Бокс-Кокса можно применять только к строго положительным данным. В обоих методах преобразование параметризуется $\lampda$, который определяется путем оценки максимального правдоподобия. Вот пример использования Box-Cox для сопоставления выборок, взятых из логнормального распределения, в нормальное распределение:

Хотя в приведенном выше примере standardize параметр установлен на False , PowerTransformer по умолчанию будет применяться нормализация с нулевым средним и единичной дисперсией к преобразованному результату.

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


Также можно сопоставить данные с нормальным распределением, используя QuantileTransformer настройку output_distribution='normal' . Используя предыдущий пример с набором данных радужной оболочки:

6.3.3. Нормализация

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

Функция normalize обеспечивает быстрый и простой способ для выполнения этой операции на одном массиве, как набор данных, либо с помощью l1 , l2 или max нормы:

preprocessing Модуль дополнительно содержит вспомогательный класс , Normalizer который реализует ту же самую операцию с использованием Transformer API (даже если fit метод бесполезен в этом случае: класс является лицом без этой операции , как трактует образцов независимо друг от друга).

Таким образом, этот класс подходит для использования на ранних этапах Pipeline :

Экземпляр нормализатора затем можно использовать в векторах выборки как любой преобразователь:

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

normalize и Normalizer принимать как плотные, похожие на массивы, так и разреженные матрицы из scipy.sparse в качестве входных данных .

6.3.4. Кодирование категориальных признаков

Такое целочисленное представление, однако, не может использоваться напрямую со всеми оценщиками scikit-learn, поскольку они ожидают непрерывного ввода и интерпретируют категории как упорядоченные, что часто нежелательно (т. Е. Набор браузеров был упорядочен произвольно).

Продолжая пример выше:

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

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

Если есть вероятность, что в обучающих данных могут отсутствовать категориальные особенности, часто бывает лучше указать, handle_unknown='ignore' а не устанавливать categories вручную, как указано выше. Если handle_unknown='ignore' задано значение и во время преобразования встречаются неизвестные категории, ошибка не возникает, но в столбцах с горячим кодированием для этой функции будут все нули ( handle_unknown='ignore' поддерживается только для горячего кодирования):

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

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

Если функция содержит оба np.nan и None , они будут считаться отдельными категориями:

См. Раздел Загрузка функций из dicts, чтобы узнать о категориальных функциях, которые представлены как dict, а не как скаляры.

6.3.5. Дискретность

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

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

6.3.5.1. Дискретизация K-бинов

KBinsDiscretizer дискретизирует функции в k бункеры:

По умолчанию выходные данные быстро кодируются в разреженную матрицу (см. Категориальные функции кодирования ), и это можно настроить с помощью encode параметра. Для каждого объекта границы fit интервалов вычисляются во время и вместе с количеством интервалов они определяют интервалы. Следовательно, для текущего примера эти интервалы определены как:

На основе этих интервалов бинов X преобразуется следующим образом:

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

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

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

Имейте в виду, что можно указать настраиваемые интервалы, передав вызываемый объект, определяющий стратегию дискретизации FunctionTransformer . Например, мы можем использовать функцию Pandas pandas.cut :

6.3.5.2. Бинаризация функций

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

Что касается Normalizer класса утилиты, Binarizer он предназначен для использования на ранних этапах Pipeline . Метод fit не делает ничего , поскольку каждый образец обрабатывают независимо от других:

Есть возможность настроить порог бинаризатора:

Что касается Normalizer класса, модуль предварительной обработки предоставляет вспомогательную функцию, binarize которая будет использоваться, когда API-интерфейс преобразователя не нужен.

Обратите внимание, что Binarizer это похоже на то, KBinsDiscretizer когда k = 2 и когда край ячейки находится на значении threshold .

binarize и Binarizer принимать как плотные, похожие на массивы, так и разреженные матрицы из scipy.sparse в качестве входных данных .

6.3.6. Вменение пропущенных значений

Инструменты для вменения пропущенных значений обсуждаются в разделе «Вменение пропущенных значений» .

6.3.7. Создание полиномиальных признаков

Особенности X были преобразованы из $(X_1, X_2)$ к $(1, X_1, X_2, X_1^2, X_1X_2, X_2^2)$.

В некоторых случаях требуются только условия взаимодействия между функциями, и это можно получить с помощью настройки interaction_only=True :

Особенности $X$ были преобразованы из $(X_1, X_2, X_3)$ к $(1, X_1, X_2, X_3, X_1X_2, X_1X_3, X_2X_3, X_1X_2X_3)$.

Обратите внимание , что полиномиальные функции используются неявно в методах ядра (например, SVC , KernelPCA ) при использовании полиномиальных функций ядра .

См. Раздел Полиномиальная интерполяция для регрессии Риджа с использованием созданных полиномиальных функций.

6.3.8. Трансформаторы на заказ

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

Вы можете убедиться, что func и inverse_func являются противоположностью друг другу, установив check_inverse=True и вызвав fit раньше transform . Обратите внимание, что появляется предупреждение, которое может быть преобразовано в ошибку с помощью filterwarnings :

Полный пример кода, демонстрирующий использование a FunctionTransformer для извлечения функций из текстовых данных, см. В разделе Преобразователь столбцов с гетерогенными источниками данных.

Часто наборы данных содержат категориальные переменные.

Эти переменные обычно хранятся в виде текстовых значений, которые представляют различные характеристики. Некоторые примеры включают цвет ("Красный", "Желтый", "Синий"), размер ("Маленький", "Средний", "Большой") или географические обозначения ("Штат" или "Страна").

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

Как и во многих других аспектах здесь нет однозначного ответа. Каждый подход имеет свои плюсы/минусы и может повлиять на результат анализа. К счастью, инструменты Python, такие как pandas и scikit-learn, предоставляют несколько методик. Эта статья является обзором популярных (и более сложных) подходов в надежде, что это поможет другим применить рассмотренные методы к своим задачам.

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

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

К счастью, в pandas это делается просто:

symboling normalized_losses make fuel_type aspiration num_doors body_style drive_wheels engine_location wheel_base . engine_size fuel_system bore stroke compression_ratio horsepower peak_rpm city_mpg highway_mpg price
0 3 NaN alfa-romero gas std two convertible rwd front 88.6 . 130 mpfi 3.47 2.68 9.0 111.0 5000.0 21 27 13495.0
1 3 NaN alfa-romero gas std two convertible rwd front 88.6 . 130 mpfi 3.47 2.68 9.0 111.0 5000.0 21 27 16500.0
2 1 NaN alfa-romero gas std two hatchback rwd front 94.5 . 152 mpfi 2.68 3.47 9.0 154.0 5000.0 19 26 16500.0
3 2 164.0 audi gas std four sedan fwd front 99.8 . 109 mpfi 3.19 3.40 10.0 102.0 5500.0 24 30 13950.0
4 2 164.0 audi gas std four sedan 4wd front 99.4 . 136 mpfi 3.19 3.40 8.0 115.0 5500.0 18 22 17450.0

5 rows × 26 columns

Посмотрим, какие типы данных у нас есть:

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

В pandas есть полезная функция select_dtypes , которую можно использовать для создания нового фрейма данных, содержащего только столбцы типа object :

make fuel_type aspiration num_doors body_style drive_wheels engine_location engine_type num_cylinders fuel_system
0 alfa-romero gas std two convertible rwd front dohc four mpfi
1 alfa-romero gas std two convertible rwd front dohc four mpfi
2 alfa-romero gas std two hatchback rwd front ohcv six mpfi
3 audi gas std four sedan fwd front ohc four mpfi
4 audi gas std four sedan 4wd front ohc five mpfi

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

make fuel_type aspiration num_doors body_style drive_wheels engine_location engine_type num_cylinders fuel_system
27 dodge gas turbo NaN sedan fwd front ohc four mpfi
63 mazda diesel std NaN sedan fwd front ohc four idi

Для простоты заполните значение числом four (так как это наиболее распространенное значение):

make fuel_type aspiration num_doors body_style drive_wheels engine_location engine_type num_cylinders fuel_system
make fuel_type aspiration num_doors body_style drive_wheels engine_location engine_type num_cylinders fuel_system
0 alfa-romero gas std two convertible rwd front dohc four mpfi
1 alfa-romero gas std two convertible rwd front dohc four mpfi
2 alfa-romero gas std two hatchback rwd front ohcv six mpfi
3 audi gas std four sedan fwd front ohc four mpfi
4 audi gas std four sedan 4wd front ohc five mpfi

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

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

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

Мы уже видели, что данные num_doors включают только 2 или 4 двери. Количество цилиндров включает всего 7 значений, которые легко переводятся в действительные числа:

Если вы просмотрите документацию по replace , то увидите, что это мощная функция с множеством параметров.

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

Вот полный словарь для очистки столбцов num_doors и num_cylinders :

Чтобы преобразовать столбцы в числа с помощью replace :

make fuel_type aspiration num_doors body_style drive_wheels engine_location engine_type num_cylinders fuel_system
0 alfa-romero gas std 2 convertible rwd front dohc 4 mpfi
1 alfa-romero gas std 2 convertible rwd front dohc 4 mpfi
2 alfa-romero gas std 2 hatchback rwd front ohcv 6 mpfi
3 audi gas std 4 sedan fwd front ohc 4 mpfi
4 audi gas std 4 sedan 4wd front ohc 5 mpfi

Хорошим преимуществом этого подхода является то, что pandas "знает" типы значений в столбцах, поэтому теперь объект имеет тип int64 :

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

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

Кодирование метки - это простое преобразование каждого значения в столбце в число. Например, столбец body_style содержит 5 разных значений. Мы могли бы закодировать это так:

  • кабриолет (convertible) -> 0
  • "жесткий верх" (hardtop) -> 1
  • хэтчбек (hatchback) -> 2
  • седан (sedan) -> 3
  • "вэгон" (wagon) -> 4

Прием, который вы можете использовать в pandas, - это преобразовать столбец в категорию, а затем использовать эти значения категории для кодирования метки:

Затем вы можете назначить закодированную переменную новому столбцу с помощью метода доступа (accessor) cat.codes :

make fuel_type aspiration num_doors body_style drive_wheels engine_location engine_type num_cylinders fuel_system body_style_cat
0 alfa-romero gas std 2 convertible rwd front dohc 4 mpfi 0
1 alfa-romero gas std 2 convertible rwd front dohc 4 mpfi 0
2 alfa-romero gas std 2 hatchback rwd front ohcv 6 mpfi 2
3 audi gas std 4 sedan fwd front ohc 4 mpfi 3
4 audi gas std 4 sedan 4wd front ohc 5 mpfi 3

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

Кодирование меток имеет тот недостаток, что числовые значения могут быть "неверно интерпретированы" алгоритмами. Например, значение 0 очевидно меньше значения 4 , но действительно ли это соответствует набору данных в реальной жизни? Имеет ли универсал в 4 раза больший вес, чем у кабриолета? В этом примере я так не думаю.

Общий альтернативный подход называется унитарным кодированием (One Hot Encoding). Основная стратегия состоит в том, чтобы преобразовать значение каждой категории в новый столбец и присвоить столбцу значение 1 или 0 (Истина / Ложь). Это дает преимущество в том, что значение не взвешивается неправильно, но имеет обратную сторону добавления дополнительных столбцов в набор данных.

Pandas поддерживает эту возможность с помощью get_dummies . Эта функция названа так, потому что она создает фиктивные (dummy) / индикаторные переменные ( 1 или 0 ).

Надеюсь, простой пример прояснит это. Мы можем посмотреть на столбец drive_wheels , где у нас есть значения 4wd , fwd или rwd .

Используя get_dummies , мы можем преобразовать их в три столбца с 1 или 0 , соответствующими правильному значению:

Однократное кодирование-это фундаментальная и распространенная схема кодирования, используемая в машинном обучении и науке о данных. В этой статье мы рассмотрим одноразовое кодирование с помощью Pandas и Scikit-Learn в Python.

Вступление

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

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

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

В этой статье мы объясним, что такое one-hot кодирование и реализуем его в Python, используя несколько популярных вариантов: Pandas и Scikit-Learn . Мы также сравним его эффективность с другими типами представления в компьютерах, его сильные и слабые стороны, а также его приложения.

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

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

Существует также аналогичная реализация, называемая One-Cold Encoding , где все элементы вектора равны 1, за исключением одного, значение которого равно 0.

Например, [0, 0, 0, 1, 0] и [1 ,0, 0, 0, 0] это могут быть некоторые примеры однократных горячих векторов. Подобный метод, также используемый для представления данных, был бы фиктивными переменными в статистике.

Это очень отличается от других схем кодирования, которые все позволяют нескольким битам иметь значение 1. Ниже приведена таблица, в которой сравнивается представление чисел от 0 до 7 в двоичном коде, коде Грея и единице-hot:

0 0 0 0
1 1 1 1
10 2 10 11
11 3 100 10
100 4 1000 110
101 5 10000 111
110 6 100000 101
111 7 1000000 100

Практически для каждого одного горячего вектора мы задаем n вопросов, где n -количество категорий, которые у нас есть:

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

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

1 Клубника
2 Яблоко
3 Арбуз
4 Лимон
5 Персик
6 Оранжевый

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

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

1 0 0 0 0 1 0
2 1 0 0 0 0 0
3 0 0 0 0 0 1
4 0 1 0 0 0 0
5 0 0 1 0 0 0
6 0 0 0 1 0 0

Из приведенных выше таблиц видно, что в одномерном представлении требуется больше цифр по сравнению с двоичным или серым кодом. Для цифр n однократное кодирование может представлять только значения n , в то время как двоичное или серое кодирование может представлять 2 n значения с использованием n цифр.

Реализация

Панды

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

В приведенном выше скрипте мы создаем фрейм данных Pandas dataframe , называемый df , используя два списка, т. е. ids и страны . Если вы вызовете метод head() для фрейма данных, то увидите следующий результат:

Столбец Страны содержит категориальные значения. Мы можем преобразовать значения в столбце Страны в однократно закодированные векторы с помощью функции get_dummies() :

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

Запуск этого кода дает:

Scikit-Учись

Во-первых, давайте начнем с импорта LabelBinarizer :

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

Хотя это далеко не так красиво, как подход Панд.

Аналогично, мы можем использовать класс OneHotEncoder , который поддерживает многоколоночные данные, в отличие от предыдущего класса:

А затем давайте заполним список и поместим его в кодер:

Запуск этого даст результат:

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

Одногорячее кодирование получило наибольшее применение в области машинного обучения и проектирования цифровых схем.

Машинное обучение

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

Большинство методов и моделей машинного обучения работают с очень ограниченным набором данных (обычно двоичным). Нейронные сети потребляют данные и выдают результаты в диапазоне 0..1 и редко когда мы выходим за эти рамки.

Отличным примером может быть Классификация , где входные данные могут быть технически неограниченными, но выходные данные обычно ограничены несколькими классами. В случае бинарной классификации (скажем, мы учим нейронную сеть классифицировать кошек и собак) у нас будет отображение 0 для кошек, и 1 для собак.

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

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

Проектирование Цифровых схем

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

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

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

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

Это полная противоположность и берет один горячий вход и преобразует его в двоичный или серый:

Преимущества и недостатки одногорячего кодирования

Как и любой другой тип кодирования, one-hot имеет много хороших моментов, а также проблемных аспектов.

Преимущества

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

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

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

Недостатки

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

Вывод

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

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

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

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

Ниже приведено введение в использование category_encoders:

Категория_Кодеры скачать

В cmd для загрузки можно использовать как pip, так и conda. Команда загрузки выглядит следующим образом:

Использование category_encoders

All of these are fully compatible sklearn transformers, so they can be used in pipelines or in your existing scripts. Supported input formats include numpy arrays and pandas dataframes. If the cols parameter isn’t passed, all columns with object or pandas categorical data type will be encoded. Please see the docs for transformer-specific configuration options.

Выше приведен ввод исходного текста, основная идея которого такова: «Все эти методы полностью совместимы с режимом преобразования sklearn, поэтому их можно напрямую использовать в функциях конвейера или в предыдущем сценарии.»ценностьикадр данных пандФормат ввода. Если не прошло cols=[. ] Параметр, который кодирует все категориальные переменные объекта или фрейма данных. "

Перед использованием import category_encoders as ce Загрузите пакет и начните с ce. Различные методы кодирования вызываются в форме.

При использовании в функции cols Просто внесите в список имена столбцов, которые необходимо преобразовать в параметрах.В следующем примере метод использования двоичного кодирования используется в качестве примера, чтобы представить использование функций кодирования в category_encoders.

примеров

В следующем примере создается кадр данных, содержащий G (хороший) и B. (плохой). Метод BinaryEncoder в category_encoders используется для кодирования переменной категории. Ниже приведена реализация кода всего процесса преобразования. Преобразованные данные Форма показана ниже.

ID RATING
0 1 G
1 2 B
2 3 G
3 4 B
4 5 B
5 6 G
RATING_0 RATING_1 ID
0 0 1 1
1 1 0 2
2 0 1 3
3 1 0 4
4 1 0 5
5 0 1 6

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

Читайте также: