我正在使用如下所示的管道处理文本分类问题:
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 拆分。