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

如何仅用sklearn和matplotlib绘制线性回归模型的损失-epoch曲线?

如何绘制训练/测试集损失随epoch变化的曲线

你当前用的sklearn.linear_model.LinearRegression是基于闭式解(最小二乘法直接计算最优参数)实现的,没有迭代训练的过程,自然没有"epoch"和每轮的损失数据。要绘制损失曲线,得改用迭代式的线性回归方法(比如梯度下降),下面给两种可行方案:

方案一:用sklearn的SGDRegressor实现迭代训练并记录损失

SGDRegressor是用随机梯度下降训练的线性回归模型,可以逐轮训练并手动记录每轮的训练、测试损失。

代码实现

from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

# 初始化模型:loss设为'squared_error'对应线性回归的MSE损失,warm_start=True允许逐轮续训
sgd_model = SGDRegressor(loss='squared_error', max_iter=1, warm_start=True, random_state=101)

epochs = 100  # 总迭代次数,可按需调整
train_losses = []
test_losses = []

for epoch in range(epochs):
    # 每轮只做一次梯度更新
    sgd_model.fit(X_train, y_train)
    # 计算训练集MSE损失
    y_train_pred = sgd_model.predict(X_train)
    train_mse = mean_squared_error(y_train, y_train_pred)
    train_losses.append(train_mse)
    # 计算测试集MSE损失
    y_test_pred = sgd_model.predict(X_test)
    test_mse = mean_squared_error(y_test, y_test_pred)
    test_losses.append(test_mse)

# 绘制损失曲线
plt.figure(figsize=(10,6))
plt.plot(range(1, epochs+1), train_losses, label='训练集损失')
plt.plot(range(1, epochs+1), test_losses, label='测试集损失')
plt.xlabel('Epoch')
plt.ylabel('MSE损失')
plt.title('训练集与测试集损失随Epoch变化曲线')
plt.legend()
plt.show()

关键说明

  • max_iter=1:让每次fit只执行一轮梯度下降
  • warm_start=True:保留上一轮训练的参数,实现逐轮迭代训练
  • 你可以调整epochs数量,或者通过eta0参数修改学习率

方案二:用Keras实现线性回归并自动记录损失

Keras做线性回归其实很简单,而且会自动帮你记录每轮的训练、验证损失,不用手动计算。

代码实现

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import matplotlib.pyplot as plt

# 构建线性回归模型:输入维度等于X的特征数,输出1个神经元(回归任务无需激活函数)
model = Sequential()
model.add(Dense(1, input_shape=(X_train.shape[1],), activation=None))

# 编译模型:用随机梯度下降做优化器,MSE做损失函数
model.compile(optimizer='sgd', loss='mean_squared_error')

# 训练模型:传入测试集作为验证数据,自动记录每轮损失
history = model.fit(X_train, y_train, 
                    epochs=100, 
                    batch_size=32,  # 批次大小,可调整
                    validation_data=(X_test, y_test),
                    verbose=0)  # 关闭训练日志输出,避免刷屏

# 提取训练和验证损失数据
train_losses = history.history['loss']
test_losses = history.history['val_loss']

# 绘制曲线
plt.figure(figsize=(10,6))
plt.plot(range(1, len(train_losses)+1), train_losses, label='训练集损失')
plt.plot(range(1, len(test_losses)+1), test_losses, label='测试集损失')
plt.xlabel('Epoch')
plt.ylabel('MSE损失')
plt.title('训练集与测试集损失随Epoch变化曲线')
plt.legend()
plt.show()

关键说明

  • batch_size:每次梯度更新用到的样本数量,可根据数据集大小调整
  • history对象会自动保存每轮的训练损失(loss)和验证损失(val_loss),直接提取就能绘图

内容的提问来源于stack exchange,提问作者Scumdium

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:50:23