Использование OneHotEncoder для создания фиктивных переменных

Я пытаюсь создать фиктивные переменные в своем наборе ввода следующего вида: Мой набор ввода

Итак, я закодировал категориальные данные, поэтому теперь мой массив имеет вид: Закодированный входной набор

Далее я хотел бы создать фиктивные переменные с помощью OneHot Encoder. Я знаю, что раньше это работало так:

onehotencoder = OneHotEncoder(categorical_features = [1])
X = onehotencoder.fit_transform(X).toarray()

Но теперь класс OneHotEncoder работает немного по-другому, и я не могу понять, как его подогнать под мой набор данных, чтобы он работал именно так. Мой код:

import numpy as np
import pandas as pd

dataset = pd.DataFrame(
    {'RowNumber': [1, 2, 3, 4, 5],
     'CustomerId': [602, 311, 304, 354, 888],
     'Surname': ['Har', 'Hil', 'Oni', 'Bon', 'Mit'],
     'CreditScore': [619, 608, 502, 699, 850],
     'Geography': ['FR', 'ES', 'FR', 'FR', 'ES'],
     'Gender': ['F', 'F', 'F', 'F', 'F'],
     'Age': [42, 41, 42, 39, 43],
     'Tenure': [2, 1, 8, 0, 2]})

X = dataset.iloc[:, 3 : -1].values
y= dataset.iloc[:, -1].values

# Encoding categorical data
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
X[:, 1] = le.fit_transform(X[:, 1])
X[:, 2] = le.fit_transform(X[:, 2])

# Making dummy variables
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()

Заранее спасибо!


person Harnold    schedule 27.03.2020    source источник
comment
Не могли бы вы предоставить пример ввода в сценарии вместо "Churn_Modelling.csv", чтобы сделать ваш код работоспособным? Кроме того, почему вы говорите фиктивные переменные? Похоже, вы просто пытаетесь создать горячие кодировки этих двух столбцов.   -  person user1953384    schedule 27.03.2020
comment
Это первые 5 строк моего набора данных: RowNumber,CustomerId,Surname,CreditScore,Geography,Gender,Age,Tenure,Balance,NumOfProducts,HasCrCard,IsActiveMember,EstimatedSalary,Exited 1,15634602,Hargrave,619,France,Female,42 ,2,0,1,1,1,101348,88,1 2,15647311,Хилл,608,Испания,Женщина,41,1,83807,86,1,0,1,112542,58,0 3,15619304,Онио,502,Франция ,Женщина,42,8,159660.8,3,1,0,113931.57,1 4,15701354,Бони,699,Франция,Женщина,39,1,0,2,0,0,93826.63,0 5,15737888,Митчелл ,850,Испания,Женщина,43,2,125510.82,1,1,1,79084.1,0   -  person Harnold    schedule 27.03.2020
comment
Было бы здорово, если бы вы могли определить это в коде в своем посте как dataset = pd.DataFrame(...).   -  person user1953384    schedule 27.03.2020
comment
Мне очень жаль, но я совсем не понимаю, чего вы от меня ожидаете. Я новичок в python и машинном обучении, поэтому вам нужно быть очень конкретным   -  person Harnold    schedule 27.03.2020
comment
Я обновил ваш пост, чтобы проиллюстрировать, что я имел в виду.   -  person user1953384    schedule 27.03.2020
comment
Отвечает ли это на ваш вопрос? Как я могу выполнить одно горячее кодирование в Python?   -  person user1953384    schedule 27.03.2020
comment
К сожалению, я не понимаю, как реализовать это в моем случае. Я пробовал читать: scikit-learn.org/stable/modules/generated/, но все равно совершенно не понимаю, как должен выглядеть ввод. Кстати, спасибо за обновление моего поста! Я сам разобрался через некоторое время, но ты был немного быстрее :(   -  person Harnold    schedule 27.03.2020


Ответы (2)


Оказывается API для OneHotEncoder изменился, как написано в документации. Теперь вам нужно передать list категорий, а не только категории (чтобы иметь возможность генерировать несколько однократных кодировок в одном вызове, если это необходимо).

Работает ли следующее так, как вы ожидаете?

import numpy as np
import pandas as pd

dataset = pd.DataFrame(
    {'RowNumber': [1, 2, 3, 4, 5],
     'CustomerId': [602, 311, 304, 354, 888],
     'Surname': ['Har', 'Hil', 'Oni', 'Bon', 'Mit'],
     'CreditScore': [619, 608, 502, 699, 850],
     'Geography': ['FR', 'ES', 'FR', 'FR', 'ES'],
     'Gender': ['F', 'F', 'F', 'F', 'F'],
     'Age': [42, 41, 42, 39, 43],
     'Tenure': [2, 1, 8, 0, 2]})

X = dataset.iloc[:, 3 : -1].values
y= dataset.iloc[:, -1].values

# Making dummy variables
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
X1 = ohe.fit_transform(list(map(lambda x: [x], X[:, 1]))).toarray()
X2 = ohe.fit_transform(list(map(lambda x: [x], X[:, 2]))).toarray()
person user1953384    schedule 27.03.2020

Используйте pandas.get_dummies() для создания фиктивных переменных для панд. кадр данных:

df = pd.DataFrame({'Country':['France','Spain','Germany','France','Spain','Germany','Germany'],
                   'Gender':['Male','Female','Male','Female','Male','Male','Female'],
                   'Age':[52,30,38,45,41,55,29]})

df = pd.get_dummies(data = df, columns = ['Country','Gender'])
person ManojK    schedule 27.03.2020
comment
Я хочу использовать класс OneHotEncoder. Я уже сделал это с пандами, и это работает хорошо, но все равно спасибо! - person Harnold; 27.03.2020