В Data Science одним из важнейших этапов перед построением любой модели является подготовка данных. Значительная часть информации, с которой мы сталкиваемся в реальной жизни, представлена в виде категориальныхзначений. Однако большинство алгоритмов машинного обучения умеют работать только с числами. Именно поэтому возникает необходимость в кодировании категориальных данных — процессе преобразования категорий в числовой формат.
Давайте разберемся, какие бывают категориальные данные и какие существуют методы их кодирования.
import category_encoders as ce
import pandas as pd
df = pd.DataFrame({'size': ['L', 'M', 'S', 'L', 'M', 'S']})
encoder = ce.OrdinalEncoder(
cols=['size'],
mapping=[{'col': 'size', 'mapping': {'S': 0, 'M': 1, 'L': 2}}]
)
df['encoded'] = encoder.fit_transform(df)
df
Важно: не используйте эти методы для номинальных данных (например, цветов), иначе модель подумает, что между категориями есть порядок, которого на самом деле нет.
df = pd.DataFrame({'city': ['Москва', 'Казань', 'Санкт-Петербург', 'Москва']})
encoder = ce.OneHotEncoder(cols='city', use_cat_names=True)
df_encoded = encoder.fit_transform(df)
df_encoded
df = pd.DataFrame({'city': ['Москва', 'Казань', 'Санкт-Петербург', 'Москва']})
encoder = ce.SumEncoder(cols='city')
df_encoded = encoder.fit_transform(df)
df_encoded
data = pd.DataFrame({'product': ['ноутбук', 'смартфон', 'планшет', 'наушники', 'ноутбук']})
encoder = ce.HashingEncoder(cols='product', n_components=3)
df_encoded = encoder.fit_transform(data)
df_encoded
df = pd.DataFrame({'brand': ['Lada', 'Kia', 'BMW', 'Lada', 'Kia']})
encoder = ce.BinaryEncoder(cols=['brand'])
df_encoded = encoder.fit_transform(df)
df_encoded
df = pd.DataFrame({'month': ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль']})
encoder = ce.BaseNEncoder(cols=['month'], base=5)
df_encoded = encoder.fit_transform(df)
df_encoded
df = pd.DataFrame({
'job': ['менеджер', 'аналитик', 'менеджер', 'аналитик'],
'income': [80000, 120000, 75000, 110000]
})
encoder = ce.TargetEncoder(cols='job')
df['job_encoded'] = encoder.fit_transform(df['job'], df['income'])
df
Важно: следует использовать этот метод с осторожностью, так как он может привести к переобучению модели из-за использования информации о целевой переменной при создании признаков (что по сути является утечкой данных). Рекомендуется применять техники регуляризации и кросс-валидации.