在时间序列数据中,TimeSeriesSplittrain_indexvalid_index 的矩阵元素数量由以下几个因素决定:

  1. 时间序列的总长度 (n_samples):即整个数据集的样本数量。train_indexvalid_index 会从中划分出不同的数据块。
  2. 划分的次数 (n_splits):定义了交叉验证要进行多少次切分。在每次切分中,训练集和验证集都会被分成不同的部分。
  3. 验证集大小:在每次切分中,验证集的大小是固定的,通常会包含一部分未来的时间步,而训练集则包括之前的所有时间步。

TimeSeriesSplit 划分逻辑

TimeSeriesSplit 会在时间序列数据中按顺序生成多个分割,每次分割时,训练集中的数据集大小逐渐增加,而验证集始终是后续的一段数据。验证集的大小通常是由数据总长度和分割次数 n_splits 决定的。

以例子为基础,假设总样本数为 n_samples = 10,划分次数 n_splits = 3TimeSeriesSplit 的划分逻辑如下:

第一次划分:
  • train_index:前面较小的部分作为训练集。假设此时训练集的长度为 5 个时间步。
  • train_index: [0, 1, 2, 3, 4]
  • valid_index:接下来的时间步作为验证集。验证集长度根据交叉验证的配置来定,这里假设是 2 个时间步。
  • valid_index: [5, 6]
第二次划分:
  • train_index:每次迭代训练集的大小会扩展,包括更多的时间步。训练集现在包含更多的时间步数据。
  • train_index: [0, 1, 2, 3, 4, 5, 6]
  • valid_index:后续的时间步作为验证集。
  • valid_index: [7, 8]
第三次划分:
  • train_index:继续增加训练集的长度,包含所有前面的时间步。
  • train_index: [0, 1, 2, 3, 4, 5, 6, 7, 8]
  • valid_index:验证集是剩下的最后一个时间步。
  • valid_index: [9]

具体矩阵元素数量如何确定:

  1. 训练集 (train_index)
  • 每次交叉验证的训练集包含从第一个时间步开始的所有时间步,直到某个时间步为止。每次迭代,训练集的大小会增加,包含所有过去的数据点。
  • 第一次划分时,训练集较小(例如 [0, 1, 2, 3, 4]),而随着每次迭代,训练集的大小会逐渐变大。
  1. 验证集 (valid_index)
  • 验证集包含未来的数据点,每次都是前面数据之后的一个连续的时间步。验证集的大小在每次交叉验证中是固定的(假设为 2 个元素),并且验证集的时间步永远不会与训练集的时间步重叠。
  • 验证集的大小由 TimeSeriesSplit 的设置自动决定。在这种分割方式下,验证集通常是比训练集“更晚”的时间步。

TimeSeriesSplit 的特点:

  • 验证集不会回溯,也就是说,验证集的数据永远位于训练集的“未来”,保证了时间序列的顺序性。
  • 训练集逐渐变大,包含了更多的历史数据。