线性回归:模型怎样用一条线预测连续数值
2026/7/10 3:50:45 网站建设 项目流程

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

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

本课要解决什么问题

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

面积 (m²)成交价 (万元)
45120
58145
66168
72180
86215
98248
110275

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

从数学角度看:模型在算什么

一个特征时,线性回归学的是一条直线:

y = w x + b y = wx + by=wx+b

  • x xx是输入特征,例如房屋面积;
  • y yy是要预测的目标,例如房价;
  • w ww是权重,表示面积每增加 1 个单位,价格大约变多少;
  • b bb是偏置,负责把整条线上下平移。

实际项目通常有多个特征,例如面积、房间数、楼层和到地铁站距离,公式会扩展成多个特征的加权求和:

y = w 1 x 1 + w 2 x 2 + w 3 x 3 + b y = w_1 x_1 + w_2 x_2 + w_3 x_3 + by=w1x1+w2x2+w3x3+b

写成矩阵形式就是y ^ = X w + b \hat{y} = \mathbf{X}\mathbf{w} + by^=Xw+b,其中X \mathbf{X}X是样本矩阵、w \mathbf{w}w是权重向量。核心还是加权求和,只是从一条线变成了多维空间里的一个超平面。

训练目标:MSE 怎么度量"错了多少"

模型一开始并不知道w wwb bb应该取什么值,所以先随便给一个。把每个样本的预测值y ^ i \hat{y}_iy^i和真实值y i y_iyi比较:

MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2MSE=n1i=1n(yiy^i)2

两个关键细节:误差先平方,保证正负误差不互相抵消,同时放大惩罚大误差;再取平均,让不同样本数之间可比。模型训练的过程,就是不断调整w wwb bb,让 MSE 越来越小。

用 scikit-learn 跑通第一个例子

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

importnumpyasnpfromsklearn.linear_modelimportLinearRegressionfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportmean_squared_error,r2_score# 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)# 用测试集评估y_pred=model.predict(X_test)print(f"权重 (w):{model.coef_[0]:.2f}")# 斜率print(f"偏置 (b):{model.intercept_:.2f}")# 截距print(f"MSE:{mean_squared_error(y_test,y_pred):.2f}")print(f"R²:{r2_score(y_test,y_pred):.2f}")# 对新样本预测price=model.predict(np.array([[92]]))print(f"92 平米预测价:{price[0]:.1f}万元")

新手最容易漏掉的三个细节:

  1. X必须是二维的。即使只有一个特征"面积",也要写成[[45], [58], ...],每个内层列表是一个样本。y是一维目标数组。
  2. fit()是学习,predict()是使用。调用predict()不会继续学习,这正是测试集可以公平评估的原因。
  3. 训练和预测的数据形状必须一致。训练用了 4 个特征,预测时也必须传 4 个特征,列数不匹配直接报错。

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

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

划分要在训练前就完成:

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

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

线性回归的边界在哪里

线性回归很适合做第一个基线模型,训练快、可解释,也能帮助发现数据流程问题。但它假设输入和输出之间是线性关系,真实世界不一定如此。

场景回归能行吗
面积 → 房价基本线性,可用
广告投入 → 销量边际递减,可能非线性
用户年龄 → 消费力先升后降,倒 U 型
折扣力度 → 转化率阶跃式变化

遇到明显弯曲、分段或复杂交互的关系,不要急着换复杂模型,先尝试三步:

  1. 特征变换:取对数log ⁡ x \log xlogx、开方x \sqrt{x}x、分桶后再 One-Hot;
  2. 特征交叉:构造面积 × 房间数这样的新特征;
  3. 多项式特征:加上x 2 x^2x2x 3 x^3x3等非线性项。

三步都不灵了,再考虑决策树、随机森林等非线性模型。先用线性回归跑通流程,得到一个可靠基线,后续的改进才有比较对象。

常见错误

把分类问题拿来做回归

"用户会不会流失"只有两个类别,应该用分类模型;“用户未来消费金额是多少"才是回归。如果硬用线性回归去拟合 0/1 标签,模型可能输出 0.37、-0.16 这种没有分类意义的"概率”。任务目标决定模型和指标,不能只看数据长得像不像数字。

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

线性回归不能直接读取字符串类别,也不喜欢包含缺失值的输入,数量级相差巨大的特征会让w i w_iwi无法公平比较。前面几课的清洗、编码和缩放是训练流程的一部分,不是可选装饰。

只看训练集效果

模型在训练数据上误差很小并不奇怪,它本来就从这些样本中学习。测试集的表现才说明模型是否真正学会了规律。

课后练习

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

小结

  • 回归任务预测连续数值;
  • 线性回归学习特征与目标之间的线性关系y = w 1 x 1 + ⋯ + b y = w_1x_1 + \dots + by=w1x1++b
  • fit()学参数,predict()预测新样本,两者不互相影响;
  • 先建立简单、可靠的基线,再谈更复杂的模型,永远在测试集上评估。

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


在线阅读

点击这里阅读博客原文

原文地址:https://bestsdz.xyz/posts/linear-regression-basics/

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询