如何提取MLPRegressor训练与验证损失并绘制曲线?损失单位是什么?
解决MLPRegressor训练与验证损失曲线绘制问题
1. 提取训练损失
sklearn的MLPRegressor在训练完成后,自带loss_curve_属性,可直接获取每个训练epoch的训练损失值:
# 训练完成后提取训练损失 train_loss = mlp.loss_curve_
该数组中的每个元素对应一个epoch的训练损失(默认采用均方误差MSE)。
2. 获取每个epoch的验证损失
默认fit()方法不会自动记录验证损失,需手动实现逐epoch训练并计算验证损失:
import numpy as np from sklearn.metrics import mean_squared_error # 初始化存储损失的列表 train_loss_history = [] val_loss_history = [] # 逐epoch训练并记录损失 for epoch in range(mlp.max_iter): # 训练单个epoch mlp.partial_fit(x_train, y_train) # 计算当前epoch的训练损失 train_pred = mlp.predict(x_train) train_loss = mean_squared_error(y_train, train_pred) train_loss_history.append(train_loss) # 计算当前epoch的验证损失 val_pred = mlp.predict(x_test) val_loss = mean_squared_error(y_test, val_pred) val_loss_history.append(val_loss) # 匹配fit()的收敛逻辑,提前终止训练 if epoch > 0 and abs(train_loss_history[-1] - train_loss_history[-2]) < mlp.tol: break
这里复用了你初始定义的mlp模型参数,通过partial_fit()逐epoch训练,同时加入收敛阈值判断,和原生fit()的训练逻辑保持一致。
3. 绘制损失曲线
使用matplotlib绘制训练与验证损失的对比曲线:
import matplotlib.pyplot as plt plt.figure(figsize=(10,6)) plt.plot(train_loss_history, label='训练损失') plt.plot(val_loss_history, label='验证损失') plt.xlabel('Epoch') plt.ylabel('损失值') plt.title('训练与验证损失曲线') plt.legend() plt.show()
4. 损失的单位说明
MLPRegressor默认使用的损失函数是均方误差(MSE),计算公式为:
$$MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2$$
它的单位是目标变量y的单位的平方。例如若你的y代表“温度(摄氏度)”,则损失单位为“摄氏度²”。
内容的提问来源于stack exchange,提问作者Dila
相关产品推荐
相关产品推荐

