【问题标题】:Cross-validation for time-series时间序列的交叉验证
【发布时间】:2018-10-10 09:42:24
【问题描述】:

我正在使用 sklearn 中的 Timeseriessplit 函数来创建训练集和测试集 用于时间序列的交叉验证。例如,这个想法是使用 n-1 个数据点进行训练,使用第 n 个数据点进行测试。此拆分必须始终是有序的,因为它是一个时间序列。 但是,我不明白,为什么示例中的数据集 X 的格式如下:

from sklearn.model_selection import TimeSeriesSplit
import numpy as np
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4])
tscv = TimeSeriesSplit(n_splits=3)
print(tscv)  
for train_index, test_index in tscv.split(X):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

将数据准备为 X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]]) 背后的逻辑是什么? 当然,我看了页面上的注释,但还是不明白

【问题讨论】:

  • 您能否尝试更具体地说明您对 X 数组结构完全不了解的内容?

标签: python machine-learning scikit-learn


【解决方案1】:

通常在您想要基于 X[0:t-1] 数据预测 y[t] 的时间序列数据中。这个sklearn.model_selection.TimeSeriesSplit 方法似乎将单个完整时间序列X 大小为N(其中N 是不同时间步长的实例数)及其在每个时间步长y 的相应标签作为参数。然后,X 的形状是 (4,2),因为我们有四个不同时间步长的实例,每个实例有 2 个特征。

我们如何解释这两个特征可能会引起争议:

  1. 我们可以将每个实例视为具有一组特征的特定时间点的单个样本。或者...
  2. 我们可以将每个实例视为一组时间点,在一个时间间隔内定义实例本身。

这两个选项对我来说似乎都是正确的。虽然我们可以如何解释X的结构,但这里的问题是TimeSeriesSplit如何将数据从训练数据实例的先前时间步中拆分出来,避免测试数据实例。

【讨论】:

  • 所以,最后一个[3,4]不一定反映第一个[3,4],即我们拥有的更像:([Timepoint1_Day1, Timepoint2_Day1], [Timepoint1_Day2, Timepoint2_Day2], [[Timepoint1_Day3, Timepoint2_Day3]], [[Timepoint1_Day4, Timepoint2_Day4]])?我只是想知道我的 timerseries 是否是一个数组,我是否必须将其拆分才能将其传递给该函数?
  • 你好@TestGuest。我一直在考虑您的问题,并认为我之前的回答是片面的和不完整的,这可能会产生误导。我已经编辑过了,请再检查一遍!
  • 关于您的评论问题。它不一定具有您建议的结构([Timepoint1_Day1, Timepoint2_Day1], [Timepoint1_Day2, Timepoint2_Day2], [[Timepoint1_Day3, Timepoint2_Day3]], [[Timepoint1_Day4, Timepoint2_Day4]]),请查看我的新扩展答案。 ---关于您的第二个问题,您不一定需要拆分长的一个数组时间序列数据。如果您解释您的具体问题,我可能会尝试帮助您完成我会做的事情(在通过函数之前拆分或不拆分数据)。
猜你喜欢
  • 2016-12-06
  • 2020-05-30
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 2021-02-27
  • 2019-01-28
  • 2016-02-28
相关资源
最近更新 更多