线性回归是机器学习的基础模型之一,其核心概念是用一条直线或超平面拟合数据,找到误差最小的拟合方式。它包含两个核心概念:线性关系和最小二乘法。线性关系假设特征与目标之间存在线性关系,公式为 y = wx + b,其中 w 是斜率,b 是截距,y_hat 是预测值。最小二乘法通过最小化均方误差(MSE)来找到最优参数,MSE 是所有数据点到直线的垂直距离平方和。读者学习后可以使用 scikit-learn 库中的 `fit()` 和 `predict()` 方法进行线性回归模型的训练和预测。尽管线性回归简单且计算速度快,但它只能拟合线性关系,对异常值敏感,并且在特征高度相关时不稳定。掌握线性回归是理解更复杂模型如多项式回归、岭回归和 Lasso 回归的基础。
第一个模型:线性回归
线性回归是机器学习的"Hello World"——简单到一行公式,但它奠定了后续所有模型的基础。
一句话定义
线性回归 = 用一条直线(或超平面)去拟合数据,找到"误差最小"的那条线。
数学原理
假设我们想用特征 x 预测目标 y。最朴素的假设是它们之间是线性关系:
y_hat = w*x + b
其中:
- w 是斜率(权重)
- b 是截距(偏置)
- y_hat 是预测值
多个特征的情况(多元线性回归):
y_hat = w1*x1 + w2*x2 + ... + wn*xn + b
怎么找到最好的 w 和 b?
最小二乘法(Ordinary Least Squares,OLS)是最经典的方法。
我们定义均方误差(Mean Squared Error,MSE)作为损失函数:
L(w, b) = (1/n) * sum((y_hat - y)^2)
直观理解:所有点到直线的垂直距离平方和最小的那条线,就是最好的拟合。
三行代码上手 sklearn
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import numpy as np
# 1. 准备数据
X = np.array([[50], [60], [80], [100], [120], [150]]) # 面积
y = np.array([200, 240, 320, 400, 480, 600]) # 房价
# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 3. 训练模型
model = LinearRegression()
model.fit(X_train, y_train)
# 4. 看学到的参数
print(f"斜率 w = {model.coef_[0]:.2f}")
print(f"截距 b = {model.intercept_:.2f}")
# 5. 预测
pred = model.predict([[90]])
print(f"90 平米的预测价格: {pred[0]:.1f} 万元")
输出类似:
斜率 w = 4.00
截距 b = -0.00
90 平米的预测价格: 360.0 万元
动手试一试
下面这个交互组件里,你可以拖动滑块改变直线的斜率和截距,实时看到 MSE 损失的变化。试着找出让 MSE 最小的那条线!
🎯 线性回归拟合实验
拖动滑块调整尝试直线的斜率和截距,看 MSE 如何变化。找到让 MSE 最小的线!
💡 提示: 真实线参数是 y = 3x + 2。当你的红线和绿虚线完全重合时,MSE 最小。
线性回归的局限性
虽然好用,但线性回归有几个明显短板:
- 只能拟合线性关系:遇到曲线数据就抓瞎
- 对异常值敏感:一个离群点能把整条线拉偏
- 特征之间高度相关时会不稳定(多重共线性)
后面我们会学到多项式回归、岭回归、Lasso 回归来应对这些问题。
小结
- 线性回归用直线/超平面拟合数据
- 用最小二乘法找最优参数,损失函数是 MSE
- sklearn 只需要
fit()和predict()两个调用 - 简单、可解释、计算快,是入门必备
练习思考
- 用最小二乘法手算 w 和 b:对数据
X=[1,2,3],y=[2,4,6],求出 w 和 b 的值。 - 如果数据点有 3 个维度(面积、楼层、位置)做预测,公式会变成什么样?
- 思考:为什么"用绝对值"作为损失函数(MAE)也可以,但用得比 MSE 少?
💻 编程挑战: 实现 RMSE
把上面的 RMSE 公式用代码实现, 跑通所有测试用例。
实现 RMSE (均方根误差)
简单实现 `rmse(y_true, y_pred)`, 返回预测值与真实值之间的均方根误差。 **公式**: \( \text{RMSE} = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2} \) **示例**: - `rmse([1,2,3], [1,2,3])` 应返回 `0.0` - `rmse([1,2,3], [2,2,2])` 应返回 `0.816...` (约 √(2/3))
章末小测验
检验你对《第一个模型:线性回归》的掌握程度。
线性回归中,MSE 损失函数的公式是?
为什么最小二乘法用「平方」而不是「绝对值」?