gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:07:27 25 4
gpt4 key购买 nike

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

clfgrid_params的key可以写成classifier__clf__C, classifier__clf__gamma

问题是:如何为 GridSearchCV(...) 编写 grid_params 作为管道步骤之一不是管道对象而是自定义估计器对象?

最佳答案

GridSearchCVPipeline 使用估计器的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__ 将被网格搜索剥离,因此无需处理)。

关于python - 如何为具有自定义管道的自定义估算器运行网格搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54345707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com