趋近智
在衡量预测模型的表现之前,我们需要一种可靠的方法来划分用于构建模型(训练)的数据和用于测试其预测准确性的数据。对于许多机器学习 (machine learning)任务,您可能会随机打乱数据并将其分成训练集和测试集。然而,这种方法对于时间序列分析存在根本性缺陷。
时间序列数据具有固有的时间顺序。每个观测值都依赖于之前的观测值。随机打乱数据会打破这一重要顺序,导致一些问题:
因此,评估时间序列模型需要一种尊重数据年代顺序的不同方法。
划分时间序列数据的标准方法是使用一个时间上的截止点。此点之前的所有数据成为训练集,此点之后的所有数据形成测试集(有时也称为保持集)。
这种按时间顺序的划分模拟了预测场景,即您基于过去数据构建模型并用它来预测未来的结果。
为了有效评估时间序列预测模型的性能,需要一种可靠的方法来将用于构建模型(训练)的数据与用于测试其预测准确性的数据分开。时间序列数据通常加载到带有DatetimeIndex的Pandas DataFrame或Series中。按时间顺序划分它很简单,您可以选择特定日期,或根据所需的划分百分比使用整数索引位置。
import pandas as pd
# 假设 'series' 是您带有 DatetimeIndex 的 pandas Series
# 例子:
# index = pd.date_range(start='2020-01-01', periods=100, freq='D')
# data = range(100)
# series = pd.Series(data, index=index)
# 方法 1: 按日期划分
cutoff_date = '2020-03-11' # 截止日期示例
train_data = series.loc[series.index < cutoff_date]
test_data = series.loc[series.index >= cutoff_date]
# 方法 2: 按位置划分 (例如,80% 训练,20% 测试)
split_point = int(len(series) * 0.8)
train_data_pos = series.iloc[:split_point]
test_data_pos = series.iloc[split_point:]
print(f"原始序列长度: {len(series)}")
print(f"训练集长度 (按日期划分): {len(train_data)}")
print(f"测试集长度 (按日期划分): {len(test_data)}")
print(f"训练集长度 (按位置划分): {len(train_data_pos)}")
print(f"测试集长度 (按位置划分): {len(test_data_pos)}")
以下是这种划分的可视化表示:
这是一个将时间序列数据划分为训练集(绿色)和测试集(橙色)的例子,使用截止日期。模型在垂直虚线之前的数据上训练,并在其之后的数据上评估。
您应该为测试集保留多少数据?没有唯一的完美答案,但以下是一些指导原则:
简单的训练-测试划分仅在一个特定时期评估模型。一种更严谨的方法是步进式验证,也称为滚动预测起点的评估。这种方法能更好地估计模型在实际部署场景中随时间的表现。
该过程以迭代方式进行:
步进式验证的流程。模型在扩展数据上反复训练,并在紧随其后的时间步上进行测试。
优点:
缺点:
像scikit-learn这样的库提供了TimeSeriesSplit等工具,可以帮助自动化生成步进式验证的索引,但您仍然需要自己实现模型拟合和预测循环。
正确划分时间序列数据是进行可靠模型评估不可或缺的第一步。通过尊重时间顺序,无论是采用简单的按时间顺序划分还是更高级的步进式验证,您都能确保评估指标反映模型在未见过的未来数据上的真实预测能力。这为计算和解释MA E、RMSE等指标奠定了基础,我们将在后续内容中介绍这些指标。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造