Обработка категориальных признаков
Работая с данными в задачах машинного обучения, мне часто приходится иметь дело с категориальными признаками - переменными, которые могут принимать одно из ограниченного числа возможных значений, например, пол, цвет или город.
Правильная обработка таких признаков критически важна для успеха модели. Сегодня я поделюсь своим опытом в этой области.
Кодирование категориальных признаков
Большинство алгоритмов машинного обучения работают только с числовыми данными. Поэтому категориальные признаки нужно преобразовать в числовой формат. Есть несколько распространенных подходов:
- Прямое кодирование (Label Encoding) - каждой уникальной категории присваивается число. Например:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
encoded = le.fit_transform(["кошка", "собака", "кошка", "хомяк"])
print(encoded) # [0 1 0 2]
Проблема в том, что многие алгоритмы будут интерпретировать эти числа как упорядоченность категорий.
- One-Hot кодирование (OHE) - для каждой категории создается бинарный признак (dummy variable):
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
encoded = ohe.fit_transform([["кошка"], ["собака"], ["кошка"], ["хомяк"]]).toarray()
print(encoded)
# [[1. 0. 0.]
# [0. 0. 1.]
# [1. 0. 0.]
# [0. 1. 0.]]
Теперь нет ложной упорядоченности, но возросла размерность данных.
Обработка категорий с большим числом уникальных значений
Иногда категориальный признак имеет очень много уникальных значений (например, список городов). Применение OHE приведет к "проклятию размерности". Есть несколько способов справиться с этим:
- Группировка редких категорий. Категории с частотой ниже порога объединяются в одну группу "Другое":
def group_rare(df, col, threshold=0.05):
s = df[col].value_counts(normalize=True)
rare = s[s < threshold].index
df[col] = df[col].replace(rare, "Другое")
return df
df = group_rare(df, "City", 0.01)
- Применение техник понижения размерности после OHE, например, метод главных компонент (PCA).
- Использование числовых представлений категорий, например, частоты (probability encoding) или таргет кодирования (target encoding).
Правильная обработка категориальных признаков - важный этап построения модели машинного обучения. One-Hot кодирование - наиболее универсальный подход. Но для признаков с большим числом категорий приходится применять дополнительные техники, чтобы избежать "проклятия размерности". Надеюсь, мои советы будут вам полезны в работе. Удачи в ваших проектах машинного обучения!