拆分应用组合到 sklearn 管道

Posted

技术标签:

【中文标题】拆分应用组合到 sklearn 管道【英文标题】:split-apply-combine to sklearn pipeline 【发布时间】:2017-01-26 23:45:56 【问题描述】:

我正在尝试使用 sklearn 生成管道,但不确定如何去做。这是一个最小的例子:

def numFeat(data):
    return data[['AGE', 'WASTGIRF']]

def catFeat(data):
    return pd.get_dummies(data[['PAI', 'smokenow1']])

features = FeatureUnion([('f1',FunctionTransformer(numFeat)),
                         ('f2',FunctionTransformer(catFeat))  ] )

pipeline = Pipeline( [('f', features), ('lm',LinearRegression())] )

data = pd.DataFrame('AGE':[1,2,3,4], 
                     'WASTGIRF': [23,5,43,1], 
                     'PAI':['a','b','a','d'], 
                     'smokenow1': ["lots", "some", "none", "some"])

pipeline.fit(data, y)
print pipeline.transform(data)

在上面的示例中,data 是一个 Pandas DataFrame,其中包含 ['AGE', 'WASTGIRF', 'PAI', 'smokenow1'] 等列。

当然,在FeatureUnion 示例中,我想提供更多转换操作,但是,它们都采用 Pandas DataFrame 并返回另一个 Pandas DataFrame。所以实际上,我想做这样的事情......

data --+-->num features-->num transforms--+-->FeatureUnion-->model
       |                                  |
       +-->cat features-->cat transforms--+

我该怎么做?

对于上面的例子,我得到的错误是......

TypeError: float() argument must be a string or a number

【问题讨论】:

【参考方案1】:

您需要使用validate=False 初始化FunctionTransformer(IMO 这是一个错误的默认值,应该更改):

features = FeatureUnion([('f1',FunctionTransformer(numFeat, validate=False)),
                         ('f2',FunctionTransformer(catFeat, validate=False))] )

另见sklearn pipeline - how to apply different transformations on different columns

【讨论】:

以上是关于拆分应用组合到 sklearn 管道的主要内容,如果未能解决你的问题,请参考以下文章

sklearn.pipeline.Pileline

管道和网格搜索的 SKLearn 错误

sklearn 管道在应用于测试集时不记得其状态

sklearn:应用相同的缩放来训练和预测管道

将多个预处理步骤应用于 sklearn 管道中的列

sklearn:绘制跨训练+测试集组合的混淆矩阵