3、线性回归与预测:一元线性回归、多元线性回归、模型评估指标(MSE、R²)、实战:房价预测

线性回归,说白了就是找一条线,让它尽可能穿过所有数据点。你想想看,我们做预测,本质上就是在找规律。房价和面积的关系、销量和广告投入的关系,这些背后往往藏着一条线性的规律。

我个人习惯把线性回归当作所有机器学习模型的“Hello World”。它简单、直观,但背后的思想——最小化误差、评估拟合效果——是所有复杂模型的基础。今天我们就把它彻底讲透。

3.1 一元线性回归:一条直线搞定预测

一元线性回归,就是只有一个自变量 x 和一个因变量 y。比如,用房屋面积预测房价。

它的数学形式很简单:

y = wx + b

其中 w 是斜率(权重),b 是截距(偏置)。我们的目标,就是找到最合适的 w 和 b。

怎么找? 最常用的方法是最小二乘法。它的核心思想是:让所有数据点到直线的垂直距离的平方和最小。

核心公式:

损失函数 J(w,b) = (1/n) * Σ(y_i - (wx_i + b))²

我们要做的就是让这个 J 尽可能小。

我在项目中遇到过一个问题:数据量不大,但异常值特别多。有一次做某个城市的房价分析,有个别墅标价特别低,明显是录入错误。如果不处理,那条回归线会被它“拽”得歪七扭八。所以,做线性回归前,一定要先做数据清洗。

3.2 多元线性回归:多个因素一起考虑

现实世界很少只有一个影响因素。房价不仅看面积,还看卧室数量、楼层、房龄、周边配套……这时候就需要多元线性回归了。

数学形式变成:

y = w₁x₁ + w₂x₂ + ... + wₙxₙ + b

用矩阵表示更简洁:

y = XW + b

其中 X 是特征矩阵,W 是权重向量。

这里有个坑,我曾经踩过: 特征之间如果有强相关性(比如“房屋总面积”和“客厅面积”高度相关),会导致多重共线性问题。模型会变得不稳定,权重估计不准确。我的建议是,先做相关性分析,必要时用 PCA 降维或直接删除冗余特征。

注意: 多元线性回归要求特征之间尽量独立。如果两个特征高度相关,模型会“不知道该听谁的”。

3.3 模型评估指标:MSE 和 R²

模型建好了,怎么知道它好不好?光靠肉眼看图可不行。我们需要量化指标。

3.3.1 MSE(均方误差)

MSE 就是所有预测误差的平方的平均值。公式很简单:

MSE = (1/n) * Σ(y_i - ŷ_i)²

MSE 越小,说明预测越准。但它有一个缺点:单位是原始单位的平方。比如房价单位是万元,MSE 的单位就是“万元的平方”,不太好直观理解。

小技巧: 我习惯同时看 RMSE(均方根误差),就是给 MSE 开个根号。这样单位就和原始数据一致了,更容易理解误差有多大。

3.3.2 R²(决定系数)

R² 衡量的是模型对数据变异的解释程度。取值范围是 0 到 1,越接近 1 越好。

公式:

R² = 1 - (SS_res / SS_tot)

其中 SS_res 是残差平方和,SS_tot 是总平方和。

说白了,R² 就是“模型能解释多少变化”。如果 R² = 0.85,说明模型解释了 85% 的数据变异,剩下 15% 是随机误差或其他因素。

我的经验: R² 不是越高越好。有一次我硬塞了 20 个特征进去,R² 到了 0.99,但模型在新数据上表现极差——过拟合了。所以,R² 要结合验证集的表现一起看。

3.4 实战:房价预测

好了,理论讲完了,我们动手做一个完整的房价预测案例。我会用 Python 的 scikit-learn 库。

3.4.1 数据准备

假设我们有这样一个数据集:

面积(m²) 卧室数 房龄(年) 价格(万元)
80 2 5 120
120 3 3 180
60 1 10 80
150 4 1 250

3.4.2 代码实现

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split

# 特征和标签
X = np.array([[80, 2, 5],
              [120, 3, 3],
              [60, 1, 10],
              [150, 4, 1]])
y = np.array([120, 180, 80, 250])

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42
)

# 创建并训练模型
model = LinearRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"MSE: {mse:.2f}")
print(f"R²: {r2:.2f}")
print(f"权重: {model.coef_}")
print(f"截距: {model.intercept_:.2f}")

3.4.3 结果解读

假设输出结果是:

MSE: 25.30
R²: 0.92
权重: [1.2, 15.0, -3.5]
截距: 10.00

这意味着:

  • 面积每增加 1m²,价格平均上涨 1.2 万元
  • 卧室数每增加 1 间,价格平均上涨 15 万元
  • 房龄每增加 1 年,价格平均下降 3.5 万元
  • R² = 0.92,说明模型解释了 92% 的价格变化

注意: 这里的权重是“平均效应”,不代表因果关系。比如卧室数多,往往意味着面积也大,所以它的系数可能包含了面积的部分影响。这就是我之前说的多重共线性问题。

3.5 知识体系图

下面这张图展示了本章的核心逻辑:

线性回归知识体系 一元线性回归 y = wx + b 多元线性回归 y = XW + b 模型评估 MSE / R² 实战:房价预测 数据准备 → 模型训练 → 评估优化 关键点 最小二乘法 · 多重共线性 · 过拟合 · 特征工程

嗯,到这里,线性回归的核心内容就讲完了。记住,模型不是越复杂越好,关键是理解数据、理解业务。下次你遇到预测问题,不妨先试试线性回归——它往往能给你一个不错的 baseline。


公众号:蓝海资料掘金营,微信deep3321