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

sklearn pipeline: running TfidfVectorizer on full training set before applying TimeSeriesSplit inside GridSearchCV?

我确定这是可能的,但我还没弄明白。使用 TimeSeriesSplitnum_split=5 给出一个训练数据集,拆分看起来像这样:

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

问题是第一对传球,TfidfVectorizer 正在使用标称数量的 vocab/features,我想 运行 在拆分之前对整个训练集进行处理以便所有拆分的特征大小保持相同。

然而,除此之外,有人知道在使用 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')

这似乎是我想要的。没有意识到你基本上可以将 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]))

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