Панды get_dummies не могут обрабатывать невидимые метки в тестовых данных - PullRequest
0 голосов
/ 02 мая 2018

У меня есть Pandas DataFrame, train, кодирование которого у меня одноразовое. Это выглядит примерно так:

    car
0   Mazda
1   BMW
2   Honda

Если я использую pd.get_dummies, я получу это:

car_BMW car_Honda   car_Mazda
0   0       0           1
1   1       0           0
2   0       1           0 

Пока все хорошо.

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

Предположим, test это:

    car
0   Mazda
1   Audi

Тогда, если я использую pd.get_dummies на test, я получу:

car_Audi    car_Mazda
0   0           1
1   1           0

Что не так, потому что у меня есть новый столбец, car_Audi и отсутствует car_BMW.

Хотелось бы, чтобы вывод кодирования * hot-код test был:

car_BMW car_Honda   car_Mazda
0   0       0           1
1   0       0           0

Так что он просто игнорирует ранее невидимые значения в тесте. Я определенно не хочу создавать новые столбцы для ранее невидимых значений в тесте.

Я посмотрел на sklearn.preprocessing.LabelBinarizer, но он выводит массив с пустым фрагментом, и порядок для столбцов неясен:

lb = LabelBinarizer()
train_transformed = lb.fit_transform(train_df)

возвращает меня:

array([[0, 0, 1],
       [1, 0, 0],
       [0, 1, 0]])

Есть идеи здесь?

Спасибо!

1 Ответ

0 голосов
/ 02 мая 2018

Это не сложная проблема для решения. LabelBinarizer имеет параметр classes_, который вы можете запросить, если хотите узнать положение исходных меток:

train_transformed = lb.fit_transform(df)

print(train_transformed)
array([[0, 0, 1],
       [1, 0, 0],
       [0, 1, 0]])

print(lb.classes_)
array(['BMW', 'Honda', 'Mazda'], dtype='<U5')
...