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

时间:2019-02-21 17:58:46

标签: python scikit-learn tf-idf tfidfvectorizer 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 /功能,我希望在分割之前在整个训练集上运行该功能,以使功能尺寸保持不变对于所有拆分。

但是,除了使用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')

1 个答案:

答案 0 :(得分: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]))

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