线性回归:模型怎样用一条线预测连续数值

从房价预测出发,理解线性回归的输入、输出、误差和第一个 scikit-learn 实现。

学习路线:传统机器学习基础(21~34) · 第 27 课
第 27 课一条拟合直线穿过房屋面积和房价散点,表示连续数值预测。
Learning Path

传统机器学习基础(21~34)

补齐文本分类项目背后的数据处理、算法、评估和模型选择知识。

学完本阶段你能做到:拿到一份结构化表格数据,独立完成清洗、特征工程、建模、评估、模型选择和保存,并用规范流程比较多个算法。

推荐读法:建议系统读。做项目时遇到数据和模型选择问题,也可以按需回查。

查看完整阶段 · 14 篇
Lesson Guide

这一课怎么学

先看目标,再带着问题读正文。读完后用练习确认自己真的理解了。

本节你会学到

  • 说清楚「线性回归:模型怎样用一条线预测连续数值」解决的核心问题
  • 知道它在「传统机器学习基础(21~34)」中的位置
  • 把 分类与回归、机器学习、监督学习 这些关键词联系起来

前置知识

  • 建议先读完上一篇:数据标准化和归一化有什么区别
  • 能区分输入、输出、数据和模型目标。

概念回顾

  • 【分类与回归】判断邮件是不是垃圾邮件是分类,预测房价是多少是回归。 前面或后面会反复用到它。
  • 【机器学习】机器学习的重点不是手写所有规则,而是准备数据、定义目标,让模型自己找到可复用的模式。 前面或后面会反复用到它。
  • 【监督学习】如果训练数据里有“题目”和“答案”,模型学会以后再给它新题目,它就尝试给出答案。 前面或后面会反复用到它。

常见误区

  • 不要只记定义,要追问它解决了什么问题。
  • 不要把概念孤立背下来,要放回数据到结果的完整链路里。

课后练习

  • 用 3 句话向一个零基础朋友解释「线性回归:模型怎样用一条线预测连续数值」。
  • 打开概念库里的「分类与回归」,补一遍它和本文的关系。
  • 读下一课「回归模型怎样评估:MAE、MSE、RMSE 和 R²」前,先写下你认为它会解决的问题。

自检练习与参考答案

1. 用一句话说清「线性回归:模型怎样用一条线预测连续数值」解决了什么问题。

合格答案不是复述标题,而是说清它在“数据进入模型、模型学习、结果评估或项目落地”中的作用。

2. 这篇文章和上一课或下一课是什么关系?

它应该为下一课「回归模型怎样评估:MAE、MSE、RMSE 和 R²」铺路:读完后要知道下一课为什么自然出现。

下一步建议读「回归模型怎样评估:MAE、MSE、RMSE 和 R²」。

前面我们完成了数据清洗、特征工程、类别编码和数值缩放。现在终于可以开始训练第一个经典模型:线性回归

它适合回答一类很具体的问题:给定一些输入信息,结果大概是一个什么连续数值?比如房屋价格、订单金额、明天温度、配送时长或设备寿命。

第 27 课视频 · 线性回归:用一条线预测连续数值

本课要解决什么问题

假设我们只有一个特征:房屋面积。历史数据告诉我们不同面积对应的成交价格。现在来了一套 92 平米的房子,我们想估计它的价格。

这不是“价格高、中、低”的类别选择,而是一个可能取 186.5203.2217.8 等值的连续数值。因此它是一个回归任务

一句话理解线性回归

线性回归会在数据中找到一个近似关系:

y = wx + b
  • x 是输入特征,例如房屋面积;
  • y 是要预测的目标,例如房价;
  • w 是权重,表示面积每变化一点,价格大致怎样变化;
  • b 是偏置,负责整体平移这条线。

当只有一个特征时,这个关系可以画成二维平面上的一条直线。实际项目通常有多个特征,例如面积、房间数、楼层和到地铁站距离;公式会扩展成多个特征的加权求和,但核心思想不变。

模型训练时在做什么

模型一开始并不知道 wb 应该是多少,所以它会先给出一组预测。把预测值和真实值放在一起比较,就得到误差。

例如真实价格是 200 万,模型预测成 185 万,这个样本就存在 15 万的偏差。训练的目标不是让每个样本都恰好落在直线上,而是让整体误差尽可能小。

在线性回归里,最常见的训练目标是最小化平方误差。较大的错误会被平方后放大,因此模型会更努力处理偏差很大的样本。

用 scikit-learn 跑通第一个例子

下面是一个可以直接运行的最小示例。为了把注意力放在模型上,数据是手工构造的。

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

# X 必须是二维:每一行一个样本,每一列一个特征
X = np.array([[45], [58], [66], [72], [86], [98], [110]])
y = np.array([120, 145, 168, 180, 215, 248, 275])

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)

model = LinearRegression()
model.fit(X_train, y_train)

prediction = model.predict([[92]])

print("预测价格:", round(prediction[0], 1))
print("权重:", round(model.coef_[0], 2))
print("偏置:", round(model.intercept_, 2))

这里最容易忽略的一点是 X 的形状。即使只有“面积”这一个特征,也要写成 [[45], [58], ...],表示 7 个样本、每个样本 1 个特征。y 则是一维目标数组。

fit() 负责从训练集学习参数,predict() 用已学到的参数预测新样本。模型不会因为调用了 predict() 而继续学习,这正是测试集可以用来做公平评估的原因。

为什么先划分训练集和测试集

上面的例子在训练前就划分了数据:

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)

训练集用来拟合模型;测试集要像未来新数据一样,直到最后才交给模型预测。若模型已经见过测试集的真实答案,再去算误差就没有意义了。

下一课会专门讲如何用 MAE、MSE、RMSE 和 R² 判断模型在测试集上到底表现如何。

线性回归的边界在哪里

线性回归很适合做第一个基线模型,因为它训练快、容易解释,也能帮助我们发现数据流程问题。但它并不意味着所有关系都真的是直线。

比如商品销量可能在折扣达到某个临界点后突然上涨;用户停留时长也可能先随内容长度增加,之后又下降。遇到这种明显弯曲、分段或复杂交互的关系,可以考虑:

  • 增加更有意义的特征;
  • 对特征做对数、分桶或多项式变换;
  • 尝试决策树、随机森林等非线性模型。

不要一开始就急着换复杂模型。先用线性回归跑通流程,得到一个可靠基线,后续的改进才有比较对象。

常见错误

把分类问题拿来做回归

“用户会不会流失”只有两个类别,应该用分类模型;“用户未来消费金额是多少”才是回归。任务目标决定模型和指标,不能只看数据长得像不像数字。

忘记处理缺失、类别和尺度

线性回归不能直接读取字符串类别,也不喜欢包含缺失值的输入。前面几课的清洗、编码和缩放依然是训练流程的一部分,而不是可选装饰。

只看训练集效果

模型在训练数据上误差很小并不奇怪,它本来就从这些样本中学习。真正值得关注的是未参与训练的数据表现。

课后练习

把示例里的单个特征扩展为两个特征:面积和房间数。然后尝试预测一套 92 平米、3 室的房子价格。运行前先回答:此时 X 会有几列?

本课总结

  • 回归任务预测连续数值;
  • 线性回归学习的是特征与目标之间的线性关系;
  • fit() 学参数,predict() 预测新样本;
  • 先建立简单、可靠的基线,再谈更复杂的模型。

下一课我们评估线性回归的预测:模型到底平均错了多少,发生大错时又该怎么看?

Discussion

留言讨论