1. 概述
在推荐系统的融合阶段,不同召回算法(协同过滤、矩阵分解、基于内容的推荐)各自产生一批候选物品和分数。
但这些分数:
- 有的算法只给结果不给分数;
- 有的算法分数范围不同(有的 0~1,有的 0~100);
- 即使归一化,产生机制不同,仍不可直接比较。
因此需要一个统一的融合模型来重新打分排序。
Facebook 广告系统中使用的经典方案就是 GBDT + LR。
分工:
- GBDT:自动生成高阶特征组合(替代人工特征工程)。
- LR:以 GBDT 的叶子节点输出为输入特征,输出最终 CTR。
2. 训练数据
假设我们有一个推荐场景,需要预测用户是否点击物品。收集到 8 条训练样本:
| 1 | 25 | 男 | 电子 | 1 |
| 2 | 30 | 女 | 服饰 | 1 |
| 3 | 25 | 女 | 电子 | 0 |
| 4 | 35 | 男 | 服饰 | 1 |
| 5 | 30 | 男 | 电子 | 1 |
| 6 | 25 | 女 | 服饰 | 0 |
| 7 | 35 | 女 | 电子 | 0 |
| 8 | 30 | 男 | 服饰 | 1 |
3. 第一步:训练 GBDT(生成特征组合)
3.1 第 1 棵树:寻找最优分裂特征
我们需要在"年龄"“性别”"物品类别"三个特征中,找到使基尼不纯度下降最多的分裂点。
回归用平方误差,分类用基尼不纯度
回归任务(预测年龄、y 值), 分类任务(预测点击/不点击)
平方误差(MSE, 残差的均值), 基尼不纯度 或 信息增益(多数类(分类)或类别概率)
根节点基尼不纯度:
- 正样本(点击=1):5 个,负样本(点击=0):3 个
- Gini根=1−(5/8)2−(3/8)2=1−0.3906−0.1406=0.4688Gini_{根} = 1 – (5/8)^2 – (3/8)^2 = 1 – 0.3906 – 0.1406 = 0.4688Gini根=1−(5/8)2−(3/8)2=1−0.3906−0.1406=0.4688
候选 1:按"性别"分裂:
| 男 | 1,4,5,8 | 4正/0负 | 1−(4/4)2−0=01-(4/4)^2-0=01−(4/4)2−0=0 |
| 女 | 2,3,6,7 | 1正/3负 | 1−(1/4)2−(3/4)2=0.3751-(1/4)^2-(3/4)^2=0.3751−(1/4)2−(3/4)2=0.375 |
加权基尼:48×0+48×0.375=0.1875\\frac{4}{8} \\times 0 + \\frac{4}{8} \\times 0.375 = 0.187584×0+84×0.375=0.1875
基尼下降:0.4688−0.1875=0.28130.4688 – 0.1875 = 0.28130.4688−0.1875=0.2813
候选 2:按"年龄 ≤ 27.5"分裂:
| 年龄≤27.5 | 1,3,6 | 1正/2负 | 1−(1/3)2−(2/3)2=0.4441-(1/3)^2-(2/3)^2=0.4441−(1/3)2−(2/3)2=0.444 |
| 年龄>27.5 | 2,4,5,7,8 | 4正/1负 | 1−(4/5)2−(1/5)2=0.321-(4/5)^2-(1/5)^2=0.321−(4/5)2−(1/5)2=0.32 |
加权基尼:38×0.444+58×0.32=0.3665\\frac{3}{8} \\times 0.444 + \\frac{5}{8} \\times 0.32 = 0.366583×0.444+85×0.32=0.3665
候选 3:按"物品类别"分裂:
| 电子 | 1,3,5,7 | 2正/2负 | 1−(2/4)2−(2/4)2=0.51-(2/4)^2-(2/4)^2=0.51−(2/4)2−(2/4)2=0.5 |
| 服饰 | 2,4,6,8 | 3正/1负 | 1−(3/4)2−(1/4)2=0.3751-(3/4)^2-(1/4)^2=0.3751−(3/4)2−(1/4)2=0.375 |
加权基尼:48×0.5+48×0.375=0.4375\\frac{4}{8} \\times 0.5 + \\frac{4}{8} \\times 0.375 = 0.437584×0.5+84×0.375=0.4375
对比结果:
| 性别 | 0.1875 | 0.2813 ✅ |
| 年龄 | 0.3665 | 0.1023 |
| 物品类别 | 0.4375 | 0.0313 |
结论:第 1 棵树选择 “性别” 作为分裂特征。
3.2 第 1 棵树的输出
[性别]
/
男 女
/
Leaf 1 Leaf 2
预测CTR=1.0 预测CTR=0.25
(4正/0负) (1正/3负)
- Leaf 1(男):预测点击率 = 4/4=1.04/4 = 1.04/4=1.0
- Leaf 2(女):预测点击率 = 1/4=0.251/4 = 0.251/4=0.25
3.3 计算残差(用于训练第 2 棵树)
残差 = 真实值 – 预测值:
| 1 | 男 | 1 | 1.0 | 0.0 |
| 2 | 女 | 1 | 0.25 | 0.75 |
| 3 | 女 | 0 | 0.25 | -0.25 |
| 4 | 男 | 1 | 1.0 | 0.0 |
| 5 | 男 | 1 | 1.0 | 0.0 |
| 6 | 女 | 0 | 0.25 | -0.25 |
| 7 | 女 | 0 | 0.25 | -0.25 |
| 8 | 男 | 1 | 1.0 | 0.0 |
3.4 第 2 棵树:拟合残差
用同样的方式,在"年龄"和"物品类别"中选择最优分裂。
按"年龄 ≤ 27.5"分裂残差:
| 年龄≤27.5 | 1,3,6 | 0, -0.25, -0.25 | -0.167 |
| 年龄>27.5 | 2,4,5,7,8 | 0.75, 0, 0, -0.25, 0 | 0.100 |
按"物品类别"分裂残差:
| 电子 | 1,3,5,7 | 0, -0.25, 0, -0.25 | -0.125 |
| 服饰 | 2,4,6,8 | 0.75, 0, -0.25, 0 | 0.125 |
计算两种分裂的误差平方和,选择较小的。为简化,假设"年龄"分裂更优。
3.5 第 2 棵树的输出
[年龄]
/
≤27.5 >27.5
/
Leaf 3 Leaf 4
预测值=-0.167 预测值=0.100
3.6 最终 GBDT 模型(2 棵树)
使用学习率 η=0.1\\eta = 0.1η=0.1,最终预测为:
y^=第1棵树+0.1×第2棵树
\\hat{y} = \\text{第1棵树} + 0.1 \\times \\text{第2棵树}
y^=第1棵树+0.1×第2棵树
4. 第二步:将 GBDT 输出转化为 LR 的输入特征
4.1 转换规则
对于每条样本:
- 在每棵树上从根节点走到叶子节点;
- 每个叶子节点对应一个 one-hot 编码;
- 将所有树的 one-hot 编码拼接,作为 LR 的输入特征。
本例中:
- 第 1 棵树有 2 个叶子 → 2 维 one-hot
- 第 2 棵树有 2 个叶子 → 2 维 one-hot
- 总特征维度 = 2+2=42 + 2 = 42+2=4 维
4.2 为每条样本生成特征向量
| Leaf 1 | 男 | 1, 4, 5, 8 | 4正/0负 | 4/4=1.04/4 = 1.04/4=1.0 |
| Leaf 2 | 女 | 2, 3, 6, 7 | 1正/3负 | 1/4=0.251/4 = 0.251/4=0.25 |
| Leaf 3 | 年龄≤27.5\\le 27.5≤27.5 | 1, 3, 6 | 0, -0.25, -0.25 | (−0.25−0.25)/3=−0.167(-0.25 – 0.25)/3 = -0.167(−0.25−0.25)/3=−0.167 |
| Leaf 4 | 年龄>27.5> 27.5>27.5 | 2, 4, 5, 7, 8 | 0.75, 0, 0, -0.25, 0 | 0.75/5=0.1000.75/5 = 0.1000.75/5=0.100 |
| 1 | 男 | 25 | Leaf 1 | Leaf 3 | [1, 0, 1, 0] |
| 2 | 女 | 30 | Leaf 2 | Leaf 4 | [0, 1, 0, 1] |
| 3 | 女 | 25 | Leaf 2 | Leaf 3 | [0, 1, 1, 0] |
| 4 | 男 | 35 | Leaf 1 | Leaf 4 | [1, 0, 0, 1] |
| 5 | 男 | 30 | Leaf 1 | Leaf 4 | [1, 0, 0, 1] |
| 6 | 女 | 25 | Leaf 2 | Leaf 3 | [0, 1, 1, 0] |
| 7 | 女 | 35 | Leaf 2 | Leaf 4 | [0, 1, 0, 1] |
| 8 | 男 | 30 | Leaf 1 | Leaf 4 | [1, 0, 0, 1] |
特征向量含义:
- 第 1 维:第 1 棵树 Leaf 1(男)
- 第 2 维:第 1 棵树 Leaf 2(女)
- 第 3 维:第 2 棵树 Leaf 3(年龄≤27.5)
- 第 4 维:第 2 棵树 Leaf 4(年龄>27.5)
5. 第三步:训练 LR 模型
5.1 LR 的预测公式
p^=σ(w⋅x+b)=11+e−(w⋅x+b)
\\hat{p} = \\sigma(w \\cdot x + b) = \\frac{1}{1 + e^{-(w \\cdot x + b)}}
p^=σ(w⋅x+b)=1+e−(w⋅x+b)1
其中 xxx 是 4 维特征向量,www 是 4 维权重向量,bbb 是偏置。
5.2 假设训练后的权重
经过梯度下降训练,假设 LR 学到的权重为:
w=[0.1, 0.9, 0.4, −0.2],b=−0.3
w = [0.1, \\ 0.9, \\ 0.4, \\ -0.2], \\quad b = -0.3
w=[0.1, 0.9, 0.4, −0.2],b=−0.3
权重的直觉解释:
- w1=0.1w_1 = 0.1w1=0.1:男性(Leaf 1)对点击影响较小
- w2=0.9w_2 = 0.9w2=0.9:女性(Leaf 2)对点击影响大(但方向为正,说明女性反而更容易点击?这里只是演示)
- w3=0.4w_3 = 0.4w3=0.4:年轻用户(Leaf 3)正向影响
- w4=−0.2w_4 = -0.2w4=−0.2:年长用户(Leaf 4)负向影响
实际中权重由数据学习得出,此处仅为演示。
5.3 LR 的权重 w 和偏置 b 是通过梯度下降最小化交叉熵损失
L=−1N∑i=1N[yilogp^i+(1−yi)log(1−p^i)]
L = -\\frac{1}{N} \\sum_{i=1}^{N} [y_i \\log \\hat{p}_i + (1 – y_i) \\log(1 – \\hat{p}_i)]
L=−N1i=1∑N[yilogp^i+(1−yi)log(1−p^i)]
其中 p^i=σ(w⋅xi+b)\\hat{p}_i = \\sigma(w \\cdot x_i + b)p^i=σ(w⋅xi+b)。
梯度更新公式:
wj←wj−η⋅1N∑i=1N(p^i−yi)⋅xi,j
w_j \\leftarrow w_j – \\eta \\cdot \\frac{1}{N} \\sum_{i=1}^{N} (\\hat{p}_i – y_i) \\cdot x_{i,j}
wj←wj−η⋅N1i=1∑N(p^i−yi)⋅xi,j
b←b−η⋅1N∑i=1N(p^i−yi)
b \\leftarrow b – \\eta \\cdot \\frac{1}{N} \\sum_{i=1}^{N} (\\hat{p}_i – y_i)
b←b−η⋅N1i=1∑N(p^i−yi)
5.4 例子
用 8 条样本,初始 w=[0,0,0,0],b=0w=[0,0,0,0],b=0w=[0,0,0,0],b=0,学习率 η=0.1η=0.1η=0.1,演示一次迭代。
样本 1:x=[1,0,1,0],y=1x=[1,0,1,0],y=1x=[1,0,1,0],y=1
预测值:p^=σ(0)=0.5\\hat{p} = \\sigma(0) = 0.5p^=σ(0)=0.5
误差:p^−y=0.5−1=−0.5\\hat{p} – y = 0.5 – 1 = -0.5p^−y=0.5−1=−0.5
梯度贡献:wj←wj−0.1×(−0.5)×xjw_j \\leftarrow w_j – 0.1 \\times (-0.5) \\times x_jwj←wj−0.1×(−0.5)×xj
w←[0,0,0,0]+0.05×[1,0,1,0]=[0.05,0,0.05,0]w \\leftarrow [0, 0, 0, 0] + 0.05 \\times [1, 0, 1, 0] = [0.05, 0, 0.05, 0]w←[0,0,0,0]+0.05×[1,0,1,0]=[0.05,0,0.05,0]
样本 2:x=[0,1,0,1],y=1x=[0,1,0,1],y=1x=[0,1,0,1],y=1
预测值:p^=σ(0.05×0+0×1+0.05×0+0×1)=σ(0)=0.5\\hat{p} = \\sigma\\left(0.05 \\times 0 + 0 \\times 1 + 0.05 \\times 0 + 0 \\times 1\\right) = \\sigma(0) = 0.5p^=σ(0.05×0+0×1+0.05×0+0×1)=σ(0)=0.5
误差:−0.5-0.5−0.5
w←[0.05,0,0.05,0]+0.05×[0,1,0,1]=[0.05,0.05,0.05,0.05]
w \\leftarrow [0.05, 0, 0.05, 0] + 0.05 \\times [0, 1, 0, 1] = [0.05, 0.05, 0.05, 0.05]
w←[0.05,0,0.05,0]+0.05×[0,1,0,1]=[0.05,0.05,0.05,0.05]
样本 3:x=[0,1,1,0],y=0x=[0,1,1,0],y=0x=[0,1,1,0],y=0
预测值:p^=σ(0.05×0+0.05×1+0.05×1+0.05×0)=σ(0.1)≈0.525\\hat{p} = \\sigma\\left(0.05 \\times 0 + 0.05 \\times 1 + 0.05 \\times 1 + 0.05 \\times 0\\right) = \\sigma(0.1) \\approx 0.525p^=σ(0.05×0+0.05×1+0.05×1+0.05×0)=σ(0.1)≈0.525
误差:0.525−0=0.5250.525 – 0 = 0.5250.525−0=0.525
w←[0.05,0.05,0.05,0.05]−0.1×0.525×[0,1,1,0]=[0.05, 0.05−0.0525, 0.05−0.0525, 0.05]=[0.05, −0.0025, −0.0025, 0.05]
\\begin{aligned}
w &\\leftarrow [0.05, 0.05, 0.05, 0.05] – 0.1 \\times 0.525 \\times [0, 1, 1, 0] \\\\
&= [0.05,\\ 0.05 – 0.0525,\\ 0.05 – 0.0525,\\ 0.05] = [0.05,\\ -0.0025,\\ -0.0025,\\ 0.05]
\\end{aligned}
w←[0.05,0.05,0.05,0.05]−0.1×0.525×[0,1,1,0]=[0.05, 0.05−0.0525, 0.05−0.0525, 0.05]=[0.05, −0.0025, −0.0025, 0.05]
样本 4:x=[1,0,0,1],y=1x=[1,0,0,1],y=1x=[1,0,0,1],y=1
预测值:p^=σ(0.05×1+(−0.0025)×0+(−0.0025)×0+0.05×1)=σ(0.1)≈0.525\\hat{p} = \\sigma(0.05 \\times 1 + (-0.0025) \\times 0 + (-0.0025) \\times 0 + 0.05 \\times 1) = \\sigma(0.1) \\approx 0.525p^=σ(0.05×1+(−0.0025)×0+(−0.0025)×0+0.05×1)=σ(0.1)≈0.525
误差:0.525−1=−0.4750.525 – 1 = -0.4750.525−1=−0.475
w←[0.05,−0.0025,−0.0025,0.05]+0.1×0.475×[1,0,0,1]w \\leftarrow [0.05, -0.0025, -0.0025, 0.05] + 0.1 \\times 0.475 \\times [1, 0, 0, 1]w←[0.05,−0.0025,−0.0025,0.05]+0.1×0.475×[1,0,0,1]
=[0.05+0.0475,−0.0025,−0.0025,0.05+0.0475]=[0.0975,−0.0025,−0.0025,0.0975]= [0.05 + 0.0475, -0.0025, -0.0025, 0.05 + 0.0475] = [0.0975, -0.0025, -0.0025, 0.0975]=[0.05+0.0475,−0.0025,−0.0025,0.05+0.0475]=[0.0975,−0.0025,−0.0025,0.0975]
继续迭代样本 5~8,经过数百轮后,权重会收敛到某个稳定值。
文档中给出的 [0.1,0.9,0.4,−0.2] 是一个可能的收敛结果示例
6. 第四步:预测新样本
6.1 新样本
假设来了一个新用户:男性,25 岁。
第一步:通过 GBDT 确定叶子节点
- 第 1 棵树:男性 → Leaf 1
- 第 2 棵树:年龄 25 ≤ 27.5 → Leaf 3
第二步:生成 LR 输入特征
x=[1, 0, 1, 0]
x = [1, \\ 0, \\ 1, \\ 0]
x=[1, 0, 1, 0]
第三步:LR 计算
z=w⋅x+b=0.1×1+0.9×0+0.4×1+(−0.2)×0+(−0.3)=0.1+0+0.4+0−0.3=0.2p^=σ(0.2)=11+e−0.2≈11+0.8187≈0.550
\\begin{aligned}
z &= w\\cdot x + b = 0.1 \\times 1 + 0.9 \\times 0 + 0.4 \\times 1 + (-0.2) \\times 0 + (-0.3) \\\\
&= 0.1 + 0 + 0.4 + 0 – 0.3 = 0.2 \\\\
\\hat{p} &= \\sigma(0.2) = \\frac{1}{1+e^{-0.2}} \\approx \\frac{1}{1+0.8187} \\approx 0.550
\\end{aligned}
zp^=w⋅x+b=0.1×1+0.9×0+0.4×1+(−0.2)×0+(−0.3)=0.1+0+0.4+0−0.3=0.2=σ(0.2)=1+e−0.21≈1+0.81871≈0.550
预测结果:该用户点击概率为 55.0%。
6.2 再预测一个样本:女性,30 岁
GBDT 路径:
- 第 1 棵树:女性 → Leaf 2
- 第 2 棵树:年龄 30 > 27.5 → Leaf 4
LR 输入特征:
x=[0, 1, 0, 1]
x = [0, \\ 1, \\ 0, \\ 1]
x=[0, 1, 0, 1]
LR 计算:
z=w⋅x+b=0.1×0+0.9×1+0.4×0+(−0.2)×1+(−0.3)=0+0.9+0−0.2−0.3=0.4p^=σ(0.4)=11+e−0.4≈11+0.6703≈0.599
\\begin{aligned}
z &= w\\cdot x + b = 0.1 \\times 0 + 0.9 \\times 1 + 0.4 \\times 0 + (-0.2) \\times 1 + (-0.3) \\\\
&= 0 + 0.9 + 0 – 0.2 – 0.3 = 0.4 \\\\
\\hat{p} &= \\sigma(0.4) = \\frac{1}{1+e^{-0.4}} \\approx \\frac{1}{1+0.6703} \\approx 0.599
\\end{aligned}
zp^=w⋅x+b=0.1×0+0.9×1+0.4×0+(−0.2)×1+(−0.3)=0+0.9+0−0.2−0.3=0.4=σ(0.4)=1+e−0.41≈1+0.67031≈0.599
预测结果:该用户点击概率为 59.9%。
7. 对比:如果只用 LR,不用 GBDT
如果直接拿原始特征(年龄、性别、类别)做 one-hot 后输入 LR:
- 性别:2 维 → [男, 女]
- 年龄:连续值,需要分桶 → 假设分 2 桶 → [≤27.5, >27.5]
- 类别:2 维 → [电子, 服饰]
总共 6 维特征。LR 只能学习线性加权,无法自动捕捉"男性 + 年轻"这种组合效应。
而 GBDT + LR 中:
- GBDT 自动发现了"性别"和"年龄"是最重要的分裂特征;
- 叶子节点编码了特征组合(如"男性 + 年轻"对应 Leaf 1 + Leaf 3);
- LR 只需在这些组合特征上学习线性权重,就能捕捉非线性关系。
8. 完整流程图
原始特征(年龄、性别、类别)
│
▼
┌─────────────────────────────────────┐
│ GBDT(N 棵树) │
│ 第1棵树:按性别分裂 → Leaf 1/2 │
│ 第2棵树:按年龄分裂 → Leaf 3/4 │
│ … │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ 叶子节点 one-hot 编码拼接 │
│ [0, 1, 1, 0](4维特征) │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ LR(逻辑回归) │
│ z = w·x + b │
│ p = sigmoid(z) │
└─────────────────────────────────────┘
│
▼
最终 CTR 预估值
9. 总结
| GBDT | 自动发现特征组合,生成高阶交叉特征 | 第 1 棵树发现"性别"最重要,第 2 棵树发现"年龄"最重要 |
| 叶子节点编码 | 将特征组合转化为 one-hot 向量 | 男性+年轻 → [1,0,1,0] |
| LR | 在组合特征上学习权重,输出最终 CTR | z=1.0z = 1.0z=1.0,p=55.0%p = 55.0\\%p=55.0% |
一句话记住 LR + GBDT:
GBDT 负责"找组合"(自动特征工程),LR 负责"给权重"(融合打分)。两者串联,既省去了人工特征工程的成本,又保留了 LR 可解释、易上线的优势,是工业界推荐系统融合阶段的经典方案。
网硕互联帮助中心



评论前必须登录!
注册