GBDT(Gradient Boosting Decision Tree )+LR(Logistic Regression)的应用

机器学习
新手专区
标签: #<Tag:0x00007f61db4edf10> #<Tag:0x00007f61db4eddd0>

(XiaoyuDu) #1

10分钟了解GBDT+LR模型的来龙去脉

Gradient Boosting Decision Tree + Logistic Regression
建模过程中,解释变量质量的好坏 / 特征的好坏决定了模型的效果的上限,数据的噪音过多也会让模型检验的结果严重失真,而GBDT+LR模型可以通过预先的特征处理来解决这一问题。

文章部分来源:企鹅号 - 万象信用

1、算法背景

2014年Facebook发表了一篇介绍将GBDT+LR模型用于其广告推荐系统的论文,之后,无论是Kaggle竞赛还是淘宝商品推荐,都有借鉴该论文中的GBDT+LR模型组合思想,即通过GBDT来发掘有区分度的特征和组合特征,来代替人工组合特征。

对于支撑互联网半壁江山的广告收入,推荐系统和CTR预估于其技术框架中占据重要地位,而LR模型则是其中最为常用的模型。

LR模型有以下特点:

1. 计算复杂度低;
2. 易于并行化处理;
3. 易于得到离散化目标值0或1,利用 sigmoid 函数将传统线性模型的输出值映射到(0,1)区间;
4. 学习能力限于线性特征,需要提前进行大量的特征工程得到有效的特征及特征组合。

输入LR模型的特征很重要,但是特征组合只能依靠人工经验。故如何自动化进行特征工程,规范化LR模型使用流程是一个值得研究的问题。

GBDT作为一种常用的树模型,可天然地对原始特征进行特征划分、特征组合和特征选择,并得到高阶特征属性和非线性映射。从而可将GBDT模型抽象为一个特征处理器,通过GBDT分析原始特征获取到更利于LR分析的新特征。这也正是GBDT+LR模型的核心思想——利用GBDT构造的新特征来训练LR模型。


我们需要补充两点:

1) GBDT作为一个树模型,其对特征的映射是非线性的,通过GBDT进行特征工程的结果将会隐含的包含原始特征的非线性关系特征。

2) 那么,如何通过GBDT进行特征选择呢? 用已有特征训练 GBDT 模型,然后利用 GBDT 模型学习到的树来构造新特征,最后把这些新特征加入原有特征一起训练模型。构造的新特征向量是取值 0/1 的,向量的每个元素对应于 GBDT 模型中树的 叶子结点 。当一个样本点通过某棵树最终落在这棵树的一个叶子结点上,那么在新特征向量中这个叶子结点对应的元素值为 1,而这棵树的其他叶子结点对应的元素值为 0。新特征向量的长度等于 GBDT 模型里所有树包含的叶子结点数之和。

核心思路就是将GBDT的叶子作为新的特征;


2、算法原理及实现

接下来更为详细地描述GBDT+LR模型的算法组合思想和简单实现流程。

2.1、算法组合——stacking

stacking方法有些类似于农业中的嫁接,

如上图所示,GBDT算法的图示部分形如一棵倒过来的树,其根部即代表训练GBDT算法的原始数据集,经过树算法对原始数据的切分,可得到代表不同新特征的叶子节点。

再将GBDT所得的叶子节点输入LR算法,经过线性分析和sigmoid映射,即可得到模型分类结果。

以上的模型组合方式就是stacking方法,即将学习层模型对原始数据所得的预测结果作为新的特征集,并输入给输出层模型得到分类结果。Facebook论文中的GBDT+LR模型就采用了GBDT算法作为学习层,以LR算法为输出层。

2.2、算法流程& 代码简单实现

在这一部分中,GBDT+LR算法的代码实现语言为python,使用了sklearn包中的GradientBoostingClassifier和LogisticRegression函数作为GBDT模型和LR模型。

将训练集记为 (X,y) ,其中X为原始特征,y为目标变量。

数据预处理

对变量取值中的中英文字符、缺失值和正负无穷值进行处理。

数据集划分

为了降低过拟合的风险,将训练集中的数据划分为两部分,

一部分数据用于训练GBDT模型,另一部分数据通过训练好

的GBDT模型得到新特征以训练LR模型。

fromsklearn.model import train_test_split

X_gbdt,X_lr,y_gbdt,y_lr= train_test_split(X,y,test_size=0.5)

GBDT特征转化

首先,通过sklearn中的GradientBoostingClassifier得到GBDT

模型,然后使用GBDT模型的fit方法训练模型,最后使用

GBDT模型的apply方法得到新特征。

fromsklearn.ensemble import GradientBoostingClassifier

gbdt = GradientBoostingClassifier()

gbdt.fit(X_gbdt,y_gbdt)

leaves = gbdt.apply(X_lr)[:,:,0]

特征独热化

使用sklearn.preprocessing中的OneHotEncoder将GBDT所得

特征独热化。

fromsklearn.preprocessing import OneHotEncoder

featutes_trans =OneHotEncoder.fit_transform(leaves)

LR进行分类

用经过离散化处理的新特征训练LR模型并得到预测结果。

fromsklearn.linear_model import LogisticRegression

lr= LogisticRegression()

lr.fit(features_trans,y_lr)

lr.predict(features_trans)

lr.predict_proba(features_trans)[:,1]

2.3、调参方法简述

构建了模型框架后,模型中的函数参数调整也是必不可少的。对模型参数的适当调整,往往可以有效提升模型的效果。

由于GBDT+LR模型无法整体使用GridSearchCV函数,所以调参时

使用sklearn.cross_validation中的StratifiedKFold方法,将数据集进行k折交叉切分,然后以auc值为模型评估指标,对混合模型进行调参。

调参时的重点为GradientBoostingClassifier函数,可用如下图所示的调参顺序进行调参。

其中,n_estimators和learning_rate应该联合调参。

3、算法引申

前面的内容描述了Facebook论文中GBDT+LR混合模型的算法原理并附有简单实现代码。然而,模型并不可孤立地比较好坏,模型的应用也要和应用场景及数据质量互相照应。

这一部分将会简单提供一些GBDT+LR混合模型的引申思路,希望对大家实际使用时有所裨益。

用FFM模型替代LR模型:

直接将GBDT所得特征输入FFM模型;

用XGBoost模型替代GBDT模型;

将stacking模型学习层中的GBDT交叉检验;

GBDT和LR模型使用model fusion,而不是stacking