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 知识体系图
下面这张图展示了本章的核心逻辑:
嗯,到这里,线性回归的核心内容就讲完了。记住,模型不是越复杂越好,关键是理解数据、理解业务。下次你遇到预测问题,不妨先试试线性回归——它往往能给你一个不错的 baseline。
公众号:蓝海资料掘金营,微信deep3321