【发布时间】:2019-07-15 17:46:59
【问题描述】:
我确信这是可能的,但我无法弄清楚。使用TimeSeriesSplit 和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 时只通过系列中的最后两个拆分的方法?所以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')
【问题讨论】:
-
您使用的实际管道是什么样的?矢量化器应该能够在任何拆分之前应用
-
用管道信息编辑主帖。
-
@G.Anderson 不,管道中的所有步骤只会在拆分后完成,在训练数据上调用
fit(),在拆分的测试数据上只调用transform()和predict()。 -
不建议对整个数据运行 TfidfVectorizer 然后进行拆分,这会破坏交叉验证的整个目的。然而,另一件事(仅发送最后两个拆分)可以完成。您要执行 2 重验证吗?
-
使用超集的交叉验证已经“有点”违背了目的。至少对于正常的 CV,您的训练/测试大小在每次迭代时都是相同的,但是使用每次迭代都会彻底改变训练集的超集反过来会极大地改变 TfidfVectorizer 可以提取的特征数量。我可以看到硬币的两面。要回答您的其他问题,是的 - 我想知道如何仅使用最后 2、3 或 4 个超集使用 2 折(或 3 或 4 等)验证来做到这一点。谢谢!
标签: python scikit-learn tf-idf tfidfvectorizer gridsearchcv