胡慧华
菜单
首页人工智能机器学习深度学习智能体项目实践关于我
← 返回机器学习课程

LINEAR REGRESSION · COURSE 03

从历史社区数据中,预测房价规律

问题背景

Boston Housing 记录了波士顿地区 506 个社区或统计区域的住房数据。每条记录包含平均房间数、人口结构、师生比例、犯罪率等特征,以及该区域自住房屋价格中位数 MEDV。

MEDV 的单位是 1,000 美元,例如 24.0 表示 24,000 美元。它不是某一套房屋的成交价格。

01 了解历史数据02 下载并观察03 预测新社区
下载完整历史数据 · 506 条 CSV ↓
预测挑战 · 真实测试样本

分析历史数据后,你认为这个社区的房价中位数是多少?

下面只公开社区条件,真实 MEDV 暂时隐藏,课程结尾再揭晓。

平均房间数6.874
相对低收入人口比例4.61%
师生比例17.60
犯罪率0.03049
01

认识完整问题

一条记录,代表一个社区

预测目标是该区域自住房屋价格中位数,而不是某一套具体房屋的成交价。
Boston Housing 是经典历史教学数据集,共 506 条记录、13 个原始特征。数据年代较早,部分变量存在争议;本课不使用 B 字段,只用于算法教学,不作为现实房价评估依据。
社区平均房间数低收入人口比例师生比例犯罪率MEDV
社区A6.5754.98%15.30.0063224
社区B6.4219.14%17.80.0273121.6
社区C7.1854.03%17.80.0272934.7
社区D6.9982.94%18.70.0323733.4
社区E7.1475.33%18.70.0690536.2
社区F6.435.21%18.70.0298528.7
下载完整数据集 · CSV

你刚才主要根据什么作出判断?

答题前,先认识四种问题

判断关键不是算法名称,而是你希望得到什么输出

分类

从已知类别中选一个

例如:高价 / 中价 / 低价
回归

预测一个连续变化的数值

例如:房价为 31.2 千美元
聚类

没有现成类别,自动把相似对象分组

例如:把社区分成若干相似群组
推荐

根据偏好给出优先顺序

例如:优先推荐可能喜欢的房源

现在请判断:预测社区房价属于哪种机器学习问题?

03 · 单特征直觉

先用一条直线,看清整体趋势

完整房价问题包含多个特征。为了在二维图中看清原理,我们暂时只观察平均房间数;之后会回到多特征模型。

平均房间数增加时,房价整体呈现什么趋势?
平均房间数 RMMEDV(千美元)
● 历史社区━ 拟合直线│ 残差◉ 待预测社区
当前公式房价 = 8.90 × 房间数 33.2教学样本 MSE · 13.81
单特征模型用于理解原理

线性回归并不只能使用一个特征。这里的一条直线,是进入多特征模型前的可视化桥梁。

04 · 理解误差

残差告诉我们,预测离答案还有多远

真实房价24.0
模型预测25.3
=
残差-1.3

+10 和 −10 相加等于 0,能说明没有预测错误吗?

不能。正负误差会互相抵消,所以需要把误差平方后再求平均。

01

计算真实值与预测值的差

02

将每个误差平方

03

把平方误差相加

04

除以样本数量得到平均值

MSE = 1 / n × Σ (真实值 − 预测值)² 越小,表示整体预测通常越接近真实数据。
05 · 主动发现不足

房间数相近,为什么房价仍会不同?

社区 ARM 6.575MEDV 24.0
社区 FRM 6.430MEDV 28.7
以上都有可能

犯罪率、师生比例、低收入人口比例,以及没有进入数据的因素,都可能造成差异。单特征直线帮助理解原理,但不足以完成更真实的预测。

加入其他社区特征 ↓
06 · 完整模型

从一条直线,扩展到多个特征

模型为每个特征学习一个权重,再把各项结果与基础项组合成最终预测。

预测房价= w₁ × 平均房间数 + w₂ × 低收入人口比例 + w₃ × 师生比例 + w₄ × 犯罪率 + b
1 个特征二维图中的直线
2 个特征三维空间中的平面
更多特征更高维的线性关系

看不见高维空间并不影响计算:每个输入先标准化,再乘以模型学到的权重,最后与基础项相加。

07 · INTERACTIVE LAB

调整社区特征,观察预测如何变化

当前样本的计算贡献

基础项+22.62
平均房间数+2.54
相对低收入人口比例+4.43
师生比例+0.93
犯罪率+0.27
最终预测30.78 千美元减少 0.00(相对完整模型的开场预测)

计算贡献表示特征如何参与当前预测,不代表它一定会在现实中直接导致房价变化。

08 · 模型评估

用模型没有看过的数据检查效果

404 条

训练集

模型用来学习权重和基础项的数据。

固定种子 42
102 条

测试集

训练时没有看过,用于检验面对新数据的表现。

当前特征数4
测试集 MSE20.19越小通常越好
测试集 R²0.698越接近 1 通常越好
测试样本预测30.78
如果用全部数据训练,又用相同数据评价,就像学生提前看过考试答案,结果可能过于乐观。增加特征也不保证一定更好,必须查看测试结果。
09 · PYTHON / SCIKIT-LEARN

用代码完成一次多特征线性回归

这段代码与课程模型使用相同的四个特征和固定随机种子。运行前需要安装 pandas 和 scikit-learn。

linear_regression.py完整可运行示例
01import pandas as pd
02from sklearn.model_selection import train_test_split
03from sklearn.pipeline import make_pipeline
04from sklearn.preprocessing import StandardScaler
05from sklearn.linear_model import LinearRegression
06from sklearn.metrics import mean_squared_error, r2_score
07data = pd.read_csv("boston-housing.csv", skiprows=1)
08features = ["RM", "LSTAT", "PTRATIO", "CRIM"]
09X = data[features]
10y = data["MEDV"]
11X_train, X_test, y_train, y_test = train_test_split(
12 X, y, test_size=0.2, random_state=42
13)
14model = make_pipeline(StandardScaler(), LinearRegression())
15model.fit(X_train, y_train)
16test_prediction = model.predict(X_test)
17mse = mean_squared_error(y_test, test_prediction)
18r2 = r2_score(y_test, test_prediction)
19new_area = pd.DataFrame([[6.874, 4.61, 17.6, 0.03049]], columns=features)
20price = model.predict(new_area)[0]
21print(f"预测房价中位数:{price:.2f} 千美元")
22print(f"测试集 MSE:{mse:.2f},R²:{r2:.3f}")

逐行理解代码

01

导入 pandas,并用 pd 作为简称,用来读取和组织表格数据。

02

导入数据拆分工具,把历史社区划分为训练集和测试集。

03

导入流水线工具,让标准化和回归模型按固定顺序执行。

04

导入标准化工具,把不同单位的特征转换到可比较的数值尺度。

05

导入 sklearn 提供的线性回归模型。

06

导入均方误差 MSE 和 R² 两个模型评估指标。

07

读取课程下载的 CSV;第一行是数据集尺寸说明,因此跳过一行。

08

明确本课使用的四个输入特征,不使用存在争议的 B 字段。

09

从数据表中取出四列社区特征,保存为模型输入 X。

10

取出社区房价中位数 MEDV,保存为模型要学习的目标 y。

11

开始拆分特征和目标,训练数据用来学习,测试数据用来检查效果。

12

保留 20% 数据用于测试,并固定随机种子 42,让每次结果一致。

13

完成 train_test_split 函数调用。

14

建立流水线:先标准化四个特征,再训练多特征线性回归。

15

把训练集交给模型,学习四个特征的权重和基础项。

16

让模型预测从未参与训练的测试社区房价。

17

比较测试集真实值和预测值,计算整体均方误差。

18

计算 R²,观察模型能解释多少房价数据变化。

19

建立课程开场的待预测社区,字段顺序与训练数据保持一致。

20

使用完整流水线预测新社区,并取出第一条预测结果。

21

把预测值保留两位小数后输出,单位仍是千美元。

22

输出测试指标,用数据检查模型表现,而不是只看一个预测结果。

09 · 使用边界

哪些问题适合使用线性回归?

目标是连续数值特征与结果近似线性需要简单、容易解释数据质量支持训练业务允许一定误差预测范围接近训练数据
房价预测房间数、区域特征房价
销量预测价格、促销、季节销量
能耗预测面积、温度、时长用电量
工期预测工程量、人数、资源完工天数
消费预测活跃度、历史消费消费金额
广告效果多渠道广告投入销售收入

线性回归既能预测,也能帮助理解线性关联;但关联不等于因果。

●  ●  ●   ●    ●

弯曲趋势无法被一条直线完整表示

数据关系明显弯曲时,线性模型会在某些区域持续产生偏差。

10 · 完成挑战

回到开场:我们现在有了多少依据?

你的直觉预测25.0
单特征模型27.79
四特征模型30.78
数据中的真实 MEDV31.2

MEDV 的单位为 1,000 美元,因此 31.2 表示该统计区域自住房屋价格中位数为 31,200 美元。多特征模型仍没有完全预测正确,因为历史规律、数据特征和线性假设都有边界。

我们先用一个特征和一条直线理解原理,再把同样逻辑扩展到多个特征。最终模型综合社区的多项信息,而不是只根据平均房间数预测。
11 · KNOWLEDGE CHECK

用五道题,检查你的理解

当前答对 0 / 5 题,可随时重新选择。

01

线性回归主要用于预测什么?

02

斜率控制什么?

03

为什么计算均方误差?

04

多特征模型如何预测?

05

增加更多特征后一定更好吗?

COURSE 03 · SUMMARY

线性回归,是从数据中找到可解释的数值规律

  1. 主要用于预测连续数值
  2. 单特征模型可表现为拟合直线
  3. 多特征模型学习多个权重
  4. 训练目标是减小整体预测误差
  5. 单特征建立直觉,多特征解决完整问题
  6. 非线性、异常值、遗漏特征和外推都会影响结果
从历史数据中学习多个特征与结果之间的线性关系,再利用这种关系预测新的连续数值。