一、概念
? ? ? ? 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預估,計算量小 |
重排 | 業務規則調整最終排序 | 否 | 依賴規則 |
?