基于R语言Keras的MLP股价预测出现异常结果求助
没问题,我帮你梳理并实现这个基于R语言Keras的MLP股票价格预测模型,完全匹配你要求的2个隐藏层(各40神经元)的结构,结合你给出的滞后数据格式,下面是完整的分步实现和说明:
1. 数据准备与预处理
首先要把你的滞后特征和目标价格拆分,而且金融数据对尺度敏感,必须做标准化处理,避免模型收敛困难。
# 加载必要的库 library(keras) library(tidyverse) # 导入你的实际数据(这里用你给出的示例模拟) stock_data <- tibble( date = c("2018-04-13", "2018-04-16", "2018-04-17", "2018-04-18"), price_lag_4 = c(157.73, 161.21, 160.28, 162.21), price_lag_3 = c(161.21, 160.28, 162.21, 161.37), price_lag_2 = c(160.28, 162.21, 161.37, 162.60), price_lag_1 = c(162.21, 161.37, 162.60, 166.10), price = c(161.37, 162.60, 166.10, 166.40) ) # 拆分特征矩阵(X)和目标向量(y) X <- stock_data %>% select(starts_with("price_lag")) %>% as.matrix() y <- stock_data$price %>% as.matrix() # 标准化处理(MLP必须步骤) scaler_X <- preprocessing_standardization() %>% fit(X) X_scaled <- transform(scaler_X, X) scaler_y <- preprocessing_standardization() %>% fit(y) y_scaled <- transform(scaler_y, y) # 划分训练集和测试集(示例用8:2比例) train_size <- floor(0.8 * nrow(X_scaled)) X_train <- X_scaled[1:train_size, ] y_train <- y_scaled[1:train_size, ] X_test <- X_scaled[(train_size+1):nrow(X_scaled), ] y_test <- y_scaled[(train_size+1):nrow(X_scaled), ]
2. 构建指定结构的MLP模型
严格按照你的要求,搭建包含2个各40神经元隐藏层的模型,回归任务输出层用线性激活:
# 初始化序列模型 model <- keras_model_sequential() %>% # 输入层(4个滞后特征)+ 第一个隐藏层(40神经元,ReLU激活) layer_dense(units = 40, activation = "relu", input_shape = c(4)) %>% # 第二个隐藏层(40神经元,ReLU激活) layer_dense(units = 40, activation = "relu") %>% # 输出层(1个神经元,预测股票价格) layer_dense(units = 1) # 编译模型:Adam优化器+MSE损失(回归任务标准配置) model %>% compile( optimizer = optimizer_adam(learning_rate = 0.001), loss = "mean_squared_error", metrics = c("mean_absolute_error") ) # 查看模型结构确认是否符合要求 summary(model)
3. 训练模型
设置训练参数,同时用部分训练数据做验证,监控过拟合情况:
# 启动训练 history <- model %>% fit( x = X_train, y = y_train, epochs = 50, # 可根据验证损失调整 batch_size = 8, validation_split = 0.2, # 用20%训练数据做验证 verbose = 1 ) # 可视化训练过程(观察损失变化) plot(history)
4. 预测与结果还原
因为之前做了标准化,预测后要反变换回原始价格尺度,方便对比真实值:
# 测试集预测 y_pred_scaled <- model %>% predict(X_test) y_pred <- transform(scaler_y, y_pred_scaled, invert = TRUE) y_true <- transform(scaler_y, y_test, invert = TRUE) # 生成对比表格 comparison <- tibble( date = stock_data$date[(train_size+1):nrow(stock_data)], true_price = y_true[,1], predicted_price = y_pred[,1] ) print(comparison) # 计算评估指标 mse <- mean((y_true - y_pred)^2) mae <- mean(abs(y_true - y_pred)) cat(sprintf("测试集MSE: %.4f\n", mse)) cat(sprintf("测试集MAE: %.4f\n", mae))
额外注意事项
- 金融序列随机性极强,仅用4个滞后特征的MLP效果可能有限,你可以尝试加入成交量、RSI等技术指标提升性能
- 如果出现过拟合,可以在隐藏层后加入
layer_dropout(rate = 0.2),或者减少epochs、调整学习率 - 数据标准化是MLP训练的关键步骤,跳过会导致模型权重更新失衡,难以收敛
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

