Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >推荐系统中传统模型——LightGBM + LR融合

推荐系统中传统模型——LightGBM + LR融合

作者头像
悟乙己
发布于 2021-12-07 06:28:31
发布于 2021-12-07 06:28:31
1.8K00
代码可运行
举报
文章被收录于专栏:素质云笔记素质云笔记
运行总次数:0
代码可运行

笔者最近再学习腾讯广告算法大赛,发现一些选择会用GBDT来进行“降维”与特征工程,有提分点,于是乎也来看看。之前的一篇跟LightGBM相关的文章:python - 机器学习lightgbm相关实践

这里可以直接跑通的github:wangru8080/gbdt-lr

1 GBDT + LR原理

参考:GBDT+LR算法解析及Python实现

1.1 CTR常见流程

GBDT+LR 使用最广泛的场景是CTR点击率预估,即预测当给用户推送的广告会不会被用户点击。

点击率预估模型涉及的训练样本一般是上亿级别,样本量大,模型常采用速度较快的LR。但LR是线性模型,学习能力有限,此时特征工程尤其重要。现有的特征工程实验,主要集中在寻找到有区分度的特征、特征组合,折腾一圈未必会带来效果提升。GBDT算法的特点正好可以用来发掘有区分度的特征、特征组合,减少特征工程中人力成本。

从知乎https://zhuanlan.zhihu.com/p/29053940上看到了一个关于CTR的流程,如下图所示:

如上图,主要包括两大部分:离线部分、在线部分,其中离线部分目标主要是训练出可用模型,而在线部分则考虑模型上线后,性能可能随时间而出现下降,弱出现这种情况,可选择使用Online-Learning来在线更新模型.

1.2 RF/GBDT哪个更适合

RF也是多棵树,但从效果上有实践证明不如GBDT。且GBDT前面的树,特征分裂主要体现对多数样本有区分度的特征;后面的树,主要体现的是经过前N颗树,残差仍然较大的少数样本。优先选用在整体上有区分度的特征,再选用针对少数样本有区分度的特征,思路更加合理,这应该也是用GBDT的原因。

1.3 GBDT + LR比 FM进步在哪?

(读论文)推荐系统之ctr预估-LR与GBDT+LR模型解析

特征交叉而提出的FM和FFM虽然能够较好地解决数据稀疏性的问题,但他们仍停留在二阶交叉的情况。

Facebook提出了一种利用GBDT(Gradient Boosting Decision Tree)自动进行特征筛选和组合,进而生成新的离散特征向量,再把该特征向量当作LR模型输入,预估CTR的模型结构。

由于决策树的结构特点,事实上,决策树的深度就决定了特征交叉的维度。如果决策树的深度为4,通过三次节点分裂,最终的叶节点实际上是进行了3阶特征组合后的结果,如此强的特征组合能力显然是FM系的模型不具备的。但由于GBDT容易产生过拟合,以及GBDT这种特征转换方式实际上丢失了大量特征的数值信息,因此我们不能简单说GBDT由于特征交叉的能力更强,效果就比FM或FFM好(事实上FFM是2015年提出的)。在模型的选择和调试上,永远都是多种因素综合作用的结果。

GBDT+LR比FM重要的意义在于,它大大推进了特征工程模型化这一重要趋势,某种意义上来说,之后深度学习的各类网络结构,以及embedding技术的应用,都是这一趋势的延续。

1.3 树模型对稀疏离散特征,处理较差

参考:

GBDT只是对历史的一个记忆罢了,没有推广性,或者说泛化能力。

但这并不是说对于大规模的离散特征,GBDT和LR的方案不再适用,感兴趣的话大家可以看一下参考文献2和3,这里就不再介绍了。

2 LightGBM + LR融合案例

一段核心代码,整体流程为:

源数据 -> 标准化 -> 训练LGM模型 -> 预测训练集+验证集的每个样本落在每棵树的哪个节点上 -> LGB的节点特征合并成为新的训练集/验证集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def gbdt_ffm_predict(data, category_feature, continuous_feature):
    # 离散特征one-hot编码
    print('开始one-hot...')
    for col in category_feature:
        onehot_feats = pd.get_dummies(data[col], prefix = col)
        data = pd.concat([data, onehot_feats], axis = 1)
    print('one-hot结束')
    

    feats = [col for col in data if col not in category_feature] # onehot_feats + continuous_feature
    tmp = data[feats]
    train = tmp[tmp['Label'] != -1]
    target = train.pop('Label')
    test = tmp[tmp['Label'] == -1]
    test.drop(['Label'], axis = 1, inplace = True)
    
    # 划分数据集
    print('划分数据集...')
    x_train, x_val, y_train, y_val = train_test_split(train, target, test_size = 0.2, random_state = 2018)

    print('开始训练gbdt..')
    gbm = lgb.LGBMRegressor(objective='binary',
                            subsample= 0.8,
                            min_child_weight= 0.5,
                            colsample_bytree= 0.7,
                            num_leaves=100,
                            max_depth = 12,
                            learning_rate=0.05,
                            n_estimators=10,
                            )

    gbm.fit(x_train, y_train,
            eval_set = [(x_train, y_train), (x_val, y_val)],
            eval_names = ['train', 'val'],
            eval_metric = 'binary_logloss',
            # early_stopping_rounds = 100,
            )
    model = gbm.booster_
    print('训练得到叶子数')
    gbdt_feats_train = model.predict(train, pred_leaf = True)  # 获得训练集的各颗树的节点数(10棵树,每棵树100个叶子节点)
    train.shape,gbdt_feats_train.shape  # ((1599, 13104), (1599, 10))13104维度 降维到10维

    gbdt_feats_test = model.predict(test, pred_leaf = True)    # 获得验证集的各颗树的节点数(10棵树,每棵树100个叶子节点)
    gbdt_feats_name = ['gbdt_leaf_' + str(i) for i in range(gbdt_feats_train.shape[1])]
    df_train_gbdt_feats = pd.DataFrame(gbdt_feats_train, columns = gbdt_feats_name) 
    df_test_gbdt_feats = pd.DataFrame(gbdt_feats_test, columns = gbdt_feats_name)

    print('构造新的数据集...')
    tmp = data[category_feature + continuous_feature + ['Label']]
    train = tmp[tmp['Label'] != -1]
    test = tmp[tmp['Label'] == -1]
    train = pd.concat([train, df_train_gbdt_feats], axis = 1)
    test = pd.concat([test, df_test_gbdt_feats], axis = 1)
    data = pd.concat([train, test])
    del train
    del test
    gc.collect()

    # 连续特征归一化
    print('开始归一化...')
    scaler = MinMaxScaler()
    for col in continuous_feature:
        data[col] = scaler.fit_transform(data[col].values.reshape(-1, 1))
    print('归一化结束')

    data.to_csv('data/data.csv', index = False)
    return category_feature + gbdt_feats_name

先来看一下LGBMClassifier,参考:lightgbm.LGBMClassifier 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
classlightgbm.LGBMClassifier(boosting_type='gbdt', num_leaves=31, max_depth=- 1, learning_rate=0.1, n_estimators=100, subsample_for_bin=200000, objective=None, class_weight=None, min_split_gain=0.0, min_child_weight=0.001, min_child_samples=20, subsample=1.0, subsample_freq=0, colsample_bytree=1.0, reg_alpha=0.0, reg_lambda=0.0, random_state=None, n_jobs=- 1, silent=True, importance_type='split', **kwargs)

其中:

  • n_estimators - 树的棵树,相当于主成分,多少个主成分一样
  • num_leaves,叶子节点
  • max_depth (int, optional (default=-1)) – Maximum tree depth for base learners,树的深度

model.predict(train, pred_leaf = True)这里通过pred_leaf(pred_leaf (bool, optional (default=False)) – Whether to predict leaf index.)就可以预测每个样本在叶子节点的位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train.shape,gbdt_feats_train.shape  
# ((1599, 13104), (1599, 10))  

gbdt_feats_train
>>> array([[ 2,  9,  3, ...,  2, 14,  4],
		       [ 1,  8,  1, ..., 20, 16,  1],
		       [18, 35, 39, ..., 38, 24, 29],
		       ...,
		       [44, 18, 13, ...,  8, 17, 23],
		       [23, 20, 17, ...,  4,  0, 30],
		       [20, 24,  0, ..., 28, 22, 36]])

从13104维度 降维到10维(树的棵树),然后每个样本标记的,在10棵树的叶子位置(每个样本(1599)在10颗树的叶子(100片叶子)节点的编号)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/12/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
推荐系统遇上深度学习(十)--GBDT+LR融合方案实战
GBDT和LR的融合在广告点击率预估中算是发展比较早的算法,为什么会在这里写这么一篇呢?本来想尝试写一下阿里的深度兴趣网络(Deep Interest Network),发现阿里之前还有一个算法MLR,然后去查找相关的资料,里面提及了树模型也就是GBDT+LR方案的缺点,恰好之前也不太清楚GBDT+LR到底是怎么做的,所以今天我们先来了解一下GBDT和LR的融合方案。
石晓文
2018/07/25
1.5K0
推荐系统遇上深度学习(十)--GBDT+LR融合方案实战
GBDT+LR算法解析及Python实现
参考:https://www.cnblogs.com/wkang/p/9657032.html
Python数据科学
2019/10/23
8150
推荐系统中传统模型——LightGBM + FFM融合
FM和FFM模型是最近几年提出的模型,凭借其在数据量比较大并且特征稀疏的情况下,仍然能够得到优秀的性能和效果的特性,屡次在各大公司举办的CTR预估比赛中获得不错的战绩。美团技术团队在搭建DSP的过程中,探索并使用了FM和FFM模型进行CTR和CVR预估,并且取得了不错的效果。
悟乙己
2021/12/07
6300
CTR预估中GBDT与LR融合方案
1背景 CTR预估,广告点击率(Click-Through Rate Prediction)是互联网计算广告中的关键环节,预估准确性直接影响公司广告收入。CTR预估中用的最多的模型是LR(Logistic Regression) [1],LR是广义线性模型,与传统线性模型相比,LR使用了Logit变换将函数值映射到0~1区间 [2],映射后的函数值就是CTR的预估值。 LR,逻辑回归模型,这种线性模型很容易并行化,处理上亿条训练样本不是问题,但线性模型学习能力有限,需要大量特征工程预先分析出有效的特征、特
腾讯大数据
2018/01/26
2.4K0
【机器学习】随机森林、GBDT、XGBoost、LightGBM等集成学习代码练习
对比了六大模型,可以看出,逻辑回归速度最快,但准确率最低。而LightGBM,速度快,而且准确率最高,所以,现在处理结构化数据的时候,大部分都是用LightGBM算法。
黄博的机器学习圈子
2023/01/10
1.1K0
2018科大讯飞AI营销算法大赛总结及完整代码(冠军)
bettenW/2018-iFLYTEK-Marketing-Algorithms-Competition-Finals-Rank1​github.com
Coggle数据科学
2019/09/12
2.3K0
2018科大讯飞AI营销算法大赛总结及完整代码(冠军)
GBDT+LR算法解析及Python实现
本质上GBDT+LR是一种具有stacking思想的二分类器模型,所以可以用来解决二分类问题。这个方法出自于Facebook 2014年的论文 Practical Lessons from Predicting Clicks on Ads at Facebook 。
机器学习AI算法工程
2019/10/29
1.4K0
GBDT+LR算法解析及Python实现
GBDT原理及利用GBDT构造新的特征-Python实现
Gradient Boosting是一种Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向。损失函数是评价模型性能(一般为拟合程度+正则项),认为损失函数越小,性能越好。而让损失函数持续下降,就能使得模型不断改性提升性能,其最好的方法就是使损失函数沿着梯度方向下降(讲道理梯度方向上下降最快)。
百川AI
2021/10/19
8010
【白话机器学习】算法理论+实战之LightGBM算法
如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法:
石晓文
2020/06/28
7.2K0
逻辑回归 + GBDT模型融合实战!
协同过滤和矩阵分解存在的劣势就是仅利用了用户与物品相互行为信息进行推荐, 忽视了用户自身特征, 物品自身特征以及上下文信息等,导致生成的结果往往会比较片面。而这次介绍的这个模型是2014年由Facebook提出的GBDT+LR模型, 该模型利用GBDT自动进行特征筛选和组合, 进而生成新的离散特征向量, 再把该特征向量当做LR模型的输入, 来产生最后的预测结果, 该模型能够综合利用用户、物品和上下文等多种不同的特征, 生成较为全面的推荐结果, 在CTR点击率预估场景下使用较为广泛。
Datawhale
2020/12/18
1.6K0
Kaggle&TianChi分类问题相关算法快速实现导读理论解析如何设计一个Stacking|Ensemble的模型?案例复现
17/12/30-update :很多朋友私密我想要代码,甚至利用金钱诱惑我,好吧,我沦陷了。因为原始代码涉及到公司的特征工程及一些利益trick,所以我构造了一个数据集后复现了部分算法流程,需要看详细代码实现朋友可以移步Ensemble_Github
sladesal
2018/08/27
7530
Kaggle&TianChi分类问题相关算法快速实现导读理论解析如何设计一个Stacking|Ensemble的模型?案例复现
【技术分享】推荐系统中的自动化特征工程
在机器学习的各个子领域中,特征工程都扮演着重要的角色。业界有这么一句话,数据和特征决定了机器学习算法的上限,而模型、算法的选择和优化只是在不断逼近这个上限。通过运用领域知识,在原始数据集中构造解释变量,有利于机器学习模型预测目标。传统的特征工程方法是运用与问题相关的领域专业知识,从数据集中提取特征。我们称之为手动特征工程,手动特征工程的缺点在于繁琐耗时,对于不同的问题需要重新开始,过于依赖人的经验与判断。因此,研发自动特征工程就尤为重要。
腾讯云TI平台
2020/06/10
3.1K0
特征工程系列:GBDT特征构造以及聚类特征构造
关于作者:JunLiang,一个热爱挖掘的数据从业者,勤学好问、动手达人,期待与大家一起交流探讨机器学习相关内容~
木东居士
2019/10/30
2K0
特征工程系列:GBDT特征构造以及聚类特征构造
最全推荐系统传统算法合集
我花了半个多月将推荐系统传统算法分别进行了总结归纳,应该时目前全网最全的版本了。希望对大家了解推荐系统传统算法有所帮助。
张小磊
2022/02/28
1.2K0
最全推荐系统传统算法合集
XGBOOST + LR 模型融合 python 代码
先留个广告,最近做一个数据挖掘的比赛,主要用的就是 xgboost,等比赛完后年前好好整理代码开源,到时候代码会比下面整份完整。
全栈程序员站长
2022/11/19
1.2K0
XGBOOST + LR 模型融合 python 代码
推荐系统遇上深度学习(十七)--探秘阿里之MLR算法浅析及实现
阿里近几年公开的推荐领域算法可真不少,既有传统领域的探索如MLR算法,还有深度学习领域的探索如entire -space multi-task model,Deep Interest Network等,同时跟清华大学合作展开了强化学习领域的探索,提出了MARDPG算法。从本篇开始,我们就一起来探秘这些算法。这里,我们只是大体了解一下每一个算法的思路,对于数学部分的介绍,我们不会过多的涉及。
石晓文
2018/07/25
1.4K0
推荐系统遇上深度学习(十七)--探秘阿里之MLR算法浅析及实现
XGBoost和LightGBM
这两个模型都属于集成学习中的树模型,每个机器学习模型都有它特定的应用场景,不同的数据集适合用到的模型是不一样的。
算法之名
2021/10/09
1.3K0
XGBoost和LightGBM
GBDT+LR:Practical Lessons from Predicting Clicks on Ads
本文主要介绍Facebook提出的CTR预估模型LR(Logistic Regression)+GBDT。当时深度学习还没有应用到计算广告领域,Facebook提出利用GBDT的叶节点编号作为非线性特征的表示,或者说是组合特征的一种方式。
用户3578099
2020/09/29
1.4K0
GBDT+LR:Practical Lessons from Predicting Clicks on Ads
机器学习LightGBM实战+随机搜索调参:准确率96.67%
今天给大家分享一下树模型的经典算法:LightGBM,介绍算法产生的背景、原理和特点,最后提供一个基于LightGBM和随机搜索调优的案例。
皮大大
2024/06/04
1.8K0
利用GBDT构造新的特征-Python实现
GBDT分类:每一颗树拟合当前整个模型的损失函数的负梯度,构建新的树加到当前模型中形成新模型,下一棵树拟合新模型的损失函数的负梯度。下面是其在Python的sklearn包下简单调用方法。
机器学习AI算法工程
2019/10/28
1.1K0
利用GBDT构造新的特征-Python实现
推荐阅读
相关推荐
推荐系统遇上深度学习(十)--GBDT+LR融合方案实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验