如何使用Scikit-learn的Gaussian Process实现时间序列预测并求示例代码
基于scikit-learn高斯过程的时间序列预测示例
高斯过程做时间序列预测的核心逻辑是将时间步(或额外的时序滞后特征)作为模型输入,时序观测值作为拟合目标,以下是可直接运行的概念性实现:
依赖导入
import numpy as np import matplotlib.pyplot as plt from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import Matern, WhiteKernel, ExpSineSquared
构造时序数据集
这里用带噪声的正弦波模拟时序,可直接替换为自己的真实数据集
# 生成200个时间步作为输入特征 time_steps = np.linspace(0, 10, 200).reshape(-1, 1) # 生成带噪声的正弦观测值 y = np.sin(time_steps).ravel() + 0.1 * np.random.randn(len(time_steps)) # 划分训练集、测试集:前150个点训练,后50个点做预测验证 train_X = time_steps[:150] train_y = y[:150] test_X = time_steps[150:] test_y = y[150:]
定义并训练高斯过程模型
核函数可根据时序特征调整,示例用Matern核适配非光滑时序,加白噪声核拟合观测噪声
# 周期性强的时序可额外叠加ExpSineSquared核 kernel = Matern(length_scale_bounds=(1e-2, 1e2), nu=1.5) + WhiteKernel(noise_level_bounds=(1e-5, 1e1)) gpr = GaussianProcessRegressor(kernel=kernel, random_state=42) # 训练模型 gpr.fit(train_X, train_y)
未来观测值预测
直接预测测试集所有时间步结果
# return_std设为True可同时返回预测的标准差,用于计算置信区间 y_pred, y_std = gpr.predict(test_X, return_std=True)
基于部分测试集已知观测值迭代预测更远未来
如果已经拿到测试集的部分真实观测值,可将其加入训练集提升后续预测精度
# 假设已拿到测试集前10个点的真实观测值 known_test_num = 10 # 扩充训练集 extended_train_X = np.vstack([train_X, test_X[:known_test_num]]) extended_train_y = np.hstack([train_y, test_y[:known_test_num]]) # 重新拟合模型(小数据集可直接重训,大数据集可改用稀疏高斯过程优化) gpr.fit(extended_train_X, extended_train_y) # 预测后续20个时间步的结果 future_X = test_X[known_test_num:known_test_num+20] future_pred, future_std = gpr.predict(future_X, return_std=True)
结果可视化验证
plt.figure(figsize=(12, 6)) plt.plot(train_X, train_y, c='blue', label='训练集观测值') plt.plot(test_X, test_y, c='green', label='测试集真实值') plt.plot(test_X, y_pred, c='red', label='测试集预测值') # 绘制95%置信区间 plt.fill_between(test_X.ravel(), y_pred - 1.96*y_std, y_pred + 1.96*y_std, color='pink', alpha=0.3, label='95%置信区间') plt.xlabel('时间步') plt.ylabel('观测值') plt.legend() plt.show()
优化建议
- 预测精度不足时可加入滞后特征作为输入,即将t时刻前k个观测值也作为输入特征的维度,比仅用时间步拟合效果更好
- 超过1000个样本的时序数据集不建议直接用原生sklearn GPR,计算复杂度为O(n^3),可改用稀疏高斯过程实现降低开销
- 周期性强的时序可在核函数中叠加
ExpSineSquared核捕捉周期规律
内容的提问来源于stack exchange,提问作者myselfesteem
相关产品推荐
相关产品推荐

