Я думаю, что для этого случая вы должны придерживаться 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)