OneHotEncoder для нескольких столбцов, принадлежащих к одной категории - PullRequest
0 голосов
/ 20 октября 2018

У меня есть несколько столбцов, состоящих из категориальных переменных, которые имеют форму целых значений в диапазоне от 0 до 4.Но все столбцы принадлежат к одной категории.Я попытался использовать OneHotEncoder из scikit learn, но он не заботится о пропущенных категориях в столбце, что может вызвать проблемы при тестировании невидимых данных в моей модели нейронной сети.В приведенном ниже коде показан тип данных, которые мне нужно кодировать

>>> df = pd.DataFrame(np.random.randint(low=0, high=4, size=(5, 5)),
                       columns=['color1', 'color2', 'color3', 'color4', 'color5'])
>>> df

   color1  color2  color3  color4  color5
0       0       1       2       3       1
1       3       1       0       1       1
2       0       1       0       3       0
3       0       2       0       1       2
4       0       2       0       3       2

>>> df_onehotencoder = OneHotEncoder(sparse=False)
>>> df2 = df_onehotencoder.fit_transform(df)

>>> df2

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

. Это создает массив для каждого столбца только для категорий, присутствующих в этом столбце, а не для отсутствующих категорий.Мне нужно иметь одинаковое количество закодированных столбцов для каждого столбца, то есть отсутствующая категория будет равна нулю.Кроме того, что было бы лучшим вариантом для декодирования этого массива OneHotEncoded, чтобы я мог легко декодировать прогнозируемый вывод в фактические целочисленные значения.

1 Ответ

0 голосов
/ 21 октября 2018

Начиная с sklearn==0.20 OneHotEncoder имеет параметр categories, где вы можете предоставить список списков со всеми возможными значениями для данного столбца.

import pandas as pd
df = pd.DataFrame([[0, 1, 2, 3, 1],
 [3, 1, 0, 1, 1],
 [0, 1, 0, 3, 0],
 [0, 2, 0, 1, 2],
 [0, 2, 0, 3, 2]], columns=['color1', 'color2', 'color3', 'color4', 'color5'])

from sklearn.preprocessing import OrdinalEncoder, OneHotEncoder

# Get all the unique values if we don't have them
unique_values = pd.unique(df.values.ravel()) 

ohe = OneHotEncoder(categories=[unique_values]*len(df), sparse=False)
encoded = pd.DataFrame(ohe.fit_transform(
    df), columns=ohe.get_feature_names(df.columns))
>>> encoded

   color1_0  color1_1  color1_2  color1_3  color2_0  color2_1    0
0       1.0       0.0       0.0       0.0       0.0       1.0  ...
1       0.0       0.0       0.0       1.0       0.0       1.0  ...
2       1.0       0.0       0.0       0.0       0.0       1.0  ...
3       1.0       0.0       0.0       0.0       0.0       0.0  ...
4       1.0       0.0       0.0       0.0       0.0       0.0  ...

Чтобы вернуть исходные классы, вы можете сделать inverse_transform:

>>> ohe.inverse_transform(encoded) 
array([[0, 1, 2, 3, 1],
       [3, 1, 0, 1, 1],
       [0, 1, 0, 3, 0],
       [0, 2, 0, 1, 2],
       [0, 2, 0, 3, 2]], dtype=int64)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...