所有文章 > AI驱动 > 时间窗口划分:时序预测模型的多种形式解析

时间窗口划分:时序预测模型的多种形式解析

当涉及时间序列数据的预测和分析时,时间窗口的划分是一个至关重要的概念,时间窗口可以理解为我们在时间序列数据中选取的一段时间范围来预测下一个时间点或时间段,利用划分的数据进行训练预测模型,在时间序列预测中,我们通常面临着不同类型的预测问题,例如单输入单输出、多输入单输出、单输入多输出等等,每种预测问题都有不同的应用场景和适用模型,在本文中,我们将探讨不同类型的时间窗口如何划分,从单输入单输出到多输入多输出,以帮助读者更好地理解时间窗口是如何划分。

1. 数据生成

import pandas as pd
import numpy as np

start_date = '2024-01-01'
end_date = '2024-12-31'
dates = pd.date_range(start=start_date, end=end_date)

data = {
'Feature1': np.random.randn(len(dates)),
'Feature2': np.random.rand(len(dates)) * 100, # 生成0到100之间的随机数
'Feature3': np.random.randint(1, 100, size=len(dates)) # 生成1到100之间的随机整数
}

df = pd.DataFrame(data, index=dates)
df

在这里我们生成一个时序数据,接下将使用不同的窗口形式对该数据进行时间窗口划分。

2. 单输入单输出单步预测

def prepare_data(data, win_size):
X = []
y = []

for i in range(len(data) - win_size):
temp_x = data[i:i + win_size]
temp_y = data[i + win_size]
X.append(temp_x)
y.append(temp_y)

X = np.asarray(X)
y = np.asarray(y)
X = np.expand_dims(X, axis=-1)
return X, y

win_size = 12
X, y = prepare_data(df['Feature1'].values, win_size)

train_size = int(len(X) * 0.7)

X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]

print("训练集形状:", X_train.shape, y_train.shape)
print("测试集形状:", X_test.shape, y_test.shape)

单输入单输出单步预测指的是在时间序列预测中,使用单个特征(或变量)的历史观测数据来预测未来该输入特征单个时间点的结果。

在这里数据形状维度的含义为:训练集包含 247 个样本,每个样本时间窗口为12,每个时间步长有 1 个特征;测试集包含 107 个样本,每个样本时间窗口为12,每个时间步长有 1 个特征。

3. 单输入单输出多步预测

def prepare_data(data, win_size, steps):
X = []
y = []

for i in range(len(data) - win_size - steps + 1):
temp_x = data[i:i + win_size]
temp_y = data[i + win_size:i + win_size + steps]
X.append(temp_x)
y.append(temp_y)

X = np.asarray(X)
y = np.asarray(y)
X = np.expand_dims(X, axis=-1)
return X, y

win_size = 12
steps = 3 # 修改为多步预测,预测未来3个时间步
X, y = prepare_data(df['Feature1'].values, win_size, steps)

train_size = int(len(X) * 0.7)

X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]

print("训练集形状:", X_train.shape, y_train.shape)
print("测试集形状:", X_test.shape, y_test.shape)

单输入单输出多步预测指的是使用单个特征的历史观测数据来预测未来连续多个时间点的结果。

在这里数据形状维度的含义为:训练集包含 246 个样本,每个样本有 12 个时间步长,每个时间步长有 1 个特征,同时输出该输入特征未来三个时间点的预测结果;测试集包含 106 个样本,每个样本有 12 个时间步长,每个时间步长有 1 个特征,同时输出该输入特征未来三个时间点的预测结果。

4. 多输入单输出单步预测

ef prepare_data(data, win_size, target_feature_idx):
num_features = data.shape[1]
X = []
y = []
for i in range(len(data) - win_size):
temp_x = data[i:i + win_size, :]
temp_y = data[i + win_size, target_feature_idx]
X.append(temp_x)
y.append(temp_y)
X = np.asarray(X)
y = np.asarray(y)

return X, y

win_size = 12
target_feature_idx = 0 # 指定待预测特征列
X, y = prepare_data(df.values, win_size, target_feature_idx)

train_size = int(len(X) * 0.7)

X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]

print("训练集形状:", X_train.shape, y_train.shape)
print("测试集形状:", X_test.shape, y_test.shape)

多输入单输出单步预测是指使用多个特征的历史观测数据来预测未来单个时间点的结果。

在这里数据形状维度的含义为:训练集包含 247 个样本,每个样本有 12 个时间步长,每个时间步长有 3 个特征,同时有 1 个目标变量;测试集包含 107 个样本,每个样本有 12 个时间步长,每个时间步长有 3 个特征,同时有 1 个目标变量。

5. 多输入单输出多步预测

def prepare_data(data, win_size, target_feature_idx, steps):
num_features = data.shape[1]
X = []
y = []
for i in range(len(data) - win_size - steps + 1):
temp_x = data[i:i + win_size, :]
temp_y = data[i + win_size:i + win_size + steps, target_feature_idx]
X.append(temp_x)
y.append(temp_y)
X = np.asarray(X)
y = np.asarray(y)

return X, y

win_size = 12
target_feature_idx = 0 # 指定待预测特征列
steps = 3 # 预测未来3个时间步
X, y = prepare_data(df.values, win_size, target_feature_idx, steps)

train_size = int(len(X) * 0.7)

X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]

print("训练集形状:", X_train.shape, y_train.shape)
print("测试集形状:", X_test.shape, y_test.shape)

多输入单输出多步预测是指使用多个特征的历史观测数据来预测未来连续多个时间点的结果。

在这里数据形状维度的含义为:训练集包含 246 个样本,每个样本有 12 个时间步长,每个时间步长有 3 个特征,同时输出指定预测特征序列未来三个时间点的预测结果;测试集包含 106 个样本,每个样本有 12 个时间步长,每个时间步长有 3 个特征,同时输出指定预测特征序列未来三个时间点的预测结果。

6. 多输入多输出单步预测

def prepare_data(data, win_size, target_feature_idx):
num_features = data.shape[1]
X = []
y = []
for i in range(len(data) - win_size):
temp_x = data[i:i + win_size, :]
temp_y = data[i + win_size, target_feature_idx]
X.append(temp_x)
y.append(temp_y)
X = np.asarray(X)
y = np.asarray(y)

return X, y

win_size = 12
target_feature_idx = [0,1,2] # 指定待预测特征列
X, y = prepare_data(df.values, win_size, target_feature_idx)

train_size = int(len(X) * 0.7)

X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]

print("训练集形状:", X_train.shape, y_train.shape)
print("测试集形状:", X_test.shape, y_test.shape)

多输入多输出单步预测是指使用多个特征的历史观测数据来预测未来多个特征单个时间点的输出特征结果。

在这里数据形状维度的含义为:训练集包含 247 个样本,每个样本有 12 个时间步长,每个时间步长有 3 个特征,同时有 3 个目标变量(也就是指定的待预测序列);测试集包含 107 个样本,每个样本有 12 个时间步长,每个时间步长有 3 个特征,同时有 3 个目标变量(也就是指定的待预测序列)。

7. 多输入多输出多步预测

def prepare_data(data, win_size, target_feature_idx, steps):
num_features = data.shape[1]
X = []
y = []
for i in range(len(data) - win_size - steps + 1):
temp_x = data[i:i + win_size, :]
temp_y = data[i + win_size:i + win_size + steps, target_feature_idx]
X.append(temp_x)
y.append(temp_y)
X = np.asarray(X)
y = np.asarray(y)

return X, y

win_size = 12
target_feature_idx = [0, 1, 2] # 指定待预测特征列
steps = 4 # 预测未来4个时间步
X, y = prepare_data(df.values, win_size, target_feature_idx, steps)

train_size = int(len(X) * 0.7)

X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]

print("训练集形状:", X_train.shape, y_train.shape)
print("测试集形状:", X_test.shape, y_test.shape)

多输入多输出多步预测是指使用多个特征的历史观测数据来预测未来多个特征多个时间点的输出特征结果。

在这里数据形状维度的含义为:训练集包含 245 个样本,每个样本有 12 个时间步长,每个时间步长有 3 个特征,同时有 3 个目标变量(也就是指定的待预测序列),同时输出每个目标变量未来三个时间点的预测结果;测试集包含 106 个样本,每个样本有 12 个时间步长,每个时间步长有 3 个特征,同时有 3 个目标变量(也就是指定的待预测序列),同时输出每个目标变量未来三个时间点的预测结果。

文章转自微信公众号@Python机器学习AI