Ошибки, которые делают почти все при обработке категориальных признаков
Введение
Обработка категориальных признаков — одна из ключевых задач в подготовке данных для моделей машинного обучения. Несмотря на кажущуюся простоту, данный этап часто становится источником ошибок, которые могут значительно влиять на качество моделей. Давайте рассмотрим некоторые из распространённых ошибок и способы их избежать.
Ошибка 1: Ошибка в выборе метода кодирования
Одна из частых ошибок при работе с категориальными признаками — неверный выбор метода кодирования. Многие начинающие инженеры используют One-Hot Encoding для всех категориальных признаков, что не всегда оправдано. Например, если мы имеем дело с признаками с высокой кардинальностью, One-Hot Encoding может значительно увеличить количество признаков, что плохо сказывается на скорости обучения и памяти.
Сравнение One-Hot Encoding и Target Encoding
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
# Пример данных
data = pd. DataFrame({'city': ['Moscow', 'Berlin', 'Berlin', 'New York', 'Moscow']})
# One-Hot Encoding
encoder = OneHotEncoder(sparse=False)
ohe_df = pd. DataFrame(encoder.fit_transform(data[['city']]), columns=encoder.get_feature_names_out(['city']))
print(ohe_df)
# Target Encoding (простое среднее значение по городу)
mean_target_encoding = data.groupby('city').size() / len(data)
data['city_encoded'] = data['city'].map(mean_target_encoding)
print(data)
Ошибка 2: Отсутствие учёта порядка категорий
Игнорирование порядка категориальных признаков может стать причиной для искажения результатов. Например, при кодировании рейтинга (низкий, средний, высокий) важно сохранить порядок. Без учета порядка некоторые методы, такие как Label Encoding, могут привести к неправильной интерпретации модели.
Использование Label Encoding на упорядоченных данных
from sklearn.preprocessing import OrdinalEncoder
# Пример данных
ratings = pd. DataFrame({'rating': ['low', 'medium', 'high']})
# Ordinal Encoding
ordinal_encoder = OrdinalEncoder(categories=[['low', 'medium', 'high']])
ratings_encoded = ordinal_encoder.fit_transform(ratings)
print(ratings_encoded)
Ошибка 3: Игнорирование новых категорий в данных
При изменении структуры данных, например, при поступлении новых данных, легко упустить появление новых категорий, отсутствующих в обучающей выборке. Это может привести к ошибкам в прогнозировании и даже к падению сервиса в production. Использование специальных объектов (например, категориальных маппингов) или добавление логики обработки новых значений помогает избежать этой проблемы.
Пример использования категориальных маппингов с обработкой новых категорий
# Пример данных
train_data = pd. DataFrame({'city': ['Moscow', 'Berlin', 'New York']})
test_data = pd. DataFrame({'city': ['London', 'Berlin', 'Moscow']})
# Создание маппинга
city_mapping = {'Moscow': 0, 'Berlin': 1, 'New York': 2}
# Применение маппинга с обработкой новых категорий
train_data['city_encoded'] = train_data['city'].map(city_mapping)
test_data['city_encoded'] = test_data['city'].map(lambda x: city_mapping.get(x, -1))
print(test_data)
TG: