0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

了解一下GBDT和LR的融合方案

电子工程师 来源:lp 2019-03-28 10:15 次阅读

写在前面的话

GBDT和LR的融合在广告点击率预估中算是发展比较早的算法,为什么会在这里写这么一篇呢?本来想尝试写一下阿里的深度兴趣网络(Deep Interest Network),发现阿里之前还有一个算法MLR,然后去查找相关的资料,里面提及了树模型也就是GBDT+LR方案的缺点,恰好之前也不太清楚GBDT+LR到底是怎么做的,所以今天我们先来了解一下GBDT和LR的融合方案。

在CTR预估问题的发展初期,使用最多的方法就是逻辑回归(LR),LR使用了Sigmoid变换将函数值映射到0~1区间,映射后的函数值就是CTR的预估值。

LR属于线性模型,容易并行化,可以轻松处理上亿条数据,但是学习能力十分有限,需要大量的特征工程来增加模型的学习能力。但大量的特征工程耗时耗力同时并不一定会带来效果提升。因此,如何自动发现有效的特征、特征组合,弥补人工经验不足,缩短LR特征实验周期,是亟需解决的问题。

FM模型通过隐变量的方式,发现两两特征之间的组合关系,但这种特征组合仅限于两两特征之间,后来发展出来了使用深度神经网络去挖掘更高层次的特征组合关系。但其实在使用神经网络之前,GBDT也是一种经常用来发现特征组合的有效思路。

Facebook 2014年的文章介绍了通过GBDT解决LR的特征组合问题,随后Kaggle竞赛也有实践此思路,GBDT与LR融合开始引起了业界关注。

在介绍这个模型之前,我们先来介绍两个问题:

1)为什么要使用集成的决策树模型,而不是单棵的决策树模型:一棵树的表达能力很弱,不足以表达多个有区分性的特征组合,多棵树的表达能力更强一些。可以更好的发现有效的特征和特征组合

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

了解了为什么要用GBDT,我们就来看看到底二者是怎么融合的吧!

GBDT和LR的融合方案,FaceBook的paper中有个例子:

图中共有两棵树,x为一条输入样本,遍历两棵树后,x样本分别落到两颗树的叶子节点上,每个叶子节点对应LR一维特征,那么通过遍历树,就得到了该样本对应的所有LR特征。构造的新特征向量是取值0/1的。举例来说:上图有两棵树,左树有三个叶子节点,右树有两个叶子节点,最终的特征即为五维的向量。对于输入x,假设他落在左树第一个节点,编码[1,0,0],落在右树第二个节点则编码[0,1],所以整体的编码为[1,0,0,0,1],这类编码作为特征,输入到LR中进行分类。

这个方案还是很简单的吧,在继续介绍下去之前,我们先介绍一下代码实践部分。

本文介绍的代码只是一个简单的Demo,实际中大家需要根据自己的需要进行参照或者修改。

github地址:https://github.com/princewen/tensorflow_practice/tree/master/recommendation/GBDT%2BLR-Demo

训练GBDT模型本文使用lightgbm包来训练我们的GBDT模型,训练共100棵树,每棵树有64个叶子结点。

df_train=pd.read_csv('data/train.csv')df_test=pd.read_csv('data/test.csv')NUMERIC_COLS=["ps_reg_01","ps_reg_02","ps_reg_03","ps_car_12","ps_car_13","ps_car_14","ps_car_15",]print(df_test.head(10))y_train=df_train['target']#traininglabely_test=df_test['target']#testinglabelX_train=df_train[NUMERIC_COLS]#trainingdatasetX_test=df_test[NUMERIC_COLS]#testingdataset#createdatasetforlightgbmlgb_train=lgb.Dataset(X_train,y_train)lgb_eval=lgb.Dataset(X_test,y_test,reference=lgb_train)params={'task':'train','boosting_type':'gbdt','objective':'binary','metric':{'binary_logloss'},'num_leaves':64,'num_trees':100,'learning_rate':0.01,'feature_fraction':0.9,'bagging_fraction':0.8,'bagging_freq':5,'verbose':0}#numberofleaves,willbeusedinfeaturetransformationnum_leaf=64print('Starttraining...')#traingbm=lgb.train(params,lgb_train,num_boost_round=100,valid_sets=lgb_train)print('Savemodel...')#savemodeltofilegbm.save_model('model.txt')print('Startpredicting...')#predictandgetdataonleaves,trainingdata

特征转换

在训练得到100棵树之后,我们需要得到的不是GBDT的预测结果,而是每一条训练数据落在了每棵树的哪个叶子结点上,因此需要使用下面的语句:

y_pred=gbm.predict(X_train,pred_leaf=True)

打印上面结果的输出,可以看到shape是(8001,100),即训练数据量*树的棵树

结果为:

print(np.array(y_pred).shape)print(y_pred[0])

然后我们需要将每棵树的特征进行one-hot处理,如前面所说,假设第一棵树落在43号叶子结点上,那我们需要建立一个64维的向量,除43维之外全部都是0。因此用于LR训练的特征维数共num_trees * num_leaves。

print('Writingtransformedtrainingdata')transformed_training_matrix=np.zeros([len(y_pred),len(y_pred[0])*num_leaf],dtype=np.int64)#N*num_tress*num_leafsforiinrange(0,len(y_pred)):temp=np.arange(len(y_pred[0]))*num_leaf+np.array(y_pred[I])transformed_training_matrix[i][temp]+=1

当然,对于测试集也要进行同样的处理:

y_pred=gbm.predict(X_test,pred_leaf=True)print('Writingtransformedtestingdata')transformed_testing_matrix=np.zeros([len(y_pred),len(y_pred[0])*num_leaf],dtype=np.int64)foriinrange(0,len(y_pred)):temp=np.arange(len(y_pred[0]))*num_leaf+np.array(y_pred[I])transformed_testing_matrix[i][temp]+=1

LR训练然后我们可以用转换后的训练集特征和label训练我们的LR模型,并对测试集进行测试:

lm=LogisticRegression(penalty='l2',C=0.05)#logesticmodelconstructionlm.fit(transformed_training_matrix,y_train)#fittingthedatay_pred_test=lm.predict_proba(transformed_testing_matrix)#Givetheprobabiltyoneachlabel

我们这里得到的不是简单的类别,而是每个类别的概率。

效果评价在Facebook的paper中,模型使用NE(Normalized Cross-Entropy),进行评价,计算公式如下:

代码如下:

NE=(-1)/len(y_pred_test)*sum(((1+y_test)/2*np.log(y_pred_test[:,1])+(1-y_test)/2*np.log(1-y_pred_test[:,1])))print("NormalizedCrossEntropy"+str(NE))

现在的GBDT和LR的融合方案真的适合现在的大多数业务数据么?现在的业务数据是什么?是大量离散特征导致的高维度离散数据。而树模型对这样的离散特征,是不能很好处理的,要说为什么,因为这容易导致过拟合。下面的一段话来自知乎:

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

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

刚才提到了阿里的盖坤大神,他的团队在2017年提出了两个重要的用于CTR预估的模型,MLR和DIN,之后的系列中,我们会讲解这两种模型的理论和实战!欢迎大家继续关注!

1、Facebook的paper:http://quinonero.net/Publications/predicting-clicks-facebook.pdf2、http://www.cbdio.com/BigData/2015-08/27/content_3750170.htm3、https://blog.csdn.net/shine19930820/article/details/717136804、https://www.zhihu.com/question/358215665、https://github.com/neal668/LightGBM-GBDT-LR/blob/master/GBFT%2BLR_simple.py

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4575

    浏览量

    98764
  • LR
    LR
    +关注

    关注

    1

    文章

    8

    浏览量

    9975
  • GBDT
    +关注

    关注

    0

    文章

    13

    浏览量

    3852

原文标题:推荐系统遇上深度学习(十)--GBDT+LR融合方案实战

文章出处:【微信号:atleadai,微信公众号:LeadAI OpenLab】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于IC烧录!了解的给我讲一下

    本帖最后由 chenlindz 于 2013-9-24 18:52 编辑 本人在这方面不专业,像大神了解一下。不同的IC用相同的软体烧录,它的checksum是否样。不同的软体用相同的IC烧录,它的checksum是否
    发表于 09-24 18:51

    今天粗略的了解一下中断程序,感兴趣的可以互相交流一下

    今天粗略的了解一下中断程序,感兴趣的可以互相交流一下
    发表于 08-03 09:42

    【CANNON试用体验】+了解一下新的工具stm32 cube mx

    这周直比较忙,直没有好好的分析好代码,不过看了一下这个代码,因为跟之前的不太样就了解一下
    发表于 03-06 20:23

    GBDT算法原理和模型训练

    算法原理再讲GBDT之前先给大家讲个故事,有个年轻的阿姨今年50岁,现在我们不知道她的真实年龄,我们想通过他的皮肤、穿着打扮、头发颜色、言行举止、面部特征来推测她的真实年龄,假如我们根据这些输入
    发表于 01-23 14:38

    了解一下,这个电路具体的走向?

    `我想了解一下,这个电路具体的走向。`
    发表于 11-26 19:04

    了解一下什么是看门狗

    首先,我们需要先要了解一下什么是看门狗?-在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界的各种干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法
    发表于 08-02 06:25

    了解一下Markdown的基本语法知识

    目录你好! 这是你第次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。硬件本次调试使用...
    发表于 08-04 08:26

    了解一下STM32的时钟树

    的时钟频率又是如何确定的呢?带着这个问题,我们起详细了解一下STM32的时钟树。时钟树是了解STM32时钟的灵魂,ST...
    发表于 08-06 07:11

    了解一下DMX512的基本协议

    首先基本了解一下DMX512的基本协议、DMX512协议DMX 是Digital MultipleX 的缩写,意为多路数字传输。DMX512控制协议是美国舞台灯光协会(usITT)于1990年发布
    发表于 11-30 06:03

    简单了解一下各种电源端口的命名

    了解电源之前,先来简单了解一下各种电源端口的命名VCC:C=circuit表示电路的意思,即接入电路的电压。VDD:D=device表示器件的意思,即器件内部的工作电压。VSS:S=series表示
    发表于 12-27 07:15

    GBDT算法原理以及实例理解

    GBDT 的全称是 Gradient Boosting Decision Tree,梯度提升树,在传统机器学习算法中,GBDT算的上TOP3的算法。
    的头像 发表于 04-28 16:47 2.8w次阅读
    <b class='flag-5'>GBDT</b>算法原理以及实例理解

    XGBoost原理概述 XGBoost和GBDT的区别

    相比于经典的GBDT,xgboost做了一些改进,从而在效果和性能上有明显的提升。
    的头像 发表于 07-16 18:54 7.8w次阅读
    XGBoost原理概述 XGBoost和<b class='flag-5'>GBDT</b>的区别

    逻辑回归与GBDT模型各自的原理及优缺点

    一、GBDT+LR简介 协同过滤和矩阵分解存在的劣势就是仅利用了用户与物品相互行为信息进行推荐, 忽视了用户自身特征, 物品自身特征以及上下文信息等,导致生成的结果往往会比较片面。而这次介绍的这个
    的头像 发表于 12-26 10:01 1.1w次阅读
    逻辑回归与<b class='flag-5'>GBDT</b>模型各自的原理及优缺点

    GBDT是如何用于分类的

    ❝ 因为用树模型太习以为常了,以至于看到这个标题很容易觉得这很显然。但越简单的东西越容易出现知识盲区,仔细想一下好像确实有点疑问:GBDT 用的是回归树,是如何做的分类呢? - 作者:1直在路上
    的头像 发表于 12-26 10:30 2817次阅读
    <b class='flag-5'>GBDT</b>是如何用于分类的

    大哥!100W移动电源方案了解一下

    100W移动电源方案了解一下
    的头像 发表于 06-02 19:03 1694次阅读
    大哥!100W移动电源<b class='flag-5'>方案</b>,<b class='flag-5'>了解</b><b class='flag-5'>一下</b>