如何在sklearn的MLPClassifier中绘制训练与测试的MSE vs epoch曲线
问题排查与解决思路
一、代码中的直接错误
- 提前计算MSE导致变量未定义:你在
flc.fit()和ypred = flc.predict(x_test)之前就调用了mean_squared_error(y_test, ypred, ...),此时ypred还未赋值,会直接抛出NameError。 - 模型选择错误:
MLPClassifier是分类模型,用于预测离散类别,但你的目标变量y是连续数值(新增病例、新增死亡数),属于回归任务,应该使用MLPRegressor。用分类模型处理回归任务,不仅逻辑错误,输出结果也不符合MSE的计算场景。
二、实现训练/测试MSE随epoch变化的正确思路
要绘制MSE vs epoch曲线,需要在每个epoch结束后分别计算训练集和测试集的MSE并记录,具体步骤如下:
- 替换模型为适配回归任务的
MLPRegressor - 利用
warm_start=True参数逐epoch训练,每次训练后记录两组数据集的MSE - 使用
matplotlib绘制变化曲线
三、修正后的完整代码
# 导入所需库 import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.neural_network import MLPRegressor from sklearn.metrics import mean_squared_error from sklearn.preprocessing import StandardScaler # 特征与目标变量拆分 x = Dt[['new_tests','people_vaccinated','people_fully_vaccinated','total_boosters','new_vaccinations']] y = Dt[['new_cases','new_deaths']] # 数据标准化(神经网络对尺度敏感,建议添加) scaler = StandardScaler() x_train_scaled = scaler.fit_transform(x_train) x_test_scaled = scaler.transform(x_test) # 划分训练集和测试集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42) # 初始化回归模型,设置warm_start=True以支持逐epoch训练 model = MLPRegressor( hidden_layer_sizes=(15,10), random_state=5, verbose=False, max_iter=1, # 每次仅训练1个epoch warm_start=True, learning_rate_init=0.01, # 调小学习率,避免训练震荡 alpha=0.001 # 添加L2正则化,缓解过拟合 ) # 存储各epoch的MSE train_mse = [] test_mse = [] total_epochs = 50 # 逐epoch训练并记录指标 for _ in range(total_epochs): model.fit(x_train_scaled, y_train) # 计算训练集RMSE(squared=False对应RMSE) y_train_pred = model.predict(x_train_scaled) train_mse.append(mean_squared_error(y_train, y_train_pred, squared=False)) # 计算测试集RMSE y_test_pred = model.predict(x_test_scaled) test_mse.append(mean_squared_error(y_test, y_test_pred, squared=False)) # 绘制RMSE变化曲线 plt.figure(figsize=(10,6)) plt.plot(range(1, total_epochs+1), train_mse, label='训练集RMSE') plt.plot(range(1, total_epochs+1), test_mse, label='测试集RMSE') plt.xlabel('Epoch') plt.ylabel('RMSE') plt.title('训练集与测试集RMSE随Epoch变化') plt.legend() plt.grid(True) plt.show() # 输出最终指标 print(f"最终训练集RMSE: {train_mse[-1]:.4f}") print(f"最终测试集RMSE: {test_mse[-1]:.4f}")
四、额外优化建议
- 数据标准化:神经网络对输入特征的尺度非常敏感,标准化后能大幅提升训练稳定性和收敛速度,代码中已添加
StandardScaler的使用示例。 - 参数调优:当前学习率
0.01是更稳妥的选择,若训练仍震荡可继续调小;alpha参数可根据过拟合程度调整,值越大正则化强度越高。 - 早停机制:若观察到测试集RMSE持续上升,可添加
early_stopping=True参数,让模型自动在过拟合前停止训练。
内容的提问来源于stack exchange,提问作者aditya murti
相关产品推荐
相关产品推荐

