В этом блоге мы рассмотрим и реализуем:

Одно горячее кодирование с использованием:

  • Python-библиотека category_encoding
  • Предварительная обработка Sklearn
  • get_dummies Python

Двоичное кодирование

Частотное кодирование

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

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

Что такое Категориальные данные

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

Пример: Пол

Зачем нам нужна кодировка?

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

Категориальные переменные можно разделить на две категории:

  • Номинальный (нет особого порядка)
  • Порядковый (некоторые заказанные)

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

Способ: 1. Использование библиотеки кодировщика категорий Python.

category_encoders — это потрясающая библиотека Python, которая предоставляет 15 различных схем кодирования.

Вот список из 15 типов кодирования:

  • Одно горячее кодирование
  • Кодировка этикетки
  • Порядковое кодирование
  • Кодировка Гельмерта
  • Двоичное кодирование
  • Частотное кодирование
  • Среднее кодирование
  • Вес доказательств Кодирование
  • Кодирование отношения вероятностей
  • Кодирование хеширования
  • Обратное кодирование разницы
  • Оставьте одно кодирование
  • Кодировка Джеймса-Стейна
  • Кодирование M-оценки
  • Кодер термометра

Импорт библиотек

import pandas as pd 
import sklearn

pip установить category_encoders

import category_encoders as ce

Создание фрейма данных

data = pd.DataFrame({ 'gender' : ['Male', 'Female', 'Male', 'Female', 'Female'],
                      'class' : ['A','B','C','D','A'],
                      'city' : ['Delhi','Gurugram','Delhi','Delhi','Gurugram'] })
data.head()

Внедрение горячего кодирования с помощью category_encoder

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

Создайте объект One Hot Encoder

ce_OHE = ce.OneHotEncoder(cols=['gender','city']) 

ce_OHE
OneHotEncoder(cols=['gender', 'city'])
data1 = ce_OHE.fit_transform(data)
data1.head()

Двоичное кодирование

Двоичное кодирование преобразует категорию в двоичные цифры. Каждая двоичная цифра создает один столбец признаков.

ce_be = ce.BinaryEncoder(cols=['class']);

# transform the data 
data_binary = ce_be.fit_transform(data["class"]);

Печать данных

print(data["class"])
data_binary
0    A
1    B
2    C
3    D
4    A
Name: class, dtype: object

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

Метод 2: ИСПОЛЬЗОВАНИЕ МАНКЕШТОВ PYTHON’S GET DUMMIES

pd.get_dummies(data,columns=["gender","city"])

Назначение префикса, если мы хотим. Хотя он также принимает префикс по умолчанию!

pd.get_dummies(data,prefix=["gen","city"],columns=["gender","city"])

МЕТОД 3: ИСПОЛЬЗОВАНИЕ SKLEARN

sklearn также имеет 15 различных типов встроенных кодировщиков, доступ к которым можно получить из sklearn.preprocessing.

SKLEARN ОДИН ГОРЯЧЕЕ КОДИРОВАНИЕ

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

s = (data.dtypes == 'object')
cols = list(s[s].index)

Импорт:

from sklearn.preprocessing import OneHotEncoder

ohe = OneHotEncoder(handle_unknown='ignore',sparse=False)

Подача заявки на гендерную колонку

data_gender = pd.DataFrame(ohe.fit_transform(data[["gender"]]))

data_gender

Подача заявки на городскую колонку

data_city = pd.DataFrame(ohe.fit_transform(data[["city"]]))

data_city

Применение в столбце класса

data_class = pd.DataFrame(ohe.fit_transform(data[["class"]]))

data_class

Это связано с тем, что столбец класса имеет 4 уникальных значения.

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

data_cols = pd.DataFrame(ohe.fit_transform(data[cols]))

data_cols

здесь первые 2 столбца представляют пол, следующие 4 столбца — класс, а оставшиеся 2 — город.

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

При кодировании меток каждой категории присваивается значение от 1 до N, где N — количество категорий для функции. Между этими заданиями нет никакой связи или порядка.

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()

Кодировщик меток не принимает аргументов

le_class = le.fit_transform(data[["class"]]);
le_class
array([0, 1, 2, 3, 0])

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

data_class

ПОРЯДКОВОЕ КОДИРОВАНИЕ

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

Пример: порядковое кодирование будет присваивать значения как Очень хорошо(1)‹Хорошо(2)‹Плохо(3)‹Худше(4)

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

temp = {'temperature' :['very cold', 'cold', 'warm', 'hot', 'very hot']}

df=pd.DataFrame(temp,columns=["temperature"])

temp_dict = {
    'very cold': 1,
    'cold': 2,
    'warm': 3,
    'hot': 4,
    "very hot": 5
}
temp_dict
{'very cold': 1, 'cold': 2, 'warm': 3, 'hot': 4, 'very hot': 5}
temp
{'temperature': ['very cold', 'cold', 'warm', 'hot', 'very hot']}
df

Затем мы можем сопоставить каждую строку для переменной в соответствии со словарем.

df["temp_ordinal"] = df.temperature.map(temp_dict)
df

Частотное кодирование

Категория присваивается по частоте значения в его общем лоте

data_freq = pd.DataFrame({'class' : ['A','B','C','D','A',"B","E","E","D","C","C","C","E","A","A"]})

Группировка по столбцу класса

fe = data_freq.groupby("class").size()
fe
class
A    4
B    2
C    4
D    2
E    3
dtype: int64

Деление по длине

len(data_freq)
15
fe_ = fe/len(data_freq)

Отображение и округление

data_freq["data_fe"] = data_freq["class"].map(fe_).round(2)
data_freq

Мы увидели 5 типов схем кодирования. Точно так же существует 10 других типов кодирования:

  • Кодировка Гельмерта
  • Среднее кодирование
  • Вес доказательств Кодирование
  • Кодирование отношения вероятностей
  • Кодирование хеширования
  • Обратное кодирование разницы
  • Оставьте одно кодирование
  • Кодировка Джеймса-Стейна
  • Кодирование M-оценки
  • Кодер термометра

Какой из них лучше?

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

Подробнее обо всех 15 видах кодирования читайте здесь:

Если вы хотите прочитать обо всех 15 типах кодирования, вот очень хорошая статья, на которую можно сослаться: https://towardsdatascience.com/all-about-categorical-variable-encoding-305f3361fd02.

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

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

Подключи меня к LinkedIn

Использованная литература:

  1. https://towardsdatascience.com/all-about-categorical-variable-encoding-305f3361fd02
  2. https://pypi.org/project/category-encoders/
  3. https://pandas.pydata.org/docs/reference/api/pandas.get_dummies.html