0

我确定这是可能的,但我无法弄清楚。TimeSeriesSplit使用with给出一个训练数据集num_split=5,拆分如下所示:

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

问题在于前几遍,TfidfVectorizer正在使用名义数量的词汇/特征,我想在拆分之前在整个训练集上运行它,以便所有拆分的特征大小保持相同。

然而,除此之外,有没有人知道在使用TimeSeriesSplit时只通过系列中的最后两个拆分的方法?因此,而不是所有 5 个拆分,GridSearchCV只使用这两个:

[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')
4

1 回答 1

0

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

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

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

于 2019-02-25T23:09:35.053 回答