scikit-learn:cross_val_predict 仅适用于分区
Posted
技术标签:
【中文标题】scikit-learn:cross_val_predict 仅适用于分区【英文标题】:scikit-learn: cross_val_predict only works for partitions 【发布时间】:2017-09-02 16:24:48 【问题描述】:我正在努力研究如何在 sklearn 中实现 TimeSeriesSplit。
以下链接中的建议答案产生相同的 ValueError。
sklearn TimeSeriesSplit cross_val_predict only works for partitions
这里是我的代码中的相关部分:
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:datascience.stackexchange.com/a/105116/76808 【参考方案1】: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 函数的要点。 如果您想在最大数据量上进行训练,TimeSeriesSplit 将为您提供这一点,因为理论上您可以在最后一折中除一个观察之外的所有观察结果训练您的模型。使用 TimeSeriesSplit 的主要原因是当你不能使用例如leave-k-out crossvalidation,因为这会因为与其他观察结果的相关性而留下信息。以上是关于scikit-learn:cross_val_predict 仅适用于分区的主要内容,如果未能解决你的问题,请参考以下文章