如何使用作为迭代器的训练数据进行scikit-learn网格搜索



我正在使用如下所示的管道处理文本分类问题:

self.full_classifier = Pipeline([
        ('vectorize', CountVectorizer()),
        ('tf-idf', TfidfTransformer()),
        ('classifier', SVC(kernel='linear', class_weight='balanced'))
    ])

完整的语料库太大,无法放入内存,但足够小,在矢量化步骤之后我没有内存问题。我可以通过使用成功拟合分类器

self.full_classifier.fit(
        self._all_data (max_samples=train_data_length),
        self.dataset.head(train_data_length)['target'].values
)

其中self._all_data是一个迭代器,它为每个训练示例生成文档(而 self.dataset 仅包含文档 ID 和目标)。在这里,max_samples是可选的,我使用它来对训练/测试数据进行拆分。我现在想使用 gridsearch 来优化参数,为此我使用以下代码:

parameters = {
        'vectorize__stop_words': (None, 'english'),
        'tfidf__use_idf': (True, False),
        'classifier__class_weight': (None, 'balanced')
    }
gridsearch_classifier = GridSearchCV(self.full_classifier, parameters, n_jobs=-1)
gridsearch_classifier.fit(self._all_data(), self.dataset['target'].values)

我的问题是这会生成以下错误:

TypeError: Expected sequence or array-like, got <type 'generator'>

回溯指向gridsearch_classifier.fit方法(然后进入scikit的代码,在_num_samples(x)中引发错误。由于可以安装生成器作为输入,我想知道是否也有一种方法可以通过网格搜索来做到这一点,我目前缺少。任何帮助不胜感激!

并非没有将生成器具体化为列表。虽然各种拟合方法通常可以结构化为一次使用一个项目,从而接受迭代器,但网格搜索还执行交叉验证,并通过索引已实现的集合来生成数据的 cv 拆分。

相关内容

  • 没有找到相关文章

最新更新