1. 核心概念:偏差与方差(Bias & Variance)
这是机器学习中最经典的"误差三角"问题。我们用"打靶"来形象理解:
- 偏差(Bias) :瞄准点的整体偏移。高偏差意味着模型太简单,连训练集都拟合不好(欠拟合)。比如把一条曲线当成直线来算。
- 方差(Variance) :子弹的散布程度。高方差意味着模型太复杂,对训练数据的微小变化极其敏感(过拟合)。比如把树叶的纹理都当成分类依据。
| 场景 | 偏差(准度) | 方差(精度) | 比喻 |
|---|---|---|---|
| 高偏差,低方差 | ❌ 瞄得偏(都偏左) | ✅ 打得稳(聚在一起) | 枪的准星歪了,但每次射偏的距离都一样。 |
| 低偏差,高方差 | ✅ 瞄得准(瞄准靶心) | ❌ 打得飘(散落四周) | 枪没有问题,但手抖得厉害,时左时右。 |
| 低偏差,低方差 | ✅ 瞄得准 | ✅ 打得稳 | 神枪手。 |
| 高偏差,高方差 | ❌ 又歪又飘 | ❌ 又歪又飘 | 随缘枪法。 |
数学分解(回归任务) :
模型的期望误差 = 偏差² + 方差 + 不可约误差。
E(y−f\^(x))2=(Ef\^(x)−f(x))2⏟Bias2+E(f\^(x)−E\[f\^(x))2]⏟Variance+σ2 \mathbb{E}(y - \\hat{f}(x))\^2 = \underbrace{(\mathbb{E}\\hat{f}(x) - f(x))^2}{\text{Bias}^2} + \underbrace{\mathbb{E}(\\hat{f}(x) - \\mathbb{E}\[\\hat{f}(x))^2]}{\text{Variance}} + \sigma^2 E(y−f\^(x))2=Bias2 (Ef\^(x)−f(x))2+Variance E(f\^(x)−E\[f\^(x))2]+σ2
结论:单一的复杂模型往往陷入"高方差",单一简单模型往往陷入"高偏差"。集成学习就是用来"拆东墙补西墙"的利器。
2. 集成学习原理
| 方法 | 核心策略 | 并行/串行 | 主要解决问题 | 推荐系统典型应用 |
|---|---|---|---|---|
| Bagging | 样本重采样 (有放回),训练多个基模型,投票/平均 | 并行 | 降低方差(防止过拟合) | 多路召回融合 (User-CF 和 Item-CF 结果混合)、随机森林做召回 |
| Boosting | 串行 训练,每一轮拟合上一轮的残差(负梯度),加权融合 | 串行 | 降低偏差(提升模型精度) | 精排 CTR 预估(XGBoost / GBDT)挖掘高阶非线性特征 |
| Stacking | 分层结构,基模型输出作为**元模型(Meta-learner)**的输入特征 | 并行+串行 | 综合降低误差,利用不同模型的优势 | 多目标融合 (点击率与转化率平衡)、Model Ensemble 线上打分融合 |
3. 预测电影评分
我们用一个具体的回归任务(预测用户对电影的评分,真实值为 yyy)
3.1 数据集与基模型设定
假设我们有 4 个样本的真实评分(目标值 yyy):
y=4.0,5.0,3.0,4.5 y = 4.0, \\quad 5.0, \\quad 3.0, \\quad 4.5 y=4.0,5.0,3.0,4.5
我们训练了三个"孬"基模型(为了演示效果,稍微极端一点):
- 模型 A(高方差模型) :比如单棵深层决策树,对数据敏感。
y^A=4.8,4.2,3.8,4.9 \hat{y}_A = 4.8, \\quad 4.2, \\quad 3.8, \\quad 4.9 y^A=4.8,4.2,3.8,4.9 - 模型 B(高偏差模型) :比如线性回归,整体偏保守。
y^B=3.0,4.0,2.5,3.5 \hat{y}_B = 3.0, \\quad 4.0, \\quad 2.5, \\quad 3.5 y^B=3.0,4.0,2.5,3.5 - 模型 C(另一个弱模型) :
y^C=3.8,4.5,2.8,4.0 \hat{y}_C = 3.8, \\quad 4.5, \\quad 2.8, \\quad 4.0 y^C=3.8,4.5,2.8,4.0
3.2 单一模型误差分析(验证"偏差-方差"困境)
我们计算均方误差(MSE):
MSE=1n∑(yi−y^i)2 MSE = \frac{1}{n} \sum (y_i - \hat{y}_i)^2 MSE=n1∑(yi−y^i)2
-
模型 A(高方差) :
(4.0−4.8)2+(5.0−4.2)2+(3.0−3.8)2+(4.5−4.9)2=0.64+0.64+0.64+0.16=2.08(4.0-4.8)^2 + (5.0-4.2)^2 + (3.0-3.8)^2 + (4.5-4.9)^2 = 0.64 + 0.64 + 0.64 + 0.16 = 2.08(4.0−4.8)2+(5.0−4.2)2+(3.0−3.8)2+(4.5−4.9)2=0.64+0.64+0.64+0.16=2.08
平均值:2.08/4=0.522.08 / 4 = 0.522.08/4=0.52。
-
模型 B(高偏差) :
(4.0−3.0)2+(5.0−4.0)2+(3.0−2.5)2+(4.5−3.5)2=1.0+1.0+0.25+1.0=3.25(4.0-3.0)^2 + (5.0-4.0)^2 + (3.0-2.5)^2 + (4.5-3.5)^2 = 1.0 + 1.0 + 0.25 + 1.0 = 3.25(4.0−3.0)2+(5.0−4.0)2+(3.0−2.5)2+(4.5−3.5)2=1.0+1.0+0.25+1.0=3.25
平均值:3.25/4=0.81253.25 / 4 = 0.81253.25/4=0.8125。
3.3 步骤一:Bagging(并行平均,降低方差)
Bagging 利用 Bootstrap 抽样,生成不同的训练子集训练多个模型 A。这里我们模拟生成 3 个 Bagging 子模型(A1,A2,A3A_1, A_2, A_3A1,A2,A3),然后将它们的预测结果取平均(因为回归任务取平均)。
假设三个子模型的预测结果如下:
| 样本 | 真实 yyy | A1A_1A1 | A2A_2A2 | A3A_3A3 | Bagging 平均 (y^Bagging\hat{y}_{Bagging}y^Bagging) |
|---|---|---|---|---|---|
| 1 | 4.0 | 4.9 | 4.7 | 4.8 | 4.8 |
| 2 | 5.0 | 4.1 | 4.3 | 4.2 | 4.2 |
| 3 | 3.0 | 3.9 | 3.7 | 3.8 | 3.8 |
| 4 | 4.5 | 5.0 | 4.8 | 4.9 | 4.9 |
计算 Bagging 后的 MSE:
(4.0−4.8)2+(5.0−4.2)2+(3.0−3.8)2+(4.5−4.9)2=0.64+0.64+0.64+0.16=2.08 (4.0-4.8)^2 + (5.0-4.2)^2 + (3.0-3.8)^2 + (4.5-4.9)^2 = 0.64 + 0.64 + 0.64 + 0.16 = 2.08 (4.0−4.8)2+(5.0−4.2)2+(3.0−3.8)2+(4.5−4.9)2=0.64+0.64+0.64+0.16=2.08
平均为 0.52。
关键发现:Bagging 的 MSE(0.52)和单个高方差模型 A(0.52)在数值上一致,为什么说它降低了方差?
因为方差是不同数据集上的波动 。虽然这里的点估计值没变(三个子模型都是围绕 A 上下波动,均值等于 A),但在真实场景中,子模型之间的不相关性会大幅降低模型在测试集上的波动性(即方差降低)。推荐系统中,**多路召回融合(协同过滤 + 矩阵分解)**就是 Bagging 思想的体现,通过合并不同来源的推荐结果,避免某一路过拟合"热门商品"。
3.4 步骤二:Boosting(串行拟合残差,降低偏差)
Boosting 的核心是串行 。我们先训练一个弱基模型(通常是高偏差、低方差的桩,比如决策树桩),然后后续模型只学习残差(Residual)。
第 1 轮 :我们用模型 B(高偏差)作为初始模型 F1(x)F_1(x)F1(x)(F1F_1F1 就是上面的 y^B\hat{y}_By^B)。
计算残差(真实值 - 预测值):
残差1=y−F1=4.0−3.0,5.0−4.0,3.0−2.5,4.5−3.5=1.0,1.0,0.5,1.0 残差_1 = y - F_1 = 4.0-3.0, \\quad 5.0-4.0, \\quad 3.0-2.5, \\quad 4.5-3.5 = 1.0, \\quad 1.0, \\quad 0.5, \\quad 1.0 残差1=y−F1=4.0−3.0,5.0−4.0,3.0−2.5,4.5−3.5=1.0,1.0,0.5,1.0
第 2 轮 :训练一个新模型 h2h_2h2 专门去拟合这个残差序列(通常学习率设为 1 以便手算)。假设 h2h_2h2 的预测结果为:
h2=0.8,0.9,0.4,0.8 h_2 = 0.8, \\quad 0.9, \\quad 0.4, \\quad 0.8 h2=0.8,0.9,0.4,0.8
更新强学习器 :
F2=F1+h2=3.0+0.8,4.0+0.9,2.5+0.4,3.5+0.8=3.8,4.9,2.9,4.3 F_2 = F_1 + h_2 = 3.0+0.8, \\quad 4.0+0.9, \\quad 2.5+0.4, \\quad 3.5+0.8 = 3.8, \\quad 4.9, \\quad 2.9, \\quad 4.3 F2=F1+h2=3.0+0.8,4.0+0.9,2.5+0.4,3.5+0.8=3.8,4.9,2.9,4.3
计算 F2F_2F2 的 MSE:
(4.0−3.8)2+(5.0−4.9)2+(3.0−2.9)2+(4.5−4.3)2=0.04+0.01+0.01+0.04=0.10 (4.0-3.8)^2 + (5.0-4.9)^2 + (3.0-2.9)^2 + (4.5-4.3)^2 = 0.04 + 0.01 + 0.01 + 0.04 = 0.10 (4.0−3.8)2+(5.0−4.9)2+(3.0−2.9)2+(4.5−4.3)2=0.04+0.01+0.01+0.04=0.10
平均为 0.10/4=0.0250.10 / 4 = 0.0250.10/4=0.025。
关键发现 :MSE 从初始模型 B 的 0.8125 急剧下降到 0.025。Boosting 极其成功地降低了偏差(欠拟合)。在推荐系统中,**精排模型(如 XGBoost)**利用这种方法,逐个捕捉用户点击行为中难以拟合的极端非线性特征,极大提升了 CTR 预估精度。
3.5 步骤三:Stacking(分层融合,综合优化)
Stacking 不再满足于平均或线性相加。它将基模型的输出当作新特征,训练一个高层"元模型(Meta-model)"。
构造 Stacking 的输入特征 :
我们把模型 A、B、C 的输出拼接成新的训练集 XmetaX_{meta}Xmeta。
| 样本 | 真实 yyy | 特征1(模型A) | 特征2(模型B) | 特征3(模型C) |
|---|---|---|---|---|
| 1 | 4.0 | 4.8 | 3.0 | 3.8 |
| 2 | 5.0 | 4.2 | 4.0 | 4.5 |
| 3 | 3.0 | 3.8 | 2.5 | 2.8 |
| 4 | 4.5 | 4.9 | 3.5 | 4.0 |
训练元模型(以线性回归为例) :
我们要找一组权重 w1,w2,w3w_1, w_2, w_3w1,w2,w3,使得:
y≈w1⋅ModelA+w2⋅ModelB+w3⋅ModelC y \approx w_1 \cdot \text{ModelA} + w_2 \cdot \text{ModelB} + w_3 \cdot \text{ModelC} y≈w1⋅ModelA+w2⋅ModelB+w3⋅ModelC
手算求解(最小二乘法)极简推导:
通过解四元一次方程组(或矩阵求逆),这里我们直接给出拟合后的最优近似权重(假设经过计算):
w1=0.3,w2=0.4,w3=0.3 w_1 = 0.3, \quad w_2 = 0.4, \quad w_3 = 0.3 w1=0.3,w2=0.4,w3=0.3
计算 Stacking 的预测结果 y^Stack\hat{y}_{Stack}y^Stack:
- 样本1:0.3(4.8)+0.4(3.0)+0.3(3.8)=1.44+1.2+1.14=3.780.3(4.8) + 0.4(3.0) + 0.3(3.8) = 1.44 + 1.2 + 1.14 = 3.780.3(4.8)+0.4(3.0)+0.3(3.8)=1.44+1.2+1.14=3.78(误差 0.22)
- 样本2:0.3(4.2)+0.4(4.0)+0.3(4.5)=1.26+1.6+1.35=4.210.3(4.2) + 0.4(4.0) + 0.3(4.5) = 1.26 + 1.6 + 1.35 = 4.210.3(4.2)+0.4(4.0)+0.3(4.5)=1.26+1.6+1.35=4.21(误差 0.79)
- 样本3:0.3(3.8)+0.4(2.5)+0.3(2.8)=1.14+1.0+0.84=2.980.3(3.8) + 0.4(2.5) + 0.3(2.8) = 1.14 + 1.0 + 0.84 = 2.980.3(3.8)+0.4(2.5)+0.3(2.8)=1.14+1.0+0.84=2.98(误差 0.02)
- 样本4:0.3(4.9)+0.4(3.5)+0.3(4.0)=1.47+1.4+1.2=4.070.3(4.9) + 0.4(3.5) + 0.3(4.0) = 1.47 + 1.4 + 1.2 = 4.070.3(4.9)+0.4(3.5)+0.3(4.0)=1.47+1.4+1.2=4.07(误差 0.43)
计算总 MSE:
0.222+0.792+0.022+0.432=0.0484+0.6241+0.0004+0.1849=0.8578 0.22^2 + 0.79^2 + 0.02^2 + 0.43^2 = 0.0484 + 0.6241 + 0.0004 + 0.1849 = 0.8578 0.222+0.792+0.022+0.432=0.0484+0.6241+0.0004+0.1849=0.8578
平均 MSE ≈0.214\approx 0.214≈0.214。
关键发现 :Stacking 的 MSE(0.214)虽然不如 Boosting(0.025)在特定样本集上完美,但它利用了模型 A、B、C 的异质互补性 。在推荐系统线上服务中,Stacking 常用于多目标融合(MOE),比如把"点击率模型"、"观看时长模型"、"互动率模型"的输出拼接,再经过一个逻辑回归元模型,动态调整最终推荐排序得分,实现收益最大化。
4. 推荐系统中的抉择
| 场景需求 | 应采用策略 | 理由 |
|---|---|---|
| 召回阶段(从千万级物品中粗筛) | Bagging(多路召回) | 用多种策略(协同过滤、向量召回、热度召回)并行,防止单一策略过拟合爆款,降低方差。 |
| 精排阶段(CTR/CVR 预估) | Boosting(GBDT/XGBoost) | 为了最大化收益,需要极高的精度拟合用户行为,Boosting 降低偏差的能力无出其右。 |
| 多目标/模型融合阶段 | Stacking | 当你有多个已经训练好的成熟模型时,Stacking 元模型能自动学习它们的权重,往往比人工调参融合(加权求和)效果更好。 |
| 特征与样本维度 | 交叉验证 | 偏差和方差是相辅相成的。使用 k 折交叉验证 严格评估模型性能,确保我们通过 Bagging 降了方差,但没有"升"偏差;通过 Boosting 降了偏差,但没有"引爆"方差(引入早停法)。 |