Передайте аргументы в FunctionTransformer в конвейере

#python #scikit-learn #pipeline

Вопрос:

Я изучал предварительную обработку и конвейеры 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'])
 

Я получаю следующую ошибку:
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 и как настроить эти процессы?

Ответ №1:

Пример набора данных:

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

Ваша функция:

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

Без трубопровода это было бы похоже на:

 FunctionTransformer(return_selected_dataset,
kw_args={'columns':['Col1','Col2']}).transform(X)
 

Примечание. С помощью конвейера вы можете передавать параметры только для каждого шага подгонки,
см. страницу справки:

**fit_paramsdict параметров строки -> объекта, передаваемых методу fit каждого шага, где имя каждого параметра имеет префикс, так что параметр p для шага s имеет ключ 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