如何提升我的ANN回归模型的预测精度?
ANN回归模型精度提升求助
我是机器学习与Python新手,搭建了一个ANN回归模型用于预测取值范围为1-10的数值,数据集包含799个输入特征与1个输出特征。当前预测值与实际值的误差为±2.56,以下是模型代码及数据集形状,恳请提供精度提升方案:
import torch import torch.nn as nn import torch.nn.functional as F class Model(nn.Module): def __init__(self,in_features, h1, h2, out_features): super().__init__() self.fc1 = nn.Linear(in_features, h1) self.fc2 = nn.Linear(h1, h2) self.out = nn.Linear(h2,out_features) def forward(self,x): x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.out(x) return x # Train the Model import time start_time = time.time() torch.manual_seed(32) epochs = 100 losses = [] model = Model(in_features, h1= 900, h2= 900, out_features = 1) criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr =0.0001) for i in range(epochs): optimizer.zero_grad() # Clear the gradients from the previous iteration # print(conts_total) output = model(train_model_input_normalized) # Forward pass loss = criterion(output, train_y_out_normalized) # Calculate the loss losses.append(loss.item()) loss.backward() # Backward pass optimizer.step() # Update the weights if i % 10 == 0: print(f"Epoch {i}, Loss {loss.item():.4f}") # print(f"Epoch {i}, Loss {loss.item():.4f}") # print the last line print(f"\nDuration {time.time() - start_time:.0f} seconds") # print the time elapsed # Validate the Model # To Evaluate the Entire Test Set with torch.no_grad(): output = model(test_model_input_normalized) # Forward pass test_outputs = output * ( y_out.max() - y_out.min()) + y_out.min() test_targets = test_y_out_normalized *( y_out.max() - y_out.min()) + y_out.min() # loss = criterion(output, test_y_out_normalized) # Calculate the loss loss = criterion(test_outputs,test_targets) rmse_loss = torch.sqrt(loss) print(f'RMSE:{rmse_loss:.8f}')
补充数据集形状信息
- 训练集输入形状:
torch.Size([14317, 799]) - 测试集输入形状:
torch.Size([6136, 799]) - 训练集输出形状:
torch.Size([14317, 1]) - 测试集输出形状:
torch.Size([6136, 1])
精度提升方案
1. 模型结构优化
- 精简隐藏层神经元:当前隐藏层设900个神经元,远超输入特征数799,极易过拟合。建议先尝试缩小到300-500,逐步下调至128左右,观察训练/测试误差变化。
- 调整输出层激活逻辑:输出取值范围固定1-10,当前直接线性输出可能超出合理区间。可以在输出层添加
nn.Sigmoid()后缩放至目标范围,或者用nn.Tanh()映射后调整:# 修改forward函数最后一行 x = torch.sigmoid(self.out(x)) * 9 + 1 # sigmoid输出0-1,缩放为1-10 - 添加正则化组件:在隐藏层激活后加入
nn.Dropout(p=0.2)或nn.BatchNorm1d()抑制过拟合,比如:def forward(self,x): x = F.relu(self.fc1(x)) x = nn.Dropout(p=0.2)(x) x = F.relu(self.fc2(x)) x = nn.Dropout(p=0.2)(x) x = torch.sigmoid(self.out(x)) *9 +1 return x
2. 训练流程优化
- 增加训练轮数+早停机制:当前仅训练100轮,模型大概率未收敛。建议将epochs提升至500-1000,同时加入早停:当验证集损失连续10-20轮无下降时提前终止,避免过拟合。
- 改用批量训练:当前全量喂入训练集,训练稳定性差且内存压力大。用
DataLoader分批次训练,示例如下:from torch.utils.data import TensorDataset, DataLoader train_dataset = TensorDataset(train_model_input_normalized, train_y_out_normalized) train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) # 改写训练循环 for epoch in range(epochs): model.train() total_loss = 0 for x_batch, y_batch in train_loader: optimizer.zero_grad() output = model(x_batch) loss = criterion(output, y_batch) loss.backward() optimizer.step() total_loss += loss.item() avg_loss = total_loss / len(train_loader) losses.append(avg_loss) if epoch % 10 == 0: print(f"Epoch {epoch}, Avg Loss {avg_loss:.4f}") - 调整学习率:当前lr=0.0001可尝试上调至0.001,或者用学习率调度器动态调整:
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min', patience=5) # 训练循环中每轮结束后更新学习率 scheduler.step(avg_loss)
3. 数据预处理优化
- 规范归一化逻辑:确保输入特征的归一化仅使用训练集的统计量(均值、标准差/最大最小值),避免用测试集数据导致泄露。输出反归一化时,同样要用训练集的y_max和y_min,而非全数据集的。
- 特征筛选降维:799个特征存在冗余噪声,可通过计算特征与输出的皮尔逊相关系数,剔除相关性极低的特征;或用PCA将特征压缩至200-300维度,减少无效信息干扰。
4. 损失与评估优化
- 更换损失函数:MSE对异常值敏感,若数据存在异常点,可尝试MAE(
nn.L1Loss())或Huber Loss(nn.HuberLoss()),平衡误差惩罚力度。 - 补充评估指标:除RMSE外,计算MAE、R²分数,分析误差在不同数值区间的分布,针对性优化模型。
内容的提问来源于stack exchange,提问作者sarika
相关产品推荐
相关产品推荐

