Как предварительно обработать тестовые данные после одной горячей кодировки - PullRequest
1 голос
/ 23 декабря 2019

Я немного запутался, у меня есть один горячий код моих категориальных столбцов для всех этих <10 уникальных значений <code>low_cardinality_cols, и я отбросил оставшиеся категориальные столбцы для данных обучения и проверки.

Теперь я хочу применить свою модель к новым данным в test.csv. Каков наилучший метод предварительной обработки тестовых данных для соответствия формату поезда / проверки?

Мои опасения:
1. Test_data.csv, безусловно, будет иметь различную мощность для этих столбцов
2Если я один из тестовых данных с горячим кодированием, используя столбцы с низким количеством кардинальных единиц, я получаю Input contains NaN, но мои столбцы с поездами, действительными и тестовыми значениями совпадают.

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

# Apply one-hot encoder to each column with categorical data
OH_encoder = OneHotEncoder(handle_unknown='ignore', sparse=False)
OH_cols_train = pd.DataFrame(OH_encoder.fit_transform(X_train[low_cardinality_cols]))
OH_cols_valid = pd.DataFrame(OH_encoder.transform(X_valid[low_cardinality_cols]))

# One-hot encoding removed index; put it back
OH_cols_train.index = X_train.index
OH_cols_valid.index = X_valid.index

# Remove categorical columns (will replace with one-hot encoding)
# This also saves us the hassle of dropping columns 

num_X_train = X_train.drop(object_cols, axis=1)
num_X_valid = X_valid.drop(object_cols, axis=1)

# Add one-hot encoded columns to numerical features
OH_X_train = pd.concat([num_X_train, OH_cols_train], axis=1)
OH_X_valid = pd.concat([num_X_valid, OH_cols_valid], axis=1)

1 Ответ

1 голос
/ 23 декабря 2019

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

Решение 1

Если вы можете получить все возможные уровни / значения категориальной переменной, которую вы планируете кодировать, вы можете передать их как параметр categories при выполнении однократного кодирования значение по умолчанию для categories равно auto, которое автоматически определяет категории на основе данных обучения и не учитывает новые категории, найденные в данных тестирования. Использование categories в качестве списка всех возможных категорий поможет нам решить эту проблему. Поскольку даже если ваши данные тестирования имеют новые категории, которых не было в данных обучения / проверки, все они будут закодированы правильно, и вы не получите NaN s.

Решение 2

В случае, если вы не можете собрать все возможные категории категориального столбца, вы можете пойти дальше и установить одноразовый кодировщик так, как вы это сделали, и когда вы попытаетесь преобразовать свои тестовые данные в порядокдля обработки NaN с, с которыми вы столкнетесь, когда найдете новый класс, вы можете использовать некоторые методы вменения, такие как SimpleImputer или IterativeImputer , для вменения пропущенных значений и дальнейшей обработки.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...