def split_data(stock, lookback):
data_raw = stock.to_numpy()
data = []
for index in range(len(data_raw) - lookback):
data.append(data_raw[index: index + lookback])
data = np.array(data)
test_set_size = int(np.round(0.2 * data.shape[0]))
train_set_size = data.shape[0] - test_set_size
x_train = data[:train_set_size, :-1, :]
y_train = data[:train_set_size, -1, :]
x_test = data[train_set_size:, :-1]
y_test = data[train_set_size:, -1, :]
return [x_train, y_train, x_test, y_test]
原始数据与滑动窗口:
假设原始数据为 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],lookback = 3,则通过滑动窗口生成的序列数据为:
[[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6],
[5, 6, 7],
[6, 7, 8],
[7, 8, 9],
[8, 9, 10]]
这里每一行是一个样本,每个样本包含 3 个时间步的数据。
划分训练集和测试集:
假设测试集占 20%,则:
- 总样本数:8
- 测试集大小:
int(np.round(0.2 * 8)) = 2 - 训练集大小:
8 - 2 = 6
因此:
- 训练集:前 6 个样本。
- 测试集:后 2 个样本。
什么是“前 6 个样本的前 2 个时间步”?
对于训练集:
- 每个样本包含 3 个时间步的数据,例如
[1, 2, 3]。 x_train是每个样本的前 2 个时间步,即[1, 2]。y_train是每个样本的第 3 个时间步,即[3]。
因此:
x_train是从前 6 个样本中提取的前 2 个时间步:[[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]]y_train是从前 6 个样本中提取的第 3 个时间步:[3, 4, 5, 6, 7, 8]
什么是“后 2 个样本的前 2 个时间步”?
对于测试集:
- 每个样本包含 3 个时间步的数据,例如
[7, 8, 9]。 x_test是每个样本的前 2 个时间步,即[7, 8]。y_test是每个样本的第 3 个时间步,即[9]。
因此:
x_test是从后 2 个样本中提取的前 2 个时间步:[[7, 8], [8, 9]]y_test是从后 2 个样本中提取的第 3 个时间步:[9, 10]
最终划分结果:
- 训练集:
x_train:[[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]]y_train:[3, 4, 5, 6, 7, 8]
- 测试集:
x_test:[[7, 8], [8, 9]]y_test:[9, 10]
为什么需要 x 和 y?
x是模型的输入特征,表示过去一段时间的数据。y是模型的目标值,表示需要预测的下一个时间步的数据。- 通过这种方式,模型可以学习从
x到y的映射关系。
总结:
- “前 6 个样本的前 2 个时间步”是指从训练集的 6 个样本中,提取每个样本的前 2 个时间步作为
x_train。 - 同理,
y_train是从训练集的 6 个样本中,提取每个样本的第 3 个时间步作为目标值。 - 测试集的划分方式与训练集相同。
如果还有疑问,请随时提出!
2366



被折叠的 条评论
为什么被折叠?



