📌 Какие существуют способы кодирования категориальных переменных ?



💬 Спрашивают в 14% собеседований



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



1️⃣ One-Hot Encoding (Одинарное кодирование)



Преобразует каждую категорию в бинарный вектор. Для каждой категории создается отдельный бинарный признак.



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

import pandas as pd

from sklearn.preprocessing import OneHotEncoder



# Пример данных

data = {'Цвет': ['красный', 'синий', 'зеленый']}

df = pd.DataFrame(data)



# Преобразование категориального признака с использованием OneHotEncoder

encoder = OneHotEncoder(sparse=False)

encoded_colors = encoder.fit_transform(df[['Цвет']])



# Создание DataFrame с закодированными признаками

encoded_df = pd.DataFrame(encoded_colors, columns=encoder.get_feature_names_out(['Цвет']))

print(encoded_df)




2️⃣ Label Encoding (Метка кодирования)



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

from sklearn.preprocessing import LabelEncoder



# Пример данных

data = {'Цвет': ['красный', 'синий', 'зеленый']}

df = pd.DataFrame(data)



# Преобразование категориального признака с использованием LabelEncoder

encoder = LabelEncoder()

df['Цвет_код'] = encoder.fit_transform(df['Цвет'])

print(df)




3️⃣ Target Encoding (Целевая кодировка)



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

import category_encoders as ce



# Пример данных

data = {'Цвет': ['красный', 'синий', 'зеленый', 'красный', 'синий'],

'Цена': [10, 15, 12, 10, 20]}

df = pd.DataFrame(data)



# Преобразование категориального признака с использованием TargetEncoder

encoder = ce.TargetEncoder(cols=['Цвет'])

df['Цвет_код'] = encoder.fit_transform(df['Цвет'], df['Цена'])

print(df)




4️⃣ Ordinal Encoding (Порядковое кодирование)



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

from sklearn.preprocessing import OrdinalEncoder



# Пример данных

data = {'Размер': ['маленький', 'средний', 'большой']}

df = pd.DataFrame(data)



# Преобразование категориального признака с использованием OrdinalEncoder

encoder = OrdinalEncoder(categories=[['маленький', 'средний', 'большой']])

df['Размер_код'] = encoder.fit_transform(df[['Размер']])

print(df)




5️⃣ Binary Encoding (Бинарное кодирование)



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

import category_encoders as ce



# Пример данных

data = {'Цвет': ['красный', 'синий', 'зеленый']}

df = pd.DataFrame(data)



# Преобразование категориального признака с использованием BinaryEncoder

encoder = ce.BinaryEncoder(cols=['Цвет'])

df = encoder.fit_transform(df)

print(df)




6️⃣ Frequency Encoding (Частотное кодирование)



Заменяет каждую категорию на частоту её появления в данных.

# Пример данных

data = {'Цвет': ['красный', 'синий', 'зеленый', 'красный', 'синий']}

df = pd.DataFrame(data)



# Преобразование категориального признака с использованием Frequency Encoding

df['Цвет_частота'] = df['Цвет'].map(df['Цвет'].value_counts()) / len(df)

print(df)




Существует множество способов кодирования категориальных переменных, включая One-Hot Encoding, Label Encoding, Target Encoding, Ordinal Encoding, Binary Encoding и Frequency Encoding. Выбор метода зависит от данных и типа модели, которую вы используете.



🔥 ТОП ВОПРОСОВ С СОБЕСОВ



🔒 База собесов | 🔒 База тестовых