R语言如何绘制SVM时序图并完成模型交叉验证与精度检验
模型预测精度检验
你这是回归预测任务,直接计算三个常用回归指标即可,MAE、RMSE数值越小代表误差越低,R²越接近1代表拟合效果越好:
- MAE(平均绝对误差):直观反映预测值和真实值的平均偏差
- RMSE(均方根误差):对大误差的惩罚敏感度更高
- R²(决定系数):反映模型可解释的目标变量方差占比
对应计算代码:
# 提取测试集真实最高温 test_actual <- test$MaxTemp # 计算精度指标 mae <- mean(abs(sum_pred - test_actual)) rmse <- sqrt(mean((sum_pred - test_actual)^2)) r_squared <- 1 - sum((test_actual - sum_pred)^2) / sum((test_actual - mean(test_actual))^2) # 输出结果 cat("测试集MAE: ", round(mae,4), "\n测试集RMSE: ", round(rmse,4), "\n测试集R²: ", round(r_squared,4))
如果你要得到原始温度(而非归一化后数值)的精度,记得先把预测值、真实值用你之前归一化时记录的均值、极值等参数反变换回原始尺度,再计算上述指标。
测试集预测时序图绘制
直接用R基础绘图功能即可实现,不需要额外安装依赖包,可同时展示真实值和预测值的时序走势:
# 绘制真实值曲线 plot(test$Date, test$MaxTemp, type = "l", col = "#2c3e50", lwd = 2, xlab = "观测日期", ylab = "归一化最高气温", main = "测试集最高气温真实值vs预测值时序对比") # 叠加预测值曲线 lines(test$Date, sum_pred, col = "#e74c3c", lwd = 2, lty = 2) # 添加图例 legend("topright", legend = c("真实值", "SVM预测值"), col = c("#2c3e50", "#e74c3c"), lty = c(1,2), lwd = 2)
如果需要更美观的可视化,也可以用ggplot2包实现,逻辑一致,都是以日期为x轴、温度值为y轴,分别映射真实值和预测值到不同线条即可。
模型交叉验证
注意你的场景是时序预测,不能用普通随机k折交叉验证——随机拆分行会把未来的数据放进训练集,造成数据泄露,得到虚高的精度结果,应该用按时间顺序拆分的时序交叉验证,同时还能同步调优径向核SVM的两个核心超参数(惩罚系数cost、核宽度gamma),代码如下:
library(e1071) # 设置超参数搜索网格 param_grid <- expand.grid( cost = c(0.1, 1, 5, 10, 100), gamma = c(0.001, 0.01, 0.1, 0.5, 1) ) # 做5折时序交叉验证,关闭随机拆分 set.seed(123) # 仅固定参数搜索过程,不打乱时间顺序 svm_cv <- tune.svm( MaxTemp ~ ., data = train, kernel = "radial", ranges = param_grid, tunecontrol = tune.control( sampling = "cross", cross = 5, random = FALSE # 关键:关闭随机抽样,按顺序拆分折 ) ) # 查看最优参数和对应的交叉验证误差 print("最优超参数:") print(svm_cv$best.parameters) print(paste0("交叉验证集RMSE:", round(svm_cv$best.performance,4))) # 用最优参数训练的模型重新预测测试集 final_pred <- predict(svm_cv$best.model, newdata = test)
如果需要更严格的滚动窗口时序验证(每次只用固定长度的历史窗口训练,预测紧邻的下一段数据),可以用
caret包的createTimeSlices函数生成符合时序逻辑的训练/验证索引,传入tune函数即可。
内容的提问来源于stack exchange,提问作者nullUser
相关产品推荐
相关产品推荐

