如何在 Sklearn Pipeline 中进行 Onehotencoding

How to do Onehotencoding in Sklearn Pipeline

我正在尝试对 Pandas 数据框的分类变量进行 oneHotEncode,其中包括分类变量和连续变量。我意识到这可以通过 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' 是一个数据框,'targets' 是一个系列),它给出了一个错误 'could not convert string to float'。

lm.fit(features, targets)

谁能帮帮我?我迫切需要工作管道,包括数据预处理...提前致谢!

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