如何在Sklearn管道中进行Onehotencoding

时间:2017-02-13 12:38:19

标签: python scikit-learn pipeline sklearn-pandas

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

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

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

当我现在尝试拟合('features'是一个数据帧,并且'目标'是一个系列)时,它会出现错误'无法将字符串转换为浮动'。

lm.fit(features, targets)

任何可以帮助我的人?我非常渴望工作流水线,包括数据预处理......提前致谢!

1 个答案:

答案 0 :(得分:9)

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