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

Предположим, у меня есть кадр данных pandas со следующими именами столбцов:

  • 'age' (например, 33, 26, 51 и т. Д.)
  • 'seniority' (например, 'младший, старший и т. д.)
  • 'gender' (например, «мужской», «женский»)
  • 'salary' (например, 32000, 40000, 64000 и т. д.)

Я хочу преобразовать категориальные переменные seniority в одно горячо закодированное значение.По этой причине я делаю следующее:

from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
data['seniority'] = label_encoder.fit_transform(data['seniority'])

from sklearn.preprocessing import OneHotEncoder
one_hot_encoder = OneHotEncoder(categorical_features=[1])
data = one_hot_encoder.fit_transform(data.values)

Но тогда я получаю эту ошибку

ValueError: could not convert string to float: 'gender'

в строке

data = one_hot_encoder.fit_transform(data.values)

Однако я явноуказано, что categorical_features=[1], поэтому для этой горячей кодировки следует учитывать только столбец 1 (seniority).

Как можно исправить эту ошибку (за исключением, например, удаления столбца «пол»)?

Я использовал pandas.get_dummies в прошлом, и у меня не было этой проблемы.

1 Ответ

0 голосов
/ 20 сентября 2018

Я думаю, что для этого случая вы должны придерживаться pd.get_dummies:

>>> data
   age seniority  gender  salary
0    1    junior    male       5
1    2    senior  female       6
2    3    junior  female       7

# One hot encode with get_dummies
data = pd.concat((data,pd.get_dummies(data.seniority)),1)

>>> data
   age seniority  gender  salary  junior  senior
0    1    junior    male       5       1       0
1    2    senior  female       6       0       1
2    3    junior  female       7       1       0

Проблема в том, что sklearn OneHotEncoder должен иметь массив входных данных в качестве входных данных.Но в массиве data.values у вас все еще есть строковое представление gender.Вы можете, если хотите, просто горячо кодировать значения старшинства, но если вы хотите узнать значение этих функций, это не очень хорошо, вам нужно передать им имена столбцов вручную (что во многих случаях невозможно)):

from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
data['seniority'] = label_encoder.fit_transform(data['seniority'])

from sklearn.preprocessing import OneHotEncoder
one_hot_encoder = OneHotEncoder(sparse=False)
data[['junior','senior']] = one_hot_encoder.fit_transform(data['seniority'].values.reshape(-1,1))

>>> data
   age  seniority  gender  salary  junior  senior
0    1          0    male       5     1.0     0.0
1    2          1  female       6     0.0     1.0
2    3          0  female       7     1.0     0.0

Или, если имена компонентов не имеют значения:

from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
data['seniority'] = label_encoder.fit_transform(data['seniority'])

from sklearn.preprocessing import OneHotEncoder
one_hot_encoder = OneHotEncoder(sparse=False)
data = pd.concat((data,pd.DataFrame(one_hot_encoder.fit_transform(data['seniority'].values.reshape(-1,1)))),1)

   age  seniority  gender  salary    0    1
0    1          0    male       5  1.0  0.0
1    2          1  female       6  0.0  1.0
2    3          0  female       7  1.0  0.0

Но, в конце концов, pd.get_dummies делает работу намного лучше (IMO)

...