【附Python源码】基于MLP的波士顿房价预测
【附Python源码】基于MLP的波士顿房价预测
房价预测作为机器学习领域的经典入门问题,其价值不仅在于算法本身,更在于完整建模流程的掌握。
本项目将基于Boston Housing数据集,详细介绍如何使用PyTorch构建一个多层神经网络回归模型,涵盖数据预处理、特征工程、模型设计、训练优化及可视化分析等关键环节。
数据集概述
Boston Housing数据集包含506条波士顿郊区的房屋记录,每条记录有13个特征属性和1个目标变量(房价中位数)。这些特征涵盖了影响房价的各类因素:
- 地理位置类:纬度(LAT)、经度(LON)、到就业中心距离(DIS)
- 房屋属性类:房间数(RM)、房龄(AGE)、住宅用地比例(ZN)
- 社会环境类:”饭最率“(CRIM)、师生比例(PTRATIO)、低收入人群比例(LSTAT)
- 基础设施类:公路可达性(RAD)、财产税率(TAX)、一氧化氮浓度(NOX)
目标变量MEDV表示该区域自住房屋的中位数价值,单位为千美元。该数据集的特点在于特征维度适中、样本量较小,适合作为回归问题的基准测试。
数据预处理流程
缺失值处理
原始数据中存在部分缺失值,主要集中在几个特征列。考虑到房价数据的分布特性,采用中位数填充策略:
df=df.fillna(df.median(numeric_only=True))中位数填充的优势在于对异常值不敏感,能够保持数据的整体分布特征,避免均值填充可能带来的偏差。
特征标准化
神经网络对输入特征的尺度较为敏感,因此需要进行标准化处理。采用StandardScaler对特征进行Z-score标准化:
scaler=StandardScaler()X_train=scaler.fit_transform(X_train)X_test=scaler.transform(X_test)标准化的核心思想是将特征转换为均值为0、标准差为1的分布,这有助于加速梯度下降的收敛过程,同时避免某些大尺度特征主导模型训练。
数据加载器构建
PyTorch的DataLoader提供了高效的数据迭代机制。设置batch_size为256,在训练时启用shuffle以打乱数据顺序,测试时则保持顺序一致:
train_loader=DataLoader(train_dataset,batch_size=256,shuffle=True)test_loader=DataLoader(test_dataset,batch_size=256,shuffle=False)探索性数据分析
在模型训练之前,对数据进行可视化分析有助于理解特征分布及相互关系。
特征分布直方图
通过绘制各特征的分布直方图,可以直观了解数据的偏态、峰度及异常值情况。例如,犯罪率(CRIM)呈现明显的左偏分布,大部分区域的犯罪率较低,少数区域 crime rate 较高;而房间数(RM)则近似正态分布,集中在6-7个房间。
相关性热力图
计算特征间的Pearson相关系数并绘制热力图,可识别与目标变量强相关的特征。
模型架构设计
网络结构设计
针对该回归问题,设计了一个四层全连接网络:
输入层(13) → 隐藏层1(128) → 隐藏层2(64) → 隐藏层3(32) → 输出层(1)网络深度和宽度的选择基于以下考量:
- 输入维度为13,第一层扩展至128维以提取丰富的特征表示
- 后续层逐级降维,形成特征金字塔结构
- 最终输出层为单节点,直接输出预测值
正则化策略
为防止过拟合,在网络中引入了两类正则化技术:
Batch Normalization:在每个隐藏层后添加批归一化,通过对每层输入进行标准化,缓解内部协变量偏移问题,加速收敛并允许使用更大的学习率。
Dropout:以0.2的概率随机丢弃神经元,强制网络学习冗余表示,增强泛化能力。
激活函数选择
隐藏层采用ReLU激活函数,其优势在于:
- 计算简单,梯度不会饱和
- 引入非线性,增强模型表达能力
- 稀疏激活特性,降低计算开销
输出层不使用激活函数,直接输出实数值,符合回归任务的需求。
训练策略与优化
损失函数
选用均方误差(MSE)作为损失函数:
criterion=nn.MSELoss()MSE对大误差赋予更高惩罚,适合房价预测这类需要控制预测偏差的场景。
优化器配置
采用Adam优化器,结合其自适应学习率特性:
optimizer=optim.Adam(model.parameters(),lr=0.001,weight_decay=1e-5)weight_decay参数引入L2正则化,进一步抑制过拟合。
学习率调度
引入ReduceLROnPlateau调度器,当验证损失连续10个epoch未下降时,学习率减半:
scheduler=optim.lr_scheduler.ReduceLROnPlateau(optimizer,mode='min',factor=0.5,patience=10)这种自适应调整策略有助于模型在训练后期精细优化。
早停机制
设置早停耐心值为30,若验证损失连续30个epoch未改善,则终止训练并恢复最佳模型权重:
ifavg_val_loss<best_loss:best_loss=avg_val_loss patience_counter=0torch.save(model.state_dict(),MODEL_SAVE_PATH)早停机制有效防止过拟合,同时节省计算资源。
模型评估与可视化
评估指标
采用以下指标全面评估模型性能:
- MSE(均方误差):反映预测值与真实值的平均平方偏差
- RMSE(均方根误差):与目标变量同量纲,便于解释
- MAE(平均绝对误差):对异常值更鲁棒
- R²分数:衡量模型解释数据变异的能力,越接近1表示拟合越好
预测结果可视化
真实值vs预测值散点图:理想情况下,点应分布在对角线附近。图中添加R²分数标注,直观展示模型拟合程度。
残差分析图:包含残差分布直方图和残差vs预测值散点图。若模型假设成立,残差应近似服从均值为0的正态分布,且与预测值无明显相关性。
关键技术点总结
数据预处理的重要性:缺失值填充和特征标准化是神经网络训练的基础,直接影响模型收敛速度和最终性能。
网络设计的平衡:过浅的网络难以捕捉复杂模式,过深则容易过拟合。本项目的四层结构在表达能力和泛化性能间取得平衡。
正则化的必要性:BatchNorm和Dropout的组合使用显著提升了模型在测试集上的表现,是防止过拟合的有效手段。
训练策略的精细化:学习率调度和早停机制的加入,使训练过程更加智能,避免了人工调参的主观性。
可视化的价值:通过多种图表分析数据和模型行为,能够快速定位问题并指导优化方向。
当前模型可作为基线,进一步改进的方向包括:
- 特征工程:引入特征交叉(如RM×LSTAT)、多项式特征,捕捉非线性关系
- 集成学习:训练多个模型并取平均,降低预测方差
- 超参数优化:采用网格搜索或贝叶斯优化寻找最优超参数组合
- 更复杂的网络结构:尝试残差连接(ResNet)或注意力机制
⚠️完整代码已开源,欢迎交流探讨。
