将参数传递给 Pipeline 中的 FunctionTransformer

Dum*_*der 6 python pipeline scikit-learn

我一直在学习 sklearn 预处理和管道,并遇到了 FunctionTransformer 的概念。我想了解是否必须将其集成到管道中并将参数传递给 FunctionTransformer 所指的函数,这将如何完成。考虑下面的例子,为了简单起见,我编写了一个小函数:

def return_selected_dataset(dataset, columns):
    return dataset[columns]

pipe = Pipeline([('Return_Col', FunctionTransformer(return_selected_dataset))])
pipe.fit_transform(dataset, columns = ['Col1', 'Col2'])
Run Code Online (Sandbox Code Playgroud)

我收到以下错误: ValueError: Pipeline.fit does not accept the columns parameter. You can pass parameters to specific steps of your pipeline using the stepname__parameter format, e.g. `Pipeline.fit(X, y, logisticregression__sample_weight=sample_weight)`.

如何将 的值传递columns给函数?另外,有人可以推荐任何书籍或网站,让我可以详细研究 sklearn 管道和预处理以及如何自定义这些过程吗?

Stu*_*olf 8

示例数据集:

import numpy as np
from sklearn.preprocessing import FunctionTransformer
from sklearn.pipeline import Pipeline
import pandas as pd

X = pd.DataFrame({'Col1':[1,2],'Col2':[3,4],'Col3':[5,6]})
Run Code Online (Sandbox Code Playgroud)

你的职能:

def return_selected_dataset(dataset, columns):
    return dataset[columns]
Run Code Online (Sandbox Code Playgroud)

如果没有管道,它会是这样的:

FunctionTransformer(return_selected_dataset,
kw_args={'columns':['Col1','Col2']}).transform(X)
Run Code Online (Sandbox Code Playgroud)

请注意,对于管道,您只能将参数传递给每个拟合步骤,请参阅帮助页面

**fit_paramsdict of string -> object 传递给每个步骤的 fit 方法的参数,其中每个参数名称都有前缀,以便步骤 s 的参数 p 具有键 s__p。

所以我认为你可以做的是:

pipe = Pipeline([
('Return_Col',
FunctionTransformer(return_selected_dataset,
kw_args={'columns':['Col1','Col2']})
)
])

pipe.fit_transform(X)
 
   Col1  Col2
0     1     3
1     2     4
Run Code Online (Sandbox Code Playgroud)