【问题标题】:Cannot clone object error when using gridsearchCV in a pipeline在管道中使用 gridsearchCV 时无法克隆对象错误
【发布时间】:2020-12-22 16:16:24
【问题描述】:

我正在制作一个由 tfidf 矢量化器和 xgboost 分类器组成的管道,并且我正在尝试为我的问题找到矢量化器的最佳参数。但是,我收到以下错误:

Cannot clone object Text2TfIdfTransformer(max_df=0.5, max_features=1000), as the constructor either does not set or modifies parameter max_df.

代码如下:

class Text2TfIdfTransformer(BaseEstimator):

    def __init__(self, max_df = 1, max_features = 3000):
        self._model = TfidfVectorizer(max_df, max_features, sublinear_tf=True)
        pass

    def fit(self, data, df_y=None):
        self._model.fit(data)
        return self

    def transform(self, text):
        return self._model.transform(text)
    


pl_xgb_tf_idf = Pipeline(steps=[('tfidf',Text2TfIdfTransformer()),
                         ('xgboost', XGBClassifier(objective='multi:softmax'))])


parameters = {'tfidf__max_df':[.5,.6], 'tfidf__max_features': [1000]}
grid = GridSearchCV(pl_xgb_tf_idf, param_grid=parameters, cv=5)
grid.fit(X,labels)

我不确定在调用 init 时是否应该声明变量 max_df 和 max_features 但如果我不在这里声明它们,我会得到另一个错误(估计器没有任何变量)

我确定我缺少一些基本的东西,但我找不到它到底是什么,任何帮助将不胜感激!

如有重要信息遗漏,请追问!

【问题讨论】:

    标签: python scikit-learn pipeline gridsearchcv


    【解决方案1】:

    需要保留父类的fit和transform函数的参数名称

        def fit(self, X, y):
            self._model.fit(X)
            return self
    
        def transform(self, x):
            return self._model.transform(x)
    

    【讨论】:

      【解决方案2】:

      您需要在 __init __ 中声明参数才能对它们运行网格搜索,否则您将违反 sklearn API 约定。

      这应该可以解决您的问题:

      def __init__(self, max_df = 1, max_features = 3000):
          self.max_df = max_df
          self.max_features = max_features
          self._model = TfidfVectorizer(self.max_df, self.max_features, sublinear_tf=True)
      

      【讨论】:

      • 您好,感谢您的帮助,代码至少正在运行,但我注意到一些奇怪的行为。无论我传递什么参数,它似乎只是使用我在初始化时传递的默认参数进行计算。我开始怀疑这是因为 gridsearchCV 仅在为管道的最后阶段传递参数时才适用?但如果这是真的,我会感到惊讶。 (在我的参数中传递多个选项时,交叉验证中的所有分数都是相同的)为什么会发生这种情况?如有必要,我总是可以分享更多代码!
      猜你喜欢
      • 1970-01-01
      • 2021-02-13
      • 2020-05-01
      • 2020-05-06
      • 2017-11-07
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      相关资源
      最近更新 更多