sklearn管道:在GridSearchCV中应用TimeSeriesSplit之前,在完整的训练集上运行TfidfVectorizer?

问题描述 投票:0回答:1

我确信这是可能的,但我无法弄明白。使用带有TimeSeriesSplitnum_split=5提供训练数据集,分割看起来像这样:

[0] : [1]
[0 1] : [2]
[0 1 2] : [3]
[0 1 2 3] : [4]
[0 1 2 3 4] : [5]

问题是前几次通过,TfidfVectorizer正在使用名义数量的词汇/功能,我想在分割之前在整个训练集上运行它,以便所有分割的特征尺寸保持相同。

但是,除此之外,是否有人知道一种方法,使用TimeSeriesSplit时,只传递系列中的最后两个分裂?所以GridSearchCV不是全部5个分裂,而是使用这两个:

[0 1 2 3] : [4]
[0 1 2 3 4] : [5]

这将允许更好的矢量化拟合,即使它在通过之间不相同 - 至少它在验证之前具有更大的部分。

谢谢。

编辑:

我正在使用的管道基本上是TfidfVectorizer,然后是分类器。但是对数据和功能进行一些检查看起来数据集在被送到TfidVectorizer()之前就被拆分了。这是广泛的笔触:

tscv = TimeSeriesSplit(n_splits=5)
pipe = Pipeline([('tfidf', TfidfVectorizer(), 'rfc', RandomForestClassifier()])
grid = GridSearchCV(pipe, params, cv=tscv, scoring='roc_auc')
python scikit-learn tf-idf tfidfvectorizer gridsearchcv
1个回答
0
投票

这似乎做我想要的。没有意识到你基本上只能传递cv一个可迭代的。您所要做的就是创建一个时间序列拆分,或者您想要的任何拆分,并传递包含索引的迭代。因此,如果您有一个10项数据集,并且您只想要num_split=4的最后两个时间序列拆分,您只需将其传递给cv:

cv = [([0, 1, 2, 3, 4, 5], [6, 7]),
      ([0, 1, 2, 3, 4, 5, 6, 7], [8, 9]))

通过这种方式,您可以传递任何您想要的迭代元组。

© www.soinside.com 2019 - 2024. All rights reserved.