管道GridSearchCV,不同步骤中的相应参数

时间:2020-09-08 15:47:09

标签: python pipeline hyperparameters gridsearchcv

我正在尝试在管道中进行一些超参数调整,并具有以下设置:

model = KerasClassifier(build_fn = create_model, epochs = 5)  
pipeline = Pipeline(steps =[('Tokenizepadder', TokenizePadding()),
                          ('NN', model)] )

在Tokenizepadder和我的神经网络中都有一个变量“ maxlen”(对于神经网络,它称为max_length,我担心将它们命名为相同的名称会在以后的代码中引起错误)。当我尝试执行网格搜索时,我正在努力使这些值对应。如果我分别对这些值进行网格搜索,它们将不会满足要求,并且输入数据将与神经网络不匹配。

简而言之,我想做些类似的事情:


pipeline = Pipeline(steps =[('Tokenizepadder', TokenizePadding()),
                           ('NN', KerasClassifier(build_fn = create_model, epochs = 5, max_length = pipeline.get_params()['Tokenizepadder__maxlen']))] )

因此,当我在网格中搜索参数'Tokenizepadder__maxlen'时,它将把'NN__max_length'值更改为相同的值。

1 个答案:

答案 0 :(得分:0)

也许您可以更改分类器和标记器,以传递max_len参数。然后,仅使用标记符max_len参数进行网格搜索。 不是最干净的方法,但是可能会做到。

from sklearn.base import BaseEstimator, TransformerMixin, EstimatorMixin
class TokeinizePadding(BaseEstimator, TransformerMixin):
    def __init__(self, max_len, ...):
        self.max_len = max_len
        ...

    def fit(self, X, y=None):
        ...
        return self
   
    def transform(self, X, y=None):
        data = ... # your stuff
        return {"array": data, "max_len": self.max_len}
 

class KerasClassifier(...):
    ...
    def fit(data, y):
        self.max_len = data["max_len"]
        self.build_model()
        X = data["array"]
        ... # your stuff