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

时间:2019-01-24 11:35:28

标签: python machine-learning scikit-learn

我正在尝试对一个自定义案例进行网格搜索,该案例涉及一个包含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)]))
                              ])

输入数据有两列,每列分别有一个管道(pipeline1pipeline2)。

grid_params的{​​{1}}键可以写成clfclassifier__clf__C等。

问题是:如何为classifier__clf__gamma编写grid_params,因为其中一个流水线步骤不是流水线对象而是自定义估计器对象?

1 个答案:

答案 0 :(得分:2)

PublishAsyncAbpTenantNotifications使用估计器的GridSearchCV设置要测试的参数。因此,您必须在Pipeline中实现它,并适当地设置管道参数。 scikit中的一个常见模式是使用双下划线分隔嵌套对象的参数,例如:

set_params

这将允许您使用诸如DefaultEstimator之类的参数(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 将被网格搜索剥离,因此无需处理)。