R代码 时间序列预测之bp神经网络 划分训练集和测试集,模型精度评估,并进行样本外预测
时间: 2024-03-21 10:42:30 浏览: 167
好的,以下是 R 代码,用于时间序列预测之 BP 神经网络,并包括训练集和测试集的划分、模型精度评估以及样本外预测。请注意,本代码中使用的数据集是 R 自带的 AirPassengers 数据集。
```R
# 导入所需库
library(neuralnet)
library(ggplot2)
# 加载 AirPassengers 数据集
data(AirPassengers)
# 将数据集按时间顺序排序
air <- AirPassengers[order(time(AirPassengers)), ]
# 划分训练集和测试集
train_size <- floor(0.8 * length(air))
train <- air[1:train_size, ]
test <- air[(train_size + 1):length(air), ]
# 将数据集转换为适合神经网络的格式
train <- data.frame(train)
test <- data.frame(test)
train <- cbind(train, lag(train$AirPassengers, 1))
test <- cbind(test, lag(test$AirPassengers, 1))
train <- train[!is.na(train[, 2]), ]
test <- test[!is.na(test[, 2]), ]
train[, 2:3] <- scale(train[, 2:3])
test[, 2:3] <- scale(test[, 2:3])
# 创建 BP 神经网络模型
nn <- neuralnet(AirPassengers ~ lag(AirPassengers, 1), data = train, hidden = 5, act.fct = "tanh")
# 对测试集进行预测
pred <- compute(nn, test[, 2])
# 将预测结果还原为原始数据的范围
pred <- pred$net.result * (max(air$AirPassengers) - min(air$AirPassengers)) + min(air$AirPassengers)
test_y <- test[, 1] * (max(air$AirPassengers) - min(air$AirPassengers)) + min(air$AirPassengers)
# 计算模型的精度
rmse <- sqrt(mean((pred - test_y)^2))
mape <- mean(abs((test_y - pred) / test_y))
# 输出精度评估结果
cat("RMSE:", rmse, "\n")
cat("MAPE:", mape, "\n")
# 进行样本外预测
future <- data.frame(lag(air$AirPassengers, 1)[length(air)], lag(air$AirPassengers, 0)[length(air)])
future <- scale(future)
future_pred <- compute(nn, future)$net.result
future_pred <- future_pred * (max(air$AirPassengers) - min(air$AirPassengers)) + min(air$AirPassengers)
# 绘制预测结果图
ggplot() +
geom_line(data = air, aes(x = time(air), y = AirPassengers), color = "blue") +
geom_line(data = data.frame(time = time(test), pred), aes(x = time, y = pred), color = "red") +
geom_line(data = data.frame(time = max(time(air)) + 1, future_pred), aes(x = time, y = future_pred), color = "green") +
labs(title = "AirPassengers Prediction", x = "Year", y = "Passengers") +
theme_bw()
```
在运行完以上代码后,你会得到 BP 神经网络的预测结果图,以及精度评估结果。请注意,在进行样本外预测时,代码中使用的是数据集中最后一个时间点的数据进行预测。如果你想要预测其他时间点的数据,只需将 `future` 数据框中的数据替换为相应时间点的数据即可。
阅读全文