Используйте OneHotEncoder с указанным набором значений - PullRequest
1 голос
/ 26 марта 2020

У меня есть закрытый список значений, которые я хочу кодировать с помощью OneHotEncoder. Моя проблема в том, что подмножество значений изменяется от одного входа к другому, и я хочу, чтобы кодировка была исправлена. Я видел, что OneHotEncoder имеет параметр «категории», но не смог заставить его работать. Мой код ниже. Любые предложения?

fit_transform метод выдает следующее исключение:

ValueError: Истинное значение DataFrame является неоднозначным. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

encoder = OneHotEncoder(categories=pd.DataFrame({"type": ["A", "B", "C", "D"]}))
ct = ColumnTransformer([("encode_types", encoder, ["type"])])
X = pd.DataFrame({
    "col1": [11, 22, 55],
    "type": ["A", "B", "D"], # in this examples C is missing
})

encoder.fit_transform(X)

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Я думаю, что вы должны соответствовать фрейму данных, который вы сейчас передаете как категории, а именно:

encoder = OneHotEncoder(handle_unknown='ignore')
encoder.fit(pd.DataFrame({"type": ["A", "B", "C", "D"]}))

X = pd.DataFrame({
    "col1": [11, 22, 55],
    "type": ["A", "B", "D"], # in this examples C is missing
})

encoder.transform(X[['type']]).toarray()
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 0., 1.]])

И если мы проверим категории кодировщика, мы получим:

encoder.categories_
[array(['A', 'B', 'C', 'D'], dtype=object)]
0 голосов
/ 26 марта 2020

get_dummies с reindex

cats = ['A', 'B', 'C', 'D']
pd.get_dummies(X.type).reindex(columns=cats, fill_value=0)

   A  B  C  D
0  1  0  0  0
1  0  1  0  0
2  0  0  0  1

get_dummies с CategoricalDtype

cats = pd.CategoricalDtype(['A', 'B', 'C', 'D'])
pd.get_dummies(X.type.astype(cats))

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