Pandas: рассматривайте NaN как невидимую ценность в кодировке One-Hot - PullRequest
0 голосов
/ 29 апреля 2018

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

Например, если у меня есть DataFrame, train:

    car
0   Audi
1   BMW
2   Mazda

Я могу использовать pd.get_dummies, чтобы получить:

   car_Audi car_BMW car_Mazda
0      1       0       0
1      0       1       0
2      0       0       1

Вызовите этот результирующий фрейм данных, train_encoded

Теперь предположим, что мой test DataFrame выглядит так:

    car
0   Mercedes

Я могу использовать:

pd.get_dummies(test).reindex(columns=train_encoded.columns)

чтобы получить:

   car_Audi car_BMW car_Mazda
0      0       0       0

Как я могу рассматривать NaN s как невидимое значение для моего car столбца? То есть, если я столкнусь с NaN в моем столбце car в test, я хочу вернуться:

   car_Audi car_BMW car_Mazda
0      0       0       0

Спасибо!

1 Ответ

0 голосов
/ 29 апреля 2018

Если вы сгенерировали строку filler, которая не отображается в df.car, то слегка изменив предложение Вэня в комментарии (для случая, когда 'NAN' - строка в df.car), вы можете использовать

df.car.fillna(filler, inplace=True) 
pd.get_dummies(test).reindex(columns=train_encoded.columns)

Один из способов определения filler, если у вас есть доступ ко всем df.car заранее, это через

filler = '_' + ''.join(df.car.unique())

потому что он как минимум длиннее на 1, чем самая длинная строка в нем. Другой способ - с использованием случайной строки

filler = ''.join(random.choice(string.ascii_lowercase) for _ in range(10))

Вероятность того, что у вас есть такой предмет, меньше, чем len(df) / 26 ** 10.

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