Kaggle房价预测实战从数据爆炸到模型保存的PyTorch调优全记录当第一次接触Kaggle房价预测比赛时我本以为按照教程步骤就能轻松完成。然而从数据加载到模型保存的每一步都遇到了教科书上不会提及的实战问题。本文将分享如何在高维特征、梯度爆炸和训练不稳定等真实场景中系统性解决问题的完整思考路径。1. 数据预处理从内存爆炸到特征工程原始数据集包含79,065条记录和19个初始特征列但经过one-hot编码后特征维度膨胀至470维。这直接导致两个问题内存不足训练集(47,439×470)加载后占用约850MB显存计算效率低下全连接层参数量呈平方级增长特征筛选策略# 优先保留数值型特征和低基数类别特征 numeric_features all_features.dtypes[all_features.dtypes float64].index low_cardinality [Type,Bedrooms] # 唯一值少于300的列 features list(numeric_features) low_cardinality实际测试发现对高基数特征(如Appliances included有11,290个唯一值)进行one-hot会显著降低模型效果。最终采用的预处理流程对数变换处理长尾分布特征large_cols [Lot, Total interior livable area] train_data[large_cols] np.log(train_data[large_cols]1)均值方差归一化all_features[numeric_features] all_features[numeric_features].apply( lambda x: (x - x.mean()) / (x.std()))仅对低基数特征进行one-hot编码注意pd.get_dummies()的dummy_na参数建议设为True能保留缺失值信息2. 模型构建网络架构与激活函数选择最初直接使用三层的MLP470-256-64-1时在验证集上RMSE始终高于基线。通过WandB记录的损失曲线发现前50个epoch损失下降停滞150-200epoch出现剧烈波动架构调优过程激活函数对比激活函数验证RMSE训练稳定性ReLU0.421一般LeakyReLU0.398较好GELU0.385最佳层宽调整# 调整后的网络结构 class MLP(nn.Module): def __init__(self, in_features): super().__init__() self.layer1 nn.Linear(in_features, 512) self.dropout nn.Dropout(0.3) self.layer2 nn.Linear(512, 128) self.out nn.Linear(128, 1) def forward(self, X): X F.gelu(self.layer1(X)) X self.dropout(X) X F.gelu(self.layer2(X)) return self.out(X)关键发现当第一层宽度从256提升到512时验证损失降低约12%配合Dropout后过拟合现象明显改善。3. 训练过程从梯度爆炸到动态学习率在初始训练时遇到了两个典型问题学习率归零Adam优化器的lr0.001时参数更新量趋近于0梯度爆炸某些batch的梯度范数超过1e5解决方案梯度裁剪torch.nn.utils.clip_grad_norm_(net.parameters(), max_norm1.0)学习率热启动scheduler torch.optim.lr_scheduler.CyclicLR( optimizer, base_lr0.0001, max_lr0.01, step_size_up200)通过WandB记录的参数变化发现当weight_decay0.05时模型更容易收敛到平坦的最小值。最佳超参组合参数最优值测试范围batch_size256[64, 512]base_lr0.0005[1e-5,0.01]weight_decay0.03[0, 0.1]4. 模型保存与早停策略传统按固定间隔保存模型的方法会存储大量冗余检查点。改进方案基于验证损失的保存if current_loss best_loss: torch.save(net.state_dict(), fbest_model.pt) best_loss current_loss动态保存间隔save_interval max(50, 500//(epoch//101)) # 随训练进度增加保存频率实际项目中在epoch350时保存的模型最终Kaggle得分最佳。通过分析发现前300epoch模型仍在学习有效特征400epoch后开始出现过拟合迹象350epoch时验证损失达到平台期提示使用WandB的模型版本控制功能可以自动关联训练曲线和模型文件5. 提交优化与后续改进首次提交得分仅排在公开榜的45%。通过以下技巧提升到前30%测试时增强(TTA)preds [] for _ in range(5): preds.append(net(test_features noise).detach()) final_pred torch.mean(torch.stack(preds), dim0)模型融合将MLP与简单的线性模型结果加权平均不同随机种子训练的模型集成后续可尝试的方向加入交叉验证缓解数据分布差异使用TabTransformer处理高基数类别特征引入外部数据如区域房价指数在真实项目中比模型结构更重要的是对数据特性的理解和问题拆解能力。这次实战让我深刻体会到优秀的基准模型往往来自对细节的持续优化而非复杂算法的堆砌。