news 2026/9/26 11:28:52

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
波士顿房价预测实战代码包:线性回归从跑通到调优

简介:这份资源面向机器学习入门者与需要巩固回归建模基础的开发者,围绕波士顿房价预测这一经典案例,系统整理了线性回归从理论到落地的完整代码实现。压缩包共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(path='train_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_size=0.2, random_state=42): X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=test_size, random_state=random_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_size=0.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(degree=2, include_bias=False)), ('lr', LinearRegression()) ]) pipe.fit(X_train, y_train) pred = pipe.predict(X_test) mse = mean_squared_error(y_test, pred) print(f'Test MSE: {mse:.4f}') return pipe

PolynomialFeatures的degree=2表示生成所有二次项,13 个特征会扩展到 104 个左右,训练变慢但拟合能力增强。include_bias=False是因为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,减少一个自由度。
  • normalize:sklearn 1.2 后已弃用,标准化应该在预处理阶段做,不要依赖这个参数。
  • PolynomialFeatures的degree:从 2 开始试,3 以上容易过拟合,波士顿数据 506 条撑不住太高阶。
  • SGDRegressor的alpha:正则化强度,默认 0.0001,MSE 震荡大就调大,收敛慢就调小。
  • SGDRegressor的learning_rate:设成'adaptive'比固定值稳,配合early_stopping=True能省不少调参时间。

常见做法是先用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 现象:多项式特征版本训练极慢或内存爆掉

原因:degree=2时特征数从 13 涨到 104,degree=3会到 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(..., header=None)或指定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', header=None, names=['alpha', 'mse']) # 找 MSE 最低点 best_idx = df['mse'].idxmin() print(f'Best 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,用曲线和熵值判断值不值得深入调参,而不是上来就网格搜索。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 11:28:01

KNN红酒分类实战:从课程作业到可复现调参流程

简介&#xff1a;这份资源是面向计算机相关专业在校学生与初学者的机器学习课程作业包&#xff0c;围绕KNN算法完成红酒分类实验&#xff0c;适合作为课程设计、大作业或入门练手项目。压缩包共3个文件&#xff0c;包含1个py源码、1个data数据集和1个txt说明文件&#xff0c;整…

作者头像 李华
网站建设 2026/9/26 11:27:01

我花了3周把数据库备份从手动改成自动化的真实记录

我花了3周把数据库备份从手动改成自动化的真实记录上个月接了个制造业客户的运维改造活儿&#xff0c;他们核心业务库是MySQL 8.0&#xff0c;跑在阿里云ECS上&#xff0c;数据量大概2.5TB。最让我头疼的是&#xff0c;之前全靠DBA每天早上手动执行mysqldump&#xff0c;不仅容…

作者头像 李华
网站建设 2026/9/26 11:25:37

ASP+ACCESS网上服装销售系统毕设:环境配置、源码改造与答辩要点

简介&#xff1a;一套基于ASP与ACCESS的网上服装销售系统毕业设计资料包&#xff0c;面向计算机专业毕业生和网页开发初学者&#xff0c;解决从需求分析、数据库设计、编码实现到论文撰写与答辩全过程缺少完整参照的问题&#xff0c;适用于课程设计、毕业设计或个人自学。压缩包…

作者头像 李华
网站建设 2026/9/26 11:25:34

VS2015下FFmpeg静态库编译:x86/x64双架构完整指南

简介&#xff1a;ffmpeg n4.4.1 对应的 vs2015 静态库编译包&#xff0c;提供 x86/x64 双平台 lib 文件&#xff0c;专门面向需要在 Windows 下生成独立可执行程序、又不希望逐台部署 DLL 的音视频开发者。压缩包共 140 个文件&#xff0c;包含 125 个 C/C 头文件、14 个静态库…

作者头像 李华