LINEAR REGRESSION · COURSE 03
从历史社区数据中,预测房价规律
Boston Housing 记录了波士顿地区 506 个社区或统计区域的住房数据。每条记录包含平均房间数、人口结构、师生比例、犯罪率等特征,以及该区域自住房屋价格中位数 MEDV。
MEDV 的单位是 1,000 美元,例如 24.0 表示 24,000 美元。它不是某一套房屋的成交价格。
分析历史数据后,你认为这个社区的房价中位数是多少?
下面只公开社区条件,真实 MEDV 暂时隐藏,课程结尾再揭晓。
认识完整问题
一条记录,代表一个社区
| 社区 | 平均房间数 | 低收入人口比例 | 师生比例 | 犯罪率 | MEDV |
|---|---|---|---|---|---|
| 社区A | 6.575 | 4.98% | 15.3 | 0.00632 | 24 |
| 社区B | 6.421 | 9.14% | 17.8 | 0.02731 | 21.6 |
| 社区C | 7.185 | 4.03% | 17.8 | 0.02729 | 34.7 |
| 社区D | 6.998 | 2.94% | 18.7 | 0.03237 | 33.4 |
| 社区E | 7.147 | 5.33% | 18.7 | 0.06905 | 36.2 |
| 社区F | 6.43 | 5.21% | 18.7 | 0.02985 | 28.7 |
你刚才主要根据什么作出判断?
判断关键不是算法名称,而是你希望得到什么输出
从已知类别中选一个
例如:高价 / 中价 / 低价预测一个连续变化的数值
例如:房价为 31.2 千美元没有现成类别,自动把相似对象分组
例如:把社区分成若干相似群组根据偏好给出优先顺序
例如:优先推荐可能喜欢的房源现在请判断:预测社区房价属于哪种机器学习问题?
先用一条直线,看清整体趋势
完整房价问题包含多个特征。为了在二维图中看清原理,我们暂时只观察平均房间数;之后会回到多特征模型。
线性回归并不只能使用一个特征。这里的一条直线,是进入多特征模型前的可视化桥梁。
残差告诉我们,预测离答案还有多远
+10 和 −10 相加等于 0,能说明没有预测错误吗?
不能。正负误差会互相抵消,所以需要把误差平方后再求平均。
计算真实值与预测值的差
将每个误差平方
把平方误差相加
除以样本数量得到平均值
房间数相近,为什么房价仍会不同?
犯罪率、师生比例、低收入人口比例,以及没有进入数据的因素,都可能造成差异。单特征直线帮助理解原理,但不足以完成更真实的预测。
加入其他社区特征 ↓从一条直线,扩展到多个特征
模型为每个特征学习一个权重,再把各项结果与基础项组合成最终预测。
看不见高维空间并不影响计算:每个输入先标准化,再乘以模型学到的权重,最后与基础项相加。
调整社区特征,观察预测如何变化
当前样本的计算贡献
计算贡献表示特征如何参与当前预测,不代表它一定会在现实中直接导致房价变化。
用模型没有看过的数据检查效果
训练集
模型用来学习权重和基础项的数据。
测试集
训练时没有看过,用于检验面对新数据的表现。
用代码完成一次多特征线性回归
这段代码与课程模型使用相同的四个特征和固定随机种子。运行前需要安装 pandas 和 scikit-learn。
import pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.pipeline import make_pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import mean_squared_error, r2_scoredata = pd.read_csv("boston-housing.csv", skiprows=1)features = ["RM", "LSTAT", "PTRATIO", "CRIM"]X = data[features]y = data["MEDV"]X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42)model = make_pipeline(StandardScaler(), LinearRegression())model.fit(X_train, y_train)test_prediction = model.predict(X_test)mse = mean_squared_error(y_test, test_prediction)r2 = r2_score(y_test, test_prediction)new_area = pd.DataFrame([[6.874, 4.61, 17.6, 0.03049]], columns=features)price = model.predict(new_area)[0]print(f"预测房价中位数:{price:.2f} 千美元")print(f"测试集 MSE:{mse:.2f},R²:{r2:.3f}")逐行理解代码
导入 pandas,并用 pd 作为简称,用来读取和组织表格数据。
导入数据拆分工具,把历史社区划分为训练集和测试集。
导入流水线工具,让标准化和回归模型按固定顺序执行。
导入标准化工具,把不同单位的特征转换到可比较的数值尺度。
导入 sklearn 提供的线性回归模型。
导入均方误差 MSE 和 R² 两个模型评估指标。
读取课程下载的 CSV;第一行是数据集尺寸说明,因此跳过一行。
明确本课使用的四个输入特征,不使用存在争议的 B 字段。
从数据表中取出四列社区特征,保存为模型输入 X。
取出社区房价中位数 MEDV,保存为模型要学习的目标 y。
开始拆分特征和目标,训练数据用来学习,测试数据用来检查效果。
保留 20% 数据用于测试,并固定随机种子 42,让每次结果一致。
完成 train_test_split 函数调用。
建立流水线:先标准化四个特征,再训练多特征线性回归。
把训练集交给模型,学习四个特征的权重和基础项。
让模型预测从未参与训练的测试社区房价。
比较测试集真实值和预测值,计算整体均方误差。
计算 R²,观察模型能解释多少房价数据变化。
建立课程开场的待预测社区,字段顺序与训练数据保持一致。
使用完整流水线预测新社区,并取出第一条预测结果。
把预测值保留两位小数后输出,单位仍是千美元。
输出测试指标,用数据检查模型表现,而不是只看一个预测结果。
哪些问题适合使用线性回归?
线性回归既能预测,也能帮助理解线性关联;但关联不等于因果。
弯曲趋势无法被一条直线完整表示
数据关系明显弯曲时,线性模型会在某些区域持续产生偏差。
回到开场:我们现在有了多少依据?
MEDV 的单位为 1,000 美元,因此 31.2 表示该统计区域自住房屋价格中位数为 31,200 美元。多特征模型仍没有完全预测正确,因为历史规律、数据特征和线性假设都有边界。
用五道题,检查你的理解
当前答对 0 / 5 题,可随时重新选择。
线性回归主要用于预测什么?
斜率控制什么?
为什么计算均方误差?
多特征模型如何预测?
增加更多特征后一定更好吗?
COURSE 03 · SUMMARY
线性回归,是从数据中找到可解释的数值规律
- 主要用于预测连续数值
- 单特征模型可表现为拟合直线
- 多特征模型学习多个权重
- 训练目标是减小整体预测误差
- 单特征建立直觉,多特征解决完整问题
- 非线性、异常值、遗漏特征和外推都会影响结果
从历史数据中学习多个特征与结果之间的线性关系,再利用这种关系预测新的连续数值。