如何仅用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
相关产品推荐
相关产品推荐

