You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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并记录,具体步骤如下:

  1. 替换模型为适配回归任务的MLPRegressor
  2. 利用warm_start=True参数逐epoch训练,每次训练后记录两组数据集的MSE
  3. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 18:31:46