一、概念
GBDT-LR模型由FaceBook(现在的Meta)团队于2014年在论文《Practial Lessons from Predicting Clicks on Ads at Facebook》中提出,目标是用于预测FaceBook的广告点击量(实际上广告和推荐领域很多算法模型都是共用的)。GBDT-LR模型结合了梯度提升决策树(Gradient Boosting Decision Tree,GBDT)和逻辑回归(Logistic Regression,LR)模型。它利用GBDT的强大特征提取能力和LR的高效分类能力,在推荐系统、点击率预估等领域发挥着重要作用。模型的基本思想是先用GBDT对数据进行特征提取,然后将提取的特征输入到LR模型中进行分类。
二、原理
1、GBDT部分
GBDT是一种集成学习方法,通过构建多个决策树来提升模型的预测性能。每棵树都是在前一棵树的残差基础上进行训练的,逐步减少预测误差。最终,GBDT会生成一组新的特征,这些特征是通过树的叶子节点编码得到的:
- 训练多棵CART回归树(通常为浅层树,深度3-5),每棵树拟合前一轮残差(负梯度方向)。
- 每棵树的叶子节点生成离散化特征(One-Hot编码),例如第k棵树的第m个叶子节点对应特征值为1,其余为0。
- 所有树的叶子节点特征拼接形成新特征向量(维度=树数量×每棵树叶子数)。
一般来说,GBDT部分的输入可以是各种能获取到的特征,如下:
- 用户特征:用户ID、历史行为(点击/购买/浏览)、人口属性(年龄/性别)、兴趣标签、实时行为序列
- 物品特征:物品ID、类别、标签、文本描述、热度值、上下文信息(发布时间/位置)
- 上下文特征:时间戳、设备类型、地理位置、网络环境
- 交互特征:用户与物品的交叉统计(如点击率、曝光转化率)
2、LR部分
逻辑回归是一种广泛使用的线性分类模型,适用于二分类问题。它通过学习特征与标签之间的线性关系来进行分类。将GBDT生成的特征向量输入逻辑回归模型,通过线性组合和Sigmoid函数计算概率:
基于上述结果,可预测用户对推荐物品的点击概率(CTR预估),输出值为0-1之间的概率值,用于排序阶段确定推荐优先级。
三、python实现
实际应用需根据具体任务调整GBDT模型的入参、LR模型的输入特征等内容。此外,这里的实现使用了lightGBM的GBDT,原因是lightGBM支持TB级大规模的数据处理和分布式训练,在内存占用和训练速度上也由于sklearn。
更重要的是,在GBDT-LR模型中,关键步骤是将GBDT的叶子节点索引进行one-hot编码后作为新特征输入到LR中。这里的核心要求是相同的输入样本在不同的树中对应的叶子节点索引应该是稳定且唯一的。而sklearn方法返回的是全局节点编号(所有树的节点统一编号),而不是每个树独立的叶子节点编号,这容易导致不同树的叶子节点可能被编码到相同的特征维度上,且当树的结构发生变化(如增加树的数量)时,节点编号可能会重排,导致模型不稳定。在lightGBM中,每个树的叶子节点编号是独立的,从而避免了特征冲突和编号不稳定的问题。
import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import OneHotEncoder
from sklearn.metrics import roc_auc_score
import lightgbm as lgb# 生成示例数据
def generate_sample_data():X, y = make_classification(n_samples=10000, n_features=50, n_informative=20, n_redundant=10,random_state=42)return X, y# 构建GBDT-LR模型
def gbdt_lr_model(X, y):# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# ------------------------# 第一步:训练GBDT模型# ------------------------gbdt = lgb.LGBMClassifier(num_leaves=31,learning_rate=0.05,n_estimators=100,objective='binary',random_state=42)gbdt.fit(X_train, y_train)# 第二步:使用GBDT生成新特征# 兼容旧版本LightGBM的写法X_train_gbdt = gbdt.predict(X_train, pred_leaf=True) # 得到叶子节点索引X_test_gbdt = gbdt.predict(X_test, pred_leaf=True)# 第三步:对叶子节点索引进行one-hot编码encoder = OneHotEncoder()X_train_transformed = encoder.fit_transform(X_train_gbdt)X_test_transformed = encoder.transform(X_test_gbdt)# 第四步:将原始特征与GBDT生成的特征拼接X_train_combined = np.hstack([X_train, X_train_transformed.toarray()])X_test_combined = np.hstack([X_test, X_test_transformed.toarray()])# ------------------------# 第五步:训练LR模型# ------------------------lr = LogisticRegression(penalty='l2',C=0.1,solver='lbfgs',max_iter=1000,random_state=42)lr.fit(X_train_combined, y_train)# 第六步:预测并评估y_pred_proba = lr.predict_proba(X_test_combined)[:, 1]auc = roc_auc_score(y_test, y_pred_proba)print(f"GBDT-LR模型的AUC: {auc:.4f}")# 为了对比,单独训练一个LR模型lr_only = LogisticRegression(penalty='l2',C=0.1,solver='lbfgs',max_iter=1000,random_state=42)lr_only.fit(X_train, y_train)y_pred_proba_lr_only = lr_only.predict_proba(X_test)[:, 1]auc_lr_only = roc_auc_score(y_test, y_pred_proba_lr_only)print(f"仅使用LR模型的AUC: {auc_lr_only:.4f}")return {'gbdt_model': gbdt,'lr_model': lr,'encoder': encoder,'auc': auc,'auc_lr_only': auc_lr_only} X, y = generate_sample_data()
model = gbdt_lr_model(X, y)
print('AUC: ', model['auc'])
四、应用场景
在推荐系统的各个模块中,GBDT-LR模型一般用于精排环节。通常使用它进行点击率(CTR)预估,从而对召回/粗排后的候选集(通常百至千级别)进行精准的打分排序,最后优先展示高CTR商品。
阶段 | 任务 | GBDT-LR适用性 | 解释 |
---|---|---|---|
召回 | 海量大数据候选集快速筛选->万级返回结果 | 否 | GBDT-LR需逐条计算点击率,效率不足 |
粗排 | 万级->千级候选集初步排序 | 否 | GBDT-LR需逐条计算点击率,效率不足 |
精排 | 千级->百级 | 是 | 需高精度CTR预估,计算量小 |
重排 | 业务规则调整最终排序 | 否 | 依赖规则 |