2017-02-13 153 views
4

我在尝试oneHot对我的Pandas数据框的分类变量进行编码,其中包括分类变量和连续变量。我意识到这可以通过使用熊猫.get_dummies()函数轻松完成,但我需要使用管道,以便稍后可以生成PMML文件。如何在Sklearn管道中执行Onehotencoding

这是创建映射器的代码。我想编码的分类变量存储在名为“傻瓜”的列表中。

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())]) 

当我现在尽量合身(与“功能”是一个数据帧,而“目标”系列),它提供了一个错误“无法字符串转换为浮动”。

lm.fit(features, targets) 

任何人谁可以帮我吗?我非常渴望工作管道,包括数据的预处理......预先感谢!

回答

6

OneHotEncoder不支持字符串功能,并且使用[(d, OneHotEncoder()) for d in dummies]将其应用于所有虚拟列。使用LabelBinarizer代替:

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

另一种方法是用一个第二OneHotEncoder步骤中使用的LabelEncoder

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

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

非常感谢你,labelbinarizer为我工作。我确实认为,我现在只保留我单独编码的分类特征。有没有办法包含原始连续功能? –

+0

是的,在'DataFrameMapper'中用'None'作为变换器列出它们。 – dukebody