В этом блоге мы рассмотрим и реализуем:
Одно горячее кодирование с использованием:
- 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
Использованная литература: