在时间序列数据中,TimeSeriesSplit
的 train_index
和 valid_index
的矩阵元素数量由以下几个因素决定:
- 时间序列的总长度 (
n_samples
):即整个数据集的样本数量。train_index
和valid_index
会从中划分出不同的数据块。 - 划分的次数 (
n_splits
):定义了交叉验证要进行多少次切分。在每次切分中,训练集和验证集都会被分成不同的部分。 - 验证集大小:在每次切分中,验证集的大小是固定的,通常会包含一部分未来的时间步,而训练集则包括之前的所有时间步。
TimeSeriesSplit 划分逻辑
TimeSeriesSplit
会在时间序列数据中按顺序生成多个分割,每次分割时,训练集中的数据集大小逐渐增加,而验证集始终是后续的一段数据。验证集的大小通常是由数据总长度和分割次数 n_splits
决定的。
以例子为基础,假设总样本数为 n_samples = 10
,划分次数 n_splits = 3
,TimeSeriesSplit
的划分逻辑如下:
第一次划分:
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]
具体矩阵元素数量如何确定:
- 训练集 (
train_index
):
- 每次交叉验证的训练集包含从第一个时间步开始的所有时间步,直到某个时间步为止。每次迭代,训练集的大小会增加,包含所有过去的数据点。
- 第一次划分时,训练集较小(例如
[0, 1, 2, 3, 4]
),而随着每次迭代,训练集的大小会逐渐变大。
- 验证集 (
valid_index
):
- 验证集包含未来的数据点,每次都是前面数据之后的一个连续的时间步。验证集的大小在每次交叉验证中是固定的(假设为 2 个元素),并且验证集的时间步永远不会与训练集的时间步重叠。
- 验证集的大小由
TimeSeriesSplit
的设置自动决定。在这种分割方式下,验证集通常是比训练集“更晚”的时间步。
TimeSeriesSplit
的特点:
- 验证集不会回溯,也就是说,验证集的数据永远位于训练集的“未来”,保证了时间序列的顺序性。
- 训练集逐渐变大,包含了更多的历史数据。