R中SVM单变量时间序列预测:如何获取y₁₀₁的一步超前预测?
解决R中SVM回归一步超前预测的问题
嘿,我来帮你搞定这个问题!你说用SVM回归拟合时间序列后,预测返回了100个结果,这大概率是因为你没有给模型传入正确的预测输入,而是默认用训练数据做了预测,所以得到的是每个训练样本的拟合值,而不是你要的y₁₀₁。
下面我一步步给你讲怎么调整:
第一步:先搞对时间序列的监督学习结构
SVM是监督学习模型,得先把你的时间序列转换成「用过去的观测值当特征,预测下一个时刻的值」的格式。举个最简单的例子(用滞后1期预测):
假设你的时间序列是ts_data,长度100:
# 构造训练特征:用第1到99个值,对应预测第2到100个值 train_features <- ts_data[1:99] # 构造训练目标:第2到100个值,也就是每个特征对应的下一个时刻值 train_target <- ts_data[2:100]
如果你用的是多滞后阶数(比如AR(3),用前3个值预测下一个),那特征要这么构造:
train_features <- cbind( lag1 = ts_data[1:97], lag2 = ts_data[2:98], lag3 = ts_data[3:99] ) train_target <- ts_data[4:100]
第二步:正确拟合SVM回归模型
用e1071包的svm函数时,要明确指定回归类型(默认是分类,所以必须改!):
library(e1071) # 拟合epsilon-SVR模型,type指定为"eps-regression" svm_model <- svm(x = train_features, y = train_target, type = "eps-regression")
第三步:构造一步预测的输入并预测
这是关键!要预测y₁₀₁,你得用最新的观测值构造和训练特征维度一致的输入:
- 如果是滞后1期的情况:
# 用第100个值作为预测输入 new_features <- ts_data[100] # 得到y₁₀₁的预测值 y_101_pred <- predict(svm_model, newdata = new_features)
- 如果是AR(3)的情况:
# 用最后3个观测值构造输入,和训练特征的列数、列名一致 new_features <- data.frame( lag1 = ts_data[98], lag2 = ts_data[99], lag3 = ts_data[100] ) y_101_pred <- predict(svm_model, newdata = new_features)
这样得到的就是单个的一步超前预测值,而不是100个结果啦!
为什么之前会返回100个结果?
大概率是你调用predict的时候没传newdata参数,或者传的是训练用的train_features——这时候模型会对每个训练样本做预测,返回的是训练目标(y₂到y₁₀₀)的拟合值,自然是一堆结果,不是你要的未来值。
内容的提问来源于stack exchange,提问作者NHB
相关产品推荐
相关产品推荐

