我确信这是可能的,但我无法弄明白。使用带有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')
这似乎做我想要的。没有意识到你基本上只能传递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]))
通过这种方式,您可以传递任何您想要的迭代元组。