2017-02-13 8 views
4

Я пытаюсь oneHotEncode категориальные переменные моего блока данных Pandas, который включает как категориальные, так и продолжающиеся переменные. Я понимаю, что это можно сделать легко с помощью функции pandas .get_dummies(), но мне нужно использовать конвейер, чтобы позже сгенерировать PMML-файл.Как сделать Onehotencoding в Sklearn Pipeline

Это код для создания картографа. Категориальные переменные, которые я хотел бы кодировать, хранятся в списке под названием «манекены».

from sklearn_pandas import DataFrameMapper 
from sklearn.preprocessing import OneHotEncoder 
from sklearn.preprocessing import LabelEncoder 

mapper = DataFrameMapper(
    [(d, LabelEncoder()) for d in dummies] + 
    [(d, OneHotEncoder()) for d in dummies] 
) 

И это код для создания конвейера, включая карту и линейную регрессию.

from sklearn2pmml import PMMLPipeline 
from sklearn.linear_model import LinearRegression 

lm = PMMLPipeline([("mapper", mapper), 
        ("regressor", LinearRegression())]) 

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

lm.fit(features, targets) 

Любой, кто может мне помочь? Я отчаянно нуждаюсь в рабочих трубопроводах, включая предварительную обработку данных ... Спасибо заранее!

ответ

6

OneHotEncoder не поддерживает строковые функции, а с помощью [(d, OneHotEncoder()) for d in dummies] вы применяете его ко всем столбцам манекенов. Используйте LabelBinarizer вместо:

mapper = DataFrameMapper(
    [(d, LabelBinarizer()) for d in dummies] 
) 

В качестве альтернативы можно использовать LabelEncoder со вторым OneHotEncoder шагом.

mapper = DataFrameMapper(
    [(d, LabelEncoder()) for d in dummies] 
) 

lm = PMMLPipeline([("mapper", mapper), 
        ("onehot" OnehotEncoder()), 
        ("regressor", LinearRegression())]) 
+0

Большое спасибо, лейбл-бинаризатор работает для меня. Я действительно думаю, что теперь я сохраняю только категориальные функции, которые я кодировал одним образом. Есть ли способ включить оригинальные непрерывные функции? –

+0

Да, перечислите их в «DataFrameMapper» с помощью «None» в качестве трансформатора. – dukebody

Смежные вопросы