我正在尝试对一个自定义案例进行网格搜索,该案例涉及一个包含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
的{{1}}键可以写成clf
,classifier__clf__C
等。
问题是:如何为classifier__clf__gamma
编写grid_params
,因为其中一个流水线步骤不是流水线对象而是自定义估计器对象?
答案 0 :(得分:2)
PublishAsync
和AbpTenantNotifications
使用估计器的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
将被网格搜索剥离,因此无需处理)。