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

如何提升我的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:37:06