神经网络交叉验证首尾折MSE过高问题求助
小样本神经网络通胀预测的精度优化需求
我首次用Python搭建神经网络,基于通胀、平均薪资、失业率及失业人数的历史数据预测通胀走势。采用5折KFold交叉验证时,发现第1折和第5折的MSE值异常偏高,其余折的模型表现良好。
终端输出结果如下:
折1 1/1 [==============================] - 0s 197ms/step - loss: 306.7101 - accuracy: 0.0000e+00 错误:Mean Squared Error = 306.7101135253906,神经网络模型拟合效果不佳,预测结果明显错误,需重新运行模型因训练未准确执行。 折2 1/1 [==============================] - 0s 16ms/step - loss: 2.6362 - accuracy: 0.0000e+00 成功:Mean Squared Error = 2.636242389678955,神经网络模型拟合效果良好。 折3 1/1 [==============================] - 0s 15ms/step - loss: 1.9960 - accuracy: 0.0000e+00 成功:Mean Squared Error = 1.9960471391677856,神经网络模型拟合效果良好。 折4 1/1 [==============================] - 0s 15ms/step - loss: 13.9704 - accuracy: 0.1667 成功:Mean Squared Error = 13.970401763916016,神经网络模型拟合效果良好。 折5 1/1 [==============================] - 0s 16ms/step - loss: 130.8911 - accuracy: 0.0000e+00 错误:Mean Squared Error = 130.89105224609375,神经网络模型拟合效果不佳,预测结果明显错误,需重新运行模型因训练未准确执行。
我尝试过调整batch_size、epochs、网络层数、神经元数量、激活函数、学习率及折数,不仅没能解决部分折MSE偏高的问题,反而导致所有折的MSE整体上升。目前数据集仅有54组,无法扩充;此前按70/15/15划分训练/验证/测试集时,模型MSE约为20。现寻求无需扩充数据的模型精度提升方案。
相关代码片段如下:
# 定义交叉验证的折数 n_folds = 5 # 使用KFold划分训练集和测试集 kf = KFold(n_splits=n_folds) fold = 1 # 定义模型 model = Sequential() model.add(Dense(128, activation='relu', kernel_regularizer=regularizers.l2(0.01))) model.add(Dense(64, activation='relu', kernel_regularizer=regularizers.l2(0.01))) model.add(Dense(32, activation='relu', kernel_regularizer=regularizers.l2(0.01))) model.add(Dropout(0.2)) model.add(Dense(16, activation='relu', kernel_regularizer=regularizers.l2(0.01))) model.add(Dense(8, activation='relu', kernel_regularizer=regularizers.l2(0.01))) model.add(Dense(4, activation='relu', kernel_regularizer=regularizers.l2(0.01))) model.add(Dense(1, activation='linear')) # 使用较低学习率编译模型 adam = Adam(learning_rate=0.001) model.compile(loss='mean_squared_error', optimizer=adam, metrics=['accuracy']) for train_indices, test_indices in kf.split(inputs): print(f"Fold {fold}") fold += 1 # 划分训练集和测试集 train_inputs = inputs[train_indices] train_targets = targets[train_indices] test_inputs = inputs[test_indices] test_targets = targets[test_indices] # 在训练集上训练模型 history = model.fit( train_inputs, train_targets, epochs=400, batch_size=40, verbose=0 ) # 在测试集上评估模型 test_loss = model.evaluate(test_inputs, test_targets)
内容的提问来源于stack exchange,提问作者DeeKay
相关产品推荐
相关产品推荐

