如何在Sklearn管道中进行Onehotencoding

我正在尝试oneHotEncode我的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)

谁可以帮助我?我非常渴望工作管道,包括数据的预处理……提前谢谢!

OneHotEncoder不支持字符串功能,而[d,OneHotEncoder())用于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",("onehot" OnehotEncoder()),LinearRegression())])

相关文章

适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题...
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结...
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容...