在进行时间序列的预测时要时刻记住,在预测当前时刻的值时不能使用未来的数据。在启示我们在做数据预处理要格外当心,例如指数平滑就会导致信息泄露。你可以做这样一个测试,对一个自回归的时间序列使用线性拟合,以及对自回归的时间序列指数平滑后使用线性拟合,你会发现平滑的程度越大,窗口越大,预测的效果就越好。这是一种非常严重的问题(术语叫做lookahead),却很容易被忽视。
为了避免这种现象,一个黄金标准是对于每个模型都应当在划分好的训练集,验证集和测试集上做回测。回测的做法是利用时间序列中的某一段构建模型,然后在历史数据中进行广泛测试,以尽可能模拟更多的情况可能性。
具体来说,可以采用类似机器学习中的交叉验证方法。假设将数据集分段,以字母ABCD排序后,构建以下的交叉验证组合,也就是训练序列每次向后滑动一段加入训练集中,测试序列每次向后滑动一段。
选择何种交叉验证方式取决于几方面因素,如果你认为你的时间序列存在随着时间演变的行为,那第二种会是更好的选择,因为模型拟合的是测试阶段和最相关数据之间的关系。另一个考虑的因素是过拟合,如果你想尽量避免过拟合,第一种方式会是更好的选择。
import numpy as np
from sklearn.model_selection import TimeSeriesSplit
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4, 5, 6])
tscv = TimeSeriesSplit()
# 自动划分训练和测试集
for train_index, test_index in tscv.split(X):
print("TRAIN:", train_index, "TEST:", test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
模型是否已经足够好了取决于你的总体目标时,最低实现目的的模型质量,以及数据集本身的限制。如果数据本身具有非常高的噪声,你对模型的效果相应也会降低预期。此外在模型评估时要记住该领域的专家知识通常接近于模型的性能上限。
传统统计学方法的一个优势是模型参数可以得到不确定性估计。对于不确定性,我们还可以借助计算模拟方法理解预测模型中的不确定性,即使是非统计学方法也可以用计算模拟方法来分析。