从沐神的‘动手学深度学习’到Kaggle提交:一个数据科学新人的完整复盘与避坑指南
·
从零到Kaggle:深度学习新手的房价预测实战全记录
1. 启程:当理论遇见实战
第一次打开《动手学深度学习》课程时,我被李沐老师优雅的代码演示所震撼——那些看似复杂的神经网络,在他手中往往只需十几行代码就能完成核心功能。但当真正尝试将课程知识应用到Kaggle房价预测比赛时,我才意识到从理论到实践的鸿沟有多深。
这个项目教会我的第一课是: 优秀的教程代码和实际工程之间存在巨大差异 。课程中的代码为了教学清晰往往做了极致简化,而真实数据却充满各种"脏"特征和边缘情况。记得第一次运行自己编写的MLP模型时,遇到的不是预期的训练曲线,而是一连串的维度错误和梯度爆炸警告。
新手常见误区:直接复制教学代码到实际项目,忽略数据规模、特征维度和计算资源的差异
2. 环境配置:那些教程不会告诉你的细节
2.1 工具链选择
经过多次尝试后,我确定了最适合新手的工具组合:
- 开发环境 :Google Colab Pro(免配置GPU资源)
- 版本控制 :GitHub + DVC(管理数据和模型版本)
- 实验跟踪 :Weights & Biases(可视化训练过程)
# 检查GPU可用性
import torch
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"GPU型号: {torch.cuda.get_device_name(0)}")
2.2 依赖管理陷阱
课程示例很少强调依赖版本问题,但实际中这却是新手最容易踩的坑。例如:
- Pandas 2.0+对空值处理逻辑的变化
- PyTorch特定版本与CUDA驱动兼容性
- scikit-learn与category_encoders的API冲突
解决方案 :
# 推荐使用conda创建独立环境
conda create -n kaggle_housing python=3.9
conda install pytorch=1.13.1 torchvision -c pytorch
pip install wandb category_encoders==2.6.0
3. 数据战场:从原始CSV到特征矩阵
3.1 数据清洗实战
原始数据包含79,065条记录和超过80个特征,但大部分需要预处理:
| 特征类型 | 处理方式 | 注意事项 |
|---|---|---|
| 高基数类别特征 | 目标编码 | 避免维度爆炸 |
| 数值型离群值 | 对数变换 | 保留零值处理 |
| 时空特征 | 周期性编码 | 考虑地理聚类 |
# 典型数值特征标准化流程
numeric_cols = train_data.select_dtypes(include=['float64']).columns
train_data[numeric_cols] = train_data[numeric_cols].apply(
lambda x: (x - x.mean()) / x.std()
)
3.2 特征工程艺术
经过多次迭代,最终保留的特征包括:
-
核心数值特征
:
- 房屋面积对数
- 税务评估值
- 上次交易价格
-
关键类别特征
:
- 房屋类型(Type)
- 卧室数量(Bedrooms)
- 学区等级(School District)
特征选择黄金法则:先用简单模型验证特征重要性,再逐步增加复杂度
4. 模型构建:从Baseline到改进
4.1 基础MLP架构
初始网络结构包含三个全连接层:
class HousingMLP(nn.Module):
def __init__(self, input_dim):
super().__init__()
self.layers = nn.Sequential(
nn.Linear(input_dim, 256),
nn.ReLU(),
nn.Linear(256, 64),
nn.ReLU(),
nn.Linear(64, 1)
)
def forward(self, x):
return self.layers(x)
4.2 训练技巧突破
通过实验发现的几个关键改进点:
- 学习率调度 :采用余弦退火策略
- 损失函数 :MSELoss + 对数变换
- 正则化 :Dropout层 + L2惩罚
# 改进后的训练循环
optimizer = torch.optim.AdamW(
model.parameters(),
lr=0.001,
weight_decay=0.01
)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
optimizer,
T_max=100
)
5. 提交与反思:超越代码的收获
最终提交的模型在Kaggle上获得了0.162的RMSE分数,虽然不及顶级方案,但对新手而言已是巨大进步。这个过程中最宝贵的不是最终排名,而是学会的工程化思维:
- 版本控制 :每个实验都有完整记录
- 模块化开发 :数据、模型、训练逻辑分离
- 可视化监控 :实时跟踪关键指标
在最后一次提交后,我重新审视了沐神的原始代码,才真正理解那些简洁实现背后的设计哲学——不是追求代码量最少,而是展现算法本质。这或许就是初学者与专家的根本区别:我们关注如何让代码运行,他们思考如何让思想表达。
更多推荐
所有评论(0)