拓冰建站拓冰建站
首页 / 资讯中心 / 正文

MXNet Gluon 实战:基于 K 折交叉验证的 Kaggle 房价预测回归任务(House Prices)

深度学习人工智能机器学习分布式训练【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址https://gitcode.com/gh_mirrors/mx/mxnet点击查看免费下载本篇指南以仓库中的 example/gluon/house_prices 示例为核心讲解如何用 MXNet Gluon 端到端地完成一个典型的 Kaggle 回归竞赛数据下载与预处理、数值/类别特征工程、多层感知机建模、基于对数均方根误差RMSLE的评估以及自定义 K 折交叉验证与提交文件生成。读完本文你将掌握一套可复用到其他表格类回归竞赛的完整 Gluon 训练管线并能结合 kaggle_k_fold_cross_validation.py 的源码细节理解每一步背后的实现原理。案例背景与示例定位本项目源自 Kaggle 经典入门竞赛 House Prices: Advanced Regression Techniques给定 79 个解释变量涵盖地块、房屋结构、装修、地下室、车库等各类属性与目标变量SalePrice售价要求预测测试集中每栋房屋的售价。该任务属于典型的高维表格数据回归问题特征是数值与类别混合、且存在大量缺失值非常适合演示 Gluon 中数据处理与训练的基本功。仓库中的示例正是以该竞赛为案例把一套通用的竞赛流水线固化在单个脚本中涵盖训练 / 测试数据的合并预处理数值特征标准化、类别特征独热编码、缺失值均值填充用gluon.nn.Sequential构建多层感知机用对数域 RMSERMSE on log scale作为评估指标手写 K 折交叉验证进行模型调参在测试集上推理并写出submission.csv提交文件。示例目录共两个文件本 README.md使用说明与 kaggle_k_fold_cross_validation.py完整实现。数据准备下载与目录约定获取数据集示例脚本以当前工作目录下的两个 CSV 文件为输入运行前需要先登录 Kaggle 并从竞赛数据页下载train.csv训练集含Id、SalePrice及全部特征列test.csv测试集含Id与全部特征列但没有SalePrice。将两个文件解压后放在与脚本相同的目录下脚本通过pd.read_csv(train.csv)/pd.read_csv(test.csv)以相对路径读取见 kaggle_k_fold_cross_validation.py。依赖环境脚本依赖以下组件均可在 MXNet 发行版中直接获得mxnetnumpy 接口导入方式为from mxnet import np脚本中还以import numpy as onp保留原始 NumPypandas负责 CSV 读取与特征工程autograd与gluonfrom mxnet import autograd, gluon用于自动微分与高层训练 API。运行方式数据就绪后在示例目录执行python kaggle_k_fold_cross_validation.py脚本会依次完成 K 折交叉验证打印每一折的验证损失与平均损失与全量训练最终在当前目录生成submission.csv可直接上传至 Kaggle 提交。特征工程合并预处理与三种典型处理脚本将train.csv与test.csv合并后再做特征工程这是竞赛中的标准做法——保证训练与测试数据经过完全相同的变换尤其是独热编码的列集合一致避免因测试集出现训练集未见的类别导致列错位train pd.read_csv(train.csv) test pd.read_csv(test.csv) all_X pd.concat((train.loc[:, MSSubClass:SaleCondition], test.loc[:, MSSubClass:SaleCondition]))随后依次施加三类处理顺序很关键1. 数值特征标准化用 pandas 的 dtype 判断区分数值列非object对每一列执行(x - mean) / stdnumeric_feas all_X.dtypes[all_X.dtypes ! object].index all_X[numeric_feas] all_X[numeric_feas].apply(lambda x: (x - x.mean()) / (x.std()))标准化让不同量纲如面积、年份、评分的特征处于同一尺度可显著加速基于梯度下降的优化器收敛。2. 类别特征独热编码含缺失占位all_X pd.get_dummies(all_X, dummy_naTrue)get_dummies将每个类别列展开为若干 0/1 列dummy_naTrue会额外为缺失值本身生成一个独立的哑变量列把缺失作为一种有意义的取值信息保留下来而不是直接丢弃。3. 缺失值均值填充all_X all_X.fillna(all_X.mean())对剩余仍为 NaN 的数值位置用该特征的均值近似填充。fillna(mean)是一种简单稳健的插补策略保留样本数量且不引入过多偏差。4. 切分回训练 / 测试并转为 NDArraynum_train train.shape[0] X_train all_X[:num_train].as_matrix() X_test all_X[num_train:].as_matrix() y_train train.SalePrice.as_matrix() X_train np.array(X_train) y_train np.array(y_train) X_test np.array(X_test)合并后的 DataFrame 按原训练行数num_train切回两部分并转为mxnet.np的 NDArray 以便喂给 Gluon。注意脚本中y_train.reshape((num_train, 1))的返回值并未重新赋值标签实际仍是一维向量这并不影响示例运行但若你在此基础上扩展应显式做y_train y_train.reshape((num_train, 1))以保持维度显式一致。模型构建与评估指标网络结构两层 MLPget_net()使用gluon.nn.Sequential堆叠两个全连接层kaggle_k_fold_cross_validation.pydef get_net(): net gluon.nn.Sequential() net.add(gluon.nn.Dense(50, activationrelu)) net.add(gluon.nn.Dense(1)) net.initialize() return netgluon.nn.Dense是标准的全连接层实现见 python/mxnet/gluon/nn/basic_layers.py第一层 50 个神经元并带 ReLU 激活输出层 1 个神经元回归的标量输出代码注释明确提示调整网络结构如加深、加宽可以获得更好的成绩该结构只是一个便于演示的基线。损失函数Gluon L2Losssquare_loss gluon.loss.L2Loss()在 python/mxnet/gluon/loss.py 中L2Loss的定义为L (1/2) * Σ|label - pred|²即均方误差MSE并带有1/2系数沿 batch 轴取平均。weight参数默认为 1.0 参与整体缩放。评估指标对数域 RMSERMSLEKaggle 该竞赛的官方指标是售价对数的均方根误差对预测价格取对数可压低高价房屋的绝对误差权重。脚本实现如下kaggle_k_fold_cross_validation.pydef get_rmse_log(net, X_train, y_train): num_train X_train.shape[0] clipped_preds np.clip(net(X_train), 1, float(inf)) return np.sqrt(2 * np.sum(square_loss( np.log(clipped_preds), np.log(y_train))).item() / num_train)要点拆解np.clip(..., 1, inf)将预测下限截断到 1避免log(0)或对负预测取对数产生 NaN由于L2Loss自带1/2系数2 * square_loss恰好还原为平方误差再求和取平均并开方即得 RMSE评估时同样将标签y_train取对数与 Kaggle 评分规则一致。训练循环autograd DataLoader Trainertrain()函数完整演示了 Gluon 命令式训练的标准四步kaggle_k_fold_cross_validation.pydataset_train gluon.data.ArrayDataset(X_train, y_train) data_iter_train gluon.data.DataLoader(dataset_train, batch_size, shuffleTrue) trainer gluon.Trainer(net.collect_params(), adam, {learning_rate: learning_rate, wd: weight_decay}) net.initialize(force_reinitTrue) for epoch in range(epochs): for data, label in data_iter_train: with autograd.record(): output net(data) loss square_loss(output, label) loss.backward() trainer.step(batch_size) avg_loss get_rmse_log(net, X_train, y_train) if epoch verbose_epoch: print(fEpoch {epoch}, train loss: {avg_loss}) return avg_lossgluon.data.ArrayDataset把特征与标签打包成数据集gluon.data.DataLoader负责按batch_size分小批量并支持shuffleTrue打乱二者实现分别见 python/mxnet/gluon/data/_internal.py 与 python/mxnet/gluon/data/dataloader.pywith autograd.record():记录前向计算图随后loss.backward()自动求导gluon.Trainer(net.collect_params(), adam, {learning_rate: ..., wd: ...})选用Adam 优化器并传入学习率与权重衰减weight decay超参数trainer.step(batch_size)完成一次参数更新Trainer 定义见 python/mxnet/gluon/trainer.pynet.initialize(force_reinitTrue)保证每轮尤其是 K 折中每个子模型都从全新参数开始训练避免参数残留污染verbose_epoch 95使得前 95 个 epoch 静默训练、仅在最后阶段打印损失便于观察收敛趋势。K 折交叉验证手写实现与超参数实现逻辑k_fold_cross_valid()kaggle_k_fold_cross_validation.py手写实现了 K 折交叉验证assert k 1 fold_size X_train.shape[0] // k for test_idx in range(k): X_val_test X_train[test_idx * fold_size: (test_idx 1) * fold_size, :] ... for i in range(k): if i ! test_idx: # 其余 k-1 折拼接为训练集 ... net get_net() train_loss train(net, X_val_train, y_val_train, epochs, verbose_epoch, ...) test_loss get_rmse_log(net, X_val_test, y_val_test)核心思想将训练数据按fold_size 样本数 // k均匀切分为 K 份每次取其中 1 份作为验证集X_val_test其余 K-1 份用np.concatenate沿 axis 0 拼接为训练集每个折独立get_net()并完整训练一遍用get_rmse_log在该折验证集上评估最终返回 K 个折的平均训练损失与平均验证损失作为超参数好坏的稳定估计。脚本末尾的默认参数组合为k 5 epochs 100 verbose_epoch 95 learning_rate 0.3 weight_decay 100 batch_size 100 train_loss, test_loss k_fold_cross_valid(k, epochs, verbose_epoch, X_train, y_train, learning_rate, weight_decay, batch_size) print(f{k}-fold validation: Avg train loss: {train_loss}, Avg test loss: {test_loss})需要注意这里weight_decay 100相对较大配合learning_rate 0.3是该示例针对此数据集的经验配置代码注释明确说明这些参数可以借助 K 折交叉验证进一步微调修改网络结构也能取得更好结果。在你自己的复现中建议把 K 折平均验证损失作为反馈信号对学习率、权重衰减、层宽与层数做网格搜索。生成提交文件全量重训 推理输出K 折验证选出满意的超参数后learn()函数用全部训练数据重新训练最终模型并在测试集上推理、写出提交文件kaggle_k_fold_cross_validation.pydef learn(epochs, verbose_epoch, X_train, y_train, test, learning_rate, weight_decay, batch_size): net get_net() _ train(net, X_train, y_train, epochs, verbose_epoch, learning_rate, weight_decay, batch_size) preds net(X_test).asnumpy() test[SalePrice] pd.Series(preds.reshape(1, -1)[0]) submission pd.concat([test[Id], test[SalePrice]], axis1) submission.to_csv(submission.csv, indexFalse)用全量X_train/y_train重新训练最大化可利用的样本net(X_test)对测试集前向推理asnumpy()转回 NumPy 数组将预测写入测试 DataFrame 的SalePrice列与Id拼接成两列后导出为submission.csvindexFalse不写行号格式与 Kaggle 要求的提交模板一致。小结与进一步探索这个示例麻雀虽小五脏俱全集中体现了 Gluon 处理回归任务的全部关键环节特征工程合并训练/测试集后统一做标准化、独热编码含缺失占位与均值填充杜绝训练-测试特征错位建模Sequential Dense极简 MLP回归输出层为单神经元训练autograd.record()DataLoader AdamTrainer的标准命令式训练闭环并以对数域 RMSE 与竞赛评分对齐验证手写 K 折交叉验证对超参数做稳健评估提交全量重训后推理并导出submission.csv。如果想继续深入可以从以下方向入手均可在当前仓库中找到对应实现更换更优的网络结构加深 / 加宽 MLP或换用gluon.loss中的其他损失源码见 python/mxnet/gluon/loss.py使用更多 Gluon 数据工具参考 python/mxnet/gluon/data/dataloader.py 中DataLoader的多进程采样、num_workers等参数加速训练对照仓库中其他 Gluon 示例如 example/gluon/mnist、example/gluon/image_classification.py了解分类任务的同类管线写法。按照本指南的操作步骤下载数据、放入示例目录并执行python kaggle_k_fold_cross_validation.py即可从零跑通整套 Kaggle 回归流程并得到可提交的结果。赞分享深度学习人工智能机器学习分布式训练【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址https://gitcode.com/gh_mirrors/mx/mxnet点击查看免费下载相关推荐突破Kaggle房价预测瓶颈GluonK折交叉验证实战指南突破Kaggle房价预测瓶颈GluonK折交叉验证实战指南 在数据科学竞赛中房价预测是一个经典的回归问题而Kaggle平台上的房价预测竞赛更是检验机器学基于Gluon的Kaggle房价预测实战教程基于Gluon的Kaggle房价预测实战教程 本文将通过一个完整的Kaggle房价预测案例展示如何使用深度学习框架Gluon进行数据预处理、模型构建和训练。我人工智能深度学习机器学习教程基于d2l-ai项目的Kaggle房价预测实战指南基于d2l ai项目的Kaggle房价预测实战指南 还在为房价预测竞赛头疼吗面对混杂的数据类型、缺失值和复杂的特征工程很多机器学习爱好者望而却步。本文将带你文档教程人工智能深度学习NLP计算机视觉强化学习上一篇Alita社区精选资源10个你不能错过的优质插件下一篇如何从 RealSense 相机拿到第一帧深度数据librealsense SDK 全流程实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门