scikit-learn: cross_val_predict仅适用于分区。

11

我在努力学习如何在sklearn中实现TimeSeriesSplit。

以下链接中提供的建议会导致同样的ValueError。

sklearn TimeSeriesSplit交叉验证预测仅适用于分区

这是我的代码中相关部分:

from sklearn.model_selection import cross_val_predict
from sklearn import svm

features = df[df.columns[0:6]]
target = df['target']

clf = svm.SVC(random_state=0)

pred = cross_val_predict(clf, features, target, cv=TimeSeriesSplit(n_splits=5).split(features))

ValueError                                Traceback (most recent call last)
<ipython-input-57-d1393cd05640> in <module>()
----> 1 pred = cross_val_predict(clf, features, target, cv=TimeSeriesSplit(n_splits=5).split(features))

/home/jedwards/anaconda3/envs/py36/lib/python3.6/site-packages/sklearn/model_selection/_validation.py in cross_val_predict(estimator, X, y, groups, cv, n_jobs, verbose, fit_params, pre_dispatch, method)
    407 
    408     if not _check_is_permutation(test_indices, _num_samples(X)):
--> 409         raise ValueError('cross_val_predict only works for partitions')
    410 
    411     inv_test_indices = np.empty(len(test_indices), dtype=int)

ValueError: cross_val_predict only works for partitions

如何在堆叠上下文中使用TimeSeriesSplit和cross_val_predict:https://datascience.stackexchange.com/a/105116/76808 - Marco Cerliani
1个回答

12

cross_val_predict无法与TimeSeriesSplit一起使用,因为TimeSeriesSplit的第一个分区永远不是测试数据集的一部分,这意味着没有针对它进行任何预测。

例如,当你的数据集为[1, 2, 3, 4, 5]时:

  • 折叠1 - 训练集:[1],测试集:[2]
  • 折叠2 - 训练集:[1, 2],测试集:[3]
  • 折叠3 - 训练集:[1, 2, 3],测试集:[4]
  • 折叠4 - 训练集:[1, 2, 3, 4],测试集:[5]

在所有的交叉验证中,1都不在测试集中。

如果你想要对2-5进行预测,你可以手动遍历由CV生成的拆分,并自行存储2-5的预测结果。


谢谢。如果我们希望在最大数据量上进行训练和测试,那么额外的循环似乎有点无意义。在这种情况下,只需在某个任意索引处(例如75%的训练数据)拆分数据可能会更容易。也许我没有理解TimeSeriesSplit函数的重点。 - James Edwards
如果您想要在最大数据量上进行训练,TimeSeriesSplit 将为您提供此功能,因为您可以在最后一个折叠中理论上对除一条观测值以外的所有数据进行模型训练。使用 TimeSeriesSplit 的主要原因是当您无法使用例如 leave-k-out 交叉验证时,因为这会留下与其他观测值相关的信息。 - Matthijs Brouns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接