小批量梯度下降实现多项式回归与泛化误差分析

版权申诉
0 下载量 198 浏览量 更新于2024-10-05 收藏 401KB ZIP 举报
资源摘要信息:"Mini-batch-SGD-master.zip_MBGD小批量梯度下降_batch_多项式回归" 本资源集成了小批量梯度下降(Mini-batch Stochastic Gradient Descent,简称MBGD)算法在多项式回归中的应用,并提供了可视化欠拟合和过拟合现象,以及泛化误差的图像表示。在机器学习和深度学习中,多项式回归是一种能够处理非线性关系的回归方法,而小批量梯度下降则是优化算法的一个变种,它介于批量梯度下降和随机梯度下降之间。 1. 小批量梯度下降(MBGD) 小批量梯度下降是梯度下降算法的一种,它通过每次更新计算部分样本来计算梯度,从而减少计算量并提高效率。与传统的批量梯度下降不同,它不需要计算整个数据集的梯度,也不像随机梯度下降那样只用一个样本点计算梯度。小批量通常取数据的一个子集,大小介于1到几百之间。这种策略结合了两种方法的优点:批量梯度下降的稳定性和随机梯度下降的快速收敛。 2. 多项式回归 多项式回归是一种回归分析形式,它可以拟合给定数据集的非线性关系。通过引入自变量的高次幂,多项式回归模型能够表示出更复杂的曲线形状。在实际应用中,选择合适的多项式阶数非常重要。如果多项式的阶数太低,可能会出现欠拟合(underfitting)现象,即模型过于简单,无法捕捉数据的真实关系;相反,如果多项式的阶数过高,模型可能会过度复杂,导致过拟合(overfitting),即模型在训练数据上表现良好但在新数据上泛化能力差。 3. 泛化误差 泛化误差是指模型在未见过的数据上的表现。理想情况下,我们希望模型在训练集上和测试集上的误差都很小,即模型具有良好的泛化能力。在实践中,模型的泛化能力通常通过在独立的测试集上评估其性能来衡量。泛化误差是机器学习模型选择和评价的关键指标之一,它直接关联到模型的实用性和可靠性。 4. 欠拟合与过拟合的图像表示 在机器学习中,欠拟合和过拟合是两种常见的问题。通过图像可以直观地表示模型的拟合情况: - 欠拟合的图像会显示出模型无法捕捉到数据的基本结构和趋势,即使在训练集上,模型的表现也不理想。 - 过拟合的图像则表现出模型在训练数据上过度拟合,导致其在新的、未见过的数据上性能下降,即泛化误差增大。 在实现MBGD算法进行多项式回归时,需要通过调整小批量的大小、学习率、多项式阶数等参数,以及通过正则化技术来平衡模型的复杂度和泛化能力,以减少欠拟合和过拟合的风险。 综上所述,本资源“Mini-batch-SGD-master.zip”提供了完整的框架,使研究者和开发者能够通过实验和调整,更深入地理解小批量梯度下降算法在处理多项式回归问题时的表现,并通过图像分析模型的泛化性能,从而优化算法参数和模型结构。对于理解机器学习模型的泛化能力、掌握MBGD的调优技巧、以及多项式回归的实际应用都具有重要的意义。

这段代码中加一个test loss功能 class LSTM(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size, batch_size, device): super().__init__() self.device = device self.input_size = input_size self.hidden_size = hidden_size self.num_layers = num_layers self.output_size = output_size self.num_directions = 1 # 单向LSTM self.batch_size = batch_size self.lstm = nn.LSTM(self.input_size, self.hidden_size, self.num_layers, batch_first=True) self.linear = nn.Linear(65536, self.output_size) def forward(self, input_seq): h_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(self.device) c_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(self.device) output, _ = self.lstm(input_seq, (h_0, c_0)) pred = self.linear(output.contiguous().view(self.batch_size, -1)) return pred if __name__ == '__main__': # 加载已保存的模型参数 saved_model_path = '/content/drive/MyDrive/危急值/model/dangerous.pth' device = 'cuda:0' lstm_model = LSTM(input_size=1, hidden_size=64, num_layers=1, output_size=3, batch_size=256, device='cuda:0').to(device) state_dict = torch.load(saved_model_path) lstm_model.load_state_dict(state_dict) dataset = ECGDataset(X_train_df.to_numpy()) dataloader = DataLoader(dataset, batch_size=256, shuffle=True, num_workers=0, drop_last=True) loss_fn = nn.CrossEntropyLoss() optimizer = optim.SGD(lstm_model.parameters(), lr=1e-4) for epoch in range(200000): print(f'epoch:{epoch}') lstm_model.train() epoch_bar = tqdm(dataloader) for x, y in epoch_bar: optimizer.zero_grad() x_out = lstm_model(x.to(device).type(torch.cuda.FloatTensor)) loss = loss_fn(x_out, y.long().to(device)) loss.backward() epoch_bar.set_description(f'loss:{loss.item():.4f}') optimizer.step() if epoch % 100 == 0 or epoch == epoch - 1: torch.save(lstm_model.state_dict(), "/content/drive/MyDrive/危急值/model/dangerous.pth") print("权重成功保存一次")

2023-06-03 上传