尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

波士顿房价预测实战代码包:线性回归从跑通到调优

波士顿房价预测实战代码包:线性回归从跑通到调优 简介这份资源面向机器学习入门者与需要巩固回归建模基础的开发者围绕波士顿房价预测这一经典案例系统整理了线性回归从理论到落地的完整代码实现。压缩包共20个文件以11个Python脚本和9个CSV数据文件为主脚本覆盖数据加载、模型训练、测试评估与可视化等环节CSV则承载训练集、测试集及MSE、参数曲线等中间结果整体约228KB结构紧凑便于逐文件研读。内容涉及数据预处理、特征标准化与组合、多元线性回归拟合、MSE与R²评估、残差图绘制并延伸至岭回归、Lasso、Elastic Net等正则化模型的对比实验帮助读者理解过拟合处理与参数调优思路。目前已有346人学习适合希望借助真实数据集打通特征工程、模型构建、评估优化全流程的读者为后续更复杂的回归任务打下实践基础。1. 波士顿房价预测与线性回归代码包一份能直接跑通的实战底稿波士顿房价数据集在 1978 年就被 UCI 收录到今天依然是很多人接触机器学习线性回归的第一个真实项目。这个压缩包把「boston 预测实战」和「线性回归基础代码」打包在一起里面既有boston1目录下的数据加载与训练脚本也有regression_x1目录下围绕单特征、多特征、多项式特征、随机梯度下降等不同变体写的一整套代码还附带了mse_curve.csv、train_curve.csv、test_curve.csv这类训练过程记录文件。它解决的不是「线性回归是什么」这种概念问题而是「拿到一份能跑、能改、能对比的代码底稿」——适合刚学完理论想动手跑一遍的人也适合需要快速搭一个回归 baseline 的从业者。下面按「资源是什么 → 怎么用 → 坑在哪」的顺序拆开讲。2. 代码包结构拆解从 get_data.py 到 train_xsquare.py 的完整链路2.1 两个目录的分工逻辑压缩包解压后能看到两个顶层目录boston1和regression_x1。boston1是精简版只有get_data.py、train.py、test_data.csv、train_data.csv四个文件适合先跑通最小闭环——加载数据、训练、看结果。regression_x1是完整版文件数量多出一倍以上覆盖了从数据获取到模型评估的全流程。完整版里几个关键文件的职责可以这样理解文件作用get_data.py加载波士顿数据集做基础清洗和划分train.py标准线性回归训练入口train_xrandom.py随机梯度下降变体train_xsquare.py引入平方项的多项式特征训练train_xrepeat.py重复特征或交叉特征实验gradient_linear.py手写梯度下降实现get_paracurve_data.py生成参数曲线数据analy_mse_entropy.pyMSE 与熵的分析脚本test.py测试集评估mse_curve.csv/train_curve.csv/test_curve.csv训练过程指标记录test_paracurve_data.csv/train_paracurce_data.csv参数曲线原始数据这个结构的好处是每个变体单独一个脚本改一个参数不会影响其他实验。常见做法是把公共的数据加载逻辑抽到get_data.py其他脚本 import 它避免重复代码。2.2 数据加载与预处理的代码实现get_data.py是整个链路的第一步。波士顿数据集有 506 条样本、13 个特征目标变量是房价中位数。加载时通常用 pandas 读 CSV 或直接调 sklearn 的load_boston但后者在新版本里因为伦理问题被移除了所以包里用 CSV 是更稳妥的做法。# get_data.py 典型写法 import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler def load_boston_data(pathtrain_data.csv): df pd.read_csv(path) # 最后一列通常是目标变量 MEDV X df.iloc[:, :-1].values y df.iloc[:, -1].values return X, y def split_and_scale(X, y, test_size0.2, random_state42): X_train, X_test, y_train, y_test train_test_split( X, y, test_sizetest_size, random_staterandom_state ) scaler StandardScaler() X_train scaler.fit_transform(X_train) X_test scaler.transform(X_test) # 注意测试集用 transform 而非 fit_transform return X_train, X_test, y_train, y_test逻辑说明train_test_split的random_state固定后每次划分一致方便复现。标准化时训练集用fit_transform测试集只能用transform否则测试集的均值方差会泄露到训练过程。参数test_size0.2是常见起点数据量小可以调到 0.3 让测试集更有统计意义。2.3 训练脚本的差异与选择train.py是标准入口通常用 sklearn 的LinearRegression直接拟合。train_xrandom.py换成SGDRegressor适合数据量大或需要在线学习的场景。train_xsquare.py在原始特征基础上加平方项用来捕捉非线性关系——波士顿数据里RM房间数和房价的关系就略带弯曲加平方项后 MSE 通常会降一点。# train_xsquare.py 核心片段 from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression from sklearn.pipeline import Pipeline from sklearn.metrics import mean_squared_error def train_with_square(X_train, y_train, X_test, y_test): pipe Pipeline([ (poly, PolynomialFeatures(degree2, include_biasFalse)), (lr, LinearRegression()) ]) pipe.fit(X_train, y_train) pred pipe.predict(X_test) mse mean_squared_error(y_test, pred) print(fTest MSE: {mse:.4f}) return pipePolynomialFeatures的degree2表示生成所有二次项13 个特征会扩展到 104 个左右训练变慢但拟合能力增强。include_biasFalse是因为LinearRegression自己会处理截距重复加偏置项反而导致共线性。3. 从零跑通训练流程环境、命令与参数调优3.1 环境准备与依赖安装这份代码基于 Python 和 sklearn建议用 3.8 以上版本。依赖不多一条命令能装完pip install numpy pandas scikit-learn matplotlib如果要用analy_mse_entropy.py里的熵分析可能还需要scipy。虚拟环境用 venv 或 conda 都行关键是版本对齐——sklearn 1.2 之后load_boston被移除如果脚本里还在调它要么降版本要么改用 CSV 加载。包里已经带了train_data.csv和test_data.csv直接读文件是最省事的路径。3.2 训练与评估的完整命令假设解压到boston_lr/目录进入regression_x1后按顺序执行# 第一步确认数据文件存在 ls train_data.csv test_data.csv # 第二步跑标准线性回归 python train.py # 第三步跑多项式特征版本 python train_xsquare.py # 第四步跑随机梯度下降版本 python train_xrandom.py # 第五步生成参数曲线数据 python get_paracurve_data.py # 第六步分析 MSE 与熵 python analy_mse_entropy.py每个脚本跑完会打印 MSE 或 R²部分脚本会把中间结果写到 CSV。mse_curve.csv里通常记录的是不同迭代次数或不同参数下的 MSE 值用 pandas 读出来画图就能看到收敛过程。3.3 关键参数怎么调线性回归本身超参数少但特征工程和正则化相关的参数值得调fit_intercept默认 True数据已经中心化时可以设 False减少一个自由度。normalizesklearn 1.2 后已弃用标准化应该在预处理阶段做不要依赖这个参数。PolynomialFeatures的degree从 2 开始试3 以上容易过拟合波士顿数据 506 条撑不住太高阶。SGDRegressor的alpha正则化强度默认 0.0001MSE 震荡大就调大收敛慢就调小。SGDRegressor的learning_rate设成adaptive比固定值稳配合early_stoppingTrue能省不少调参时间。常见做法是先用LinearRegression拿一个 baseline MSE再换Ridge或Lasso看正则化有没有帮助。包里如果没带这些自己加两行 import 就能接上。4. 避坑与排查跑这份代码时最容易翻车的五个地方4.1 现象load_boston报错说函数不存在原因sklearn 1.2 版本正式移除了load_boston网上很多老教程还在用它。解决改用包里自带的train_data.csv和test_data.csv用pd.read_csv加载。如果非要在线加载可以降级到 sklearn 1.0但不推荐——CSV 方式更可控也方便替换成自己的数据。4.2 现象MSE 是 NaN 或者大得离谱原因数据里混了空值或无穷值标准化时StandardScaler遇到 NaN 会传播。解决加载后先跑df.isnull().sum()和np.isfinite(X).all()检查有缺失就填充或删除。波士顿数据集本身比较干净但自己替换数据时这个问题很常见。4.3 现象多项式特征版本训练极慢或内存爆掉原因degree2时特征数从 13 涨到 104degree3会到 560 左右矩阵求逆的复杂度是 O(n³)。解决先做特征选择用SelectKBest或相关性分析砍掉一半特征再升阶或者改用SGDRegressor配合多项式特征避免直接求逆。4.4 现象训练集 MSE 很低但测试集 MSE 很高原因过拟合。波士顿数据只有 506 条特征一多模型就容易记住噪声。解决加 L2 正则化Ridge或者减少多项式阶数或者增大test_size让评估更稳定。包里train_xrepeat.py如果是在做特征重复实验要特别注意这个问题。4.5 现象CSV 曲线文件画出来是乱的原因mse_curve.csv等文件可能没有表头或者列的顺序和想象中不一样。解决先head看一眼head -5 mse_curve.csv确认列含义后再用pd.read_csv(..., headerNone)或指定names参数。画图时 x 轴通常是迭代次数或参数值y 轴是 MSE别把两列搞反。5. 进阶技巧用参数曲线和熵分析判断模型是否值得继续调跑通基础流程后包里那两个分析脚本才是真正拉开差距的地方。get_paracurve_data.py生成的是模型参数比如正则化系数 alpha与 MSE 的对应关系analy_mse_entropy.py则从信息论角度算 MSE 的变化熵。这两个工具合起来能回答一个很实际的问题当前模型还有多少调优空间。具体做法是先跑get_paracurve_data.py拿到一组 alpha 值对应的 MSE存到test_paracurve_data.csv。然后用下面的方式读出来看趋势import pandas as pd import numpy as np df pd.read_csv(test_paracurve_data.csv, headerNone, names[alpha, mse]) # 找 MSE 最低点 best_idx df[mse].idxmin() print(fBest alpha: {df.loc[best_idx, alpha]:.6f}, MSE: {df.loc[best_idx, mse]:.4f}) # 算 MSE 曲线的斜率变化判断是否已经进入平台期 diff np.diff(df[mse].values) if np.abs(diff[-5:]).mean() 1e-4: print(MSE 已进入平台期继续调 alpha 收益不大) else: print(MSE 仍在下降可以扩大 alpha 搜索范围)逻辑说明idxmin()找最小 MSE 对应的 alpha这是最朴素的选参方式。判断平台期用的是最后 5 个差分值的平均绝对值小于 1e-4 就认为曲线走平了。这个阈值不是绝对的数据量小的时候可以放宽到 1e-3。熵分析那边analy_mse_entropy.py通常会把 MSE 序列当成一个分布来算香农熵。熵值高说明 MSE 在不同参数下波动大模型对参数敏感值得细调熵值低说明模型已经比较稳定再调也是玄学。我一般会把这个熵值和平台期判断结合起来看——两个都指向「稳定」时就停手别在调参上耗太久。还有一个容易被忽略的点train_curve.csv和test_curve.csv可以叠在一起画。如果训练 MSE 还在降但测试 MSE 开始升那就是过拟合的明确信号这时候加正则化比继续调学习率有用。包里gradient_linear.py是手写梯度下降改一改就能输出每轮迭代的 MSE配合这两个 CSV 做对比特别直观。从那以后我每次拿到一份回归代码包都强制先跑一遍get_paracurve_data.py和analy_mse_entropy.py用曲线和熵值判断值不值得深入调参而不是上来就网格搜索。希望帮到你。本文还有配套的精品资源点击获取
返回列表