监督学习

第08课:线性回归

OLS原理、梯度下降、正则化(L1/L2)、多项式回归、回归评估

1. 线性回归模型

Y = Xw + ε, 最小化 L(w) = ‖Y-Xw‖²

解析解: ŵ = (XᵀX)⁻¹XᵀY(高斯-马尔可夫定理:BLUE)

2. 梯度下降

wₜ₊₁ = wₜ - η∇L(wₜ)。变体:BGD(全量)/SGD(单样本)/Mini-batch(折中)

学习率太大→震荡/发散;太小→收敛慢。自适应:AdaGrad, RMSProp, Adam

3. 正则化

Ridge(L2): L+λ‖w‖² → ŵ=(XᵀX+λI)⁻¹XᵀY,系数收缩但不会为0

Lasso(L1): L+λ‖w‖₁ → 稀疏解,自动特征选择

ElasticNet: L+λ₁‖w‖₁+λ₂‖w‖²,兼顾稀疏性和稳定性

4. 多项式回归

Y = w₀+w₁x+w₂x²+...,本质仍是对参数线性的回归,通过特征映射引入非线性

5. 评估指标

MSE/RMSE(对大误差敏感)、MAE(稳健)、R²(可解释)、调整R²(惩罚多余变量)

Python代码实现与验证

💡 代码说明:以下代码使用 Python / Scikit-learn 实现,已实机运行验证。

完整代码


import numpy as np
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score
np.random.seed(42)

X = np.random.uniform(-3, 3, 200).reshape(-1,1)
y = 2 + 1.5*X.ravel() + 0.5*X.ravel()**2 + np.random.normal(0, 1, 200)

print("=== 线性回归 ===")
lr = LinearRegression()
lr.fit(X, y)
print("R2={:.4f}".format(lr.score(X,y)))

print("\n=== 多项式回归 ===")
for d in [1,2,3,5]:
    pipe = Pipeline([('poly',PolynomialFeatures(d)),('lr',LinearRegression())])
    s = cross_val_score(pipe, X, y, cv=5, scoring='r2')
    print("degree={}: R2={:.4f}(+/-{:.4f})".format(d, s.mean(), s.std()))

print("\n=== 正则化 ===")
Xm = np.random.randn(200,20)
ym = Xm[:,0]*3 + Xm[:,3]*(-2) + np.random.randn(200)*0.5
for name, mdl in [('Ridge',Ridge(1)),('Lasso',Lasso(0.1)),('ElasticNet',ElasticNet(0.1,l1_ratio=0.5))]:
    s = cross_val_score(mdl, Xm, ym, cv=5, scoring='r2')
    mdl.fit(Xm, ym)
    nnz = np.sum(np.abs(mdl.coef_)>0.01)
    print("{}: R2={:.4f} 非零系数={}/20".format(name, s.mean(), nnz))

运行结果

=== 线性回归 === R2=0.7039 === 多项式回归 === degree=1: R2=0.6950(+/-0.0483) degree=2: R2=0.8986(+/-0.0364) degree=3: R2=0.8995(+/-0.0359) degree=5: R2=0.8974(+/-0.0367) === 正则化 === Ridge: R2=0.9813 非零系数=15/20 Lasso: R2=0.9816 非零系数=2/20 ElasticNet: R2=0.9789 非零系数=5/20
✅ 验证通过

深入理解:算法选择的实践智慧

没有免费午餐定理

Wolpert和Macready在1997年证明:在所有可能的问题上,没有任何算法的平均表现优于其他算法。这意味着算法选择必须基于问题特性

算法选择流程

  1. 基线模型:先用逻辑回归/线性回归建立基线
  2. 数据特性分析:样本量、特征数、线性/非线性、噪声水平
  3. 尝试强模型:随机森林/GBDT/XGBoost
  4. 特征工程:比模型选择更重要
  5. 模型融合:多模型投票/堆叠通常优于单模型

模型复杂度 vs 数据量

数据量推荐模型原因
<1000逻辑回归/朴素贝叶斯简单模型避免过拟合
1K-10KSVM/随机森林平衡复杂度与数据量
10K-100KGBDT/XGBoost足够数据支撑复杂模型
>100K深度学习/大规模集成大数据释放模型潜力

偏差-方差权衡

模型误差 = 偏差² + 方差 + 不可约误差

实践指南与进阶话题

监督学习的工程实践

在实际项目中,算法选择只是工作的一小部分。更关键的是数据管道、特征工程和模型监控。以下是工程实践中的关键决策点:

数据划分策略:时间序列数据必须按时间划分,不能用随机划分。有用户维度的数据必须按用户划分(GroupKFold)。类别不平衡数据必须用StratifiedKFold。划分策略选错,所有结论都是不可靠的。
特征工程优先级:在实际项目中,80%的模型性能提升来自特征工程,而非模型调优。好的特征能让简单模型表现优异;差的特征让最复杂的模型也无力回天。优先做特征工程,再考虑模型选择。
模型可解释性:在金融、医疗等领域,可解释性是法律要求。SHAP值是目前最流行的局部解释方法,它可以告诉你每个特征对单个预测的贡献。部分依赖图(PDP)提供全局解释,展示特征值与预测值的关系。

模型选择的实用策略

没有"最好的模型",只有"最适合当前数据和约束的模型"。决策框架:

集成学习的艺术

在Kaggle竞赛中,几乎所有冠军方案都使用集成学习。但集成不是简单堆叠模型:

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

补充:关键概念与面试要点

核心直觉

常见面试问题

  1. L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
  2. 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
  3. 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
  4. K-Means为什么收敛到局部最优?(目标函数非凸)
  5. PCA为什么需要中心化?(否则第一主成分指向均值方向)

📝 课后练习

  1. 实现本课核心算法并用Scikit-learn验证
  2. 调优关键超参数并记录性能变化
  3. 用交叉验证评估模型稳定性
  4. 与之前学过的方法对比分析
  5. 分析本课方法的失效条件
📏
回归起步
掌握了线性回归及其正则化方法