猿问

如何为具有自定义管道的自定义估算器运行网格搜索?

我正在尝试为一个自定义案例运行网格搜索,该案例涉及一个包含pipeline作为其构造函数输入之一的估算器。


class DefaultEstimator(BaseEstimator, TransformerMixin):

  def __init__(self, preprocessor, pipelines):

    self.pipelines = pipelines


  def fit(self, X, y=None):

    for idx, each_pipeline in enumerate(self.pipelines):

      each_pipeline.fit(X[idx], y)

    return self


  def transform(self, X):

   transformed_data = []

   for idx, each_pipeline in enumerate(self.pipelines):

     transformed_data.append(each_pipeline.transform(X[idx))

   return sp.hstack(transformed_data)

我的管道看起来像这样:


pipeline1 = trainer.create_pipeline(num_features=100)

pipeline2 = trainer.create_pipeline(num_features=50)

复合管道看起来像:


aggregated_pipeline = Pipeline([('contextual', DefaultEstimator([pipeline1, pipeline2])),

                                ('classifier', Pipeline([('clf', SVM(random_state=1234, probability=True)]))

                              ])

输入数据有两列,每列都有一个各自的管道(pipeline1和pipeline2)。


对于按键grid_params的clf可写成classifier__clf__C,classifier__clf__gamma等等。


现在的问题是:如何编写grid_params用于GridSearchCV(...)作为管道的步骤之一是不是一个管道对象,而定制估计对象?


鸿蒙传说
浏览 174回答 1
1回答

LEATH

GridSearchCV并Pipeline使用估计器set_params设置要测试的参数。所以,你必须在你的 中实现这一点DefaultEstimator,并适当地设置管道参数。scikit 中的一个常见模式是使用双下划线来分隔嵌套对象的参数,例如:class DefaultEstimator:    def set_params(self, **kwargs):        for k, v in kwargs.items():            parts = k.split('__')            if parts[0].startswith('pipeline'):                pipe_num = int(parts[0].split('_')[1])                param_name = '__'.join(parts[1:])                self.pipelines[pipe_num].set_params(*{param_name: v})            else:                # other logic这将允许您使用诸如contextual__pipeline_1__num_features(contextual__将被网格搜索剥离,因此无需处理它) 之类的参数。
随时随地看视频慕课网APP

相关分类

Python
我要回答