利用GBDT模型构造新特征具体方法

实际问题中,可直接用于机器学习模型的特征往往并不多。能否从“混乱”的原始log中挖掘到有用的特征,将会决定机器学习模型效果的好坏。引用下面一句流行的话:

特征决定了所有算法效果的上限,而不同的算法只是离这个上限的距离不同而已。

本文中我将介绍Facebook最近发表的利用GBDT模型构造新特征的方法。

(Xinran He et al. Practical Lessons from Predicting Clicks on Ads at Facebook, 2014)

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

举例说明。下面的图中的两棵树是GBDT学习到的,第一棵树有3个叶子结点,而第二棵树有2个叶子节点。对于一个输入样本点x,如果它在第一棵树最后落在其中的第二个叶子结点,而在第二棵树里最后落在其中的第一个叶子结点。那么通过GBDT获得的新特征向量为[0, 1, 0, 1, 0],其中向量中的前三位对应第一棵树的3个叶子结点,后两位对应第二棵树的2个叶子结点。

那么,GBDT中需要多少棵树能达到效果最好呢?具体数字显然是依赖于你的应用以及你拥有的数据量。一般数据量较少时,树太多会导致过拟合。在作者的应用中,大概500棵左右效果就基本不改进了。另外,作者在建GBDT时也会对每棵树的叶子结点数做约束——不多于12个叶子结点。

下面是这种方法在我们世纪佳缘的一个概率预测问题上的实际效果。我们只使用了30棵树。第一个图是只使用原始特征的结果,第二个图是原始特征加GBDT新特征的结果。图中横坐标表示预测概率值,纵坐标表示真实概率值。所以预测的点越靠近y=xy=x这条参考线越好。显然,使用了GBDT构造的新特征后,模型的预测效果好不少。

已经有人利用这种方法赢得了Kaggle一个CTR预估比赛的冠军,这种方法的具体实现代码可见 https://github.com/guestwalk/kaggle-2014-criteo


原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2016-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏MelonTeam专栏

ArrayList源码完全分析

导语: 这里分析的ArrayList是使用的JDK1.8里面的类,AndroidSDK里面的ArrayList基本和这个一样。 分析的方式是逐个API进行解析 ...

4519
来自专栏Hongten

ArrayList VS Vector(ArrayList和Vector的区别)_面试的时候经常出现

1762
来自专栏xingoo, 一个梦想做发明家的程序员

Spark踩坑——java.lang.AbstractMethodError

百度了一下说是版本不一致导致的。于是重新检查各个jar包,发现spark-sql-kafka的版本是2.2,而spark的版本是2.3,修改spark-sql-...

1210
来自专栏刘君君

JDK8的HashMap源码学习笔记

3068
来自专栏拭心的安卓进阶之路

Java 集合深入理解(6):AbstractList

今天心情比天蓝,来学学 AbstractList 吧! ? 什么是 AbstractList ? AbstractList 继承自 AbstractCollec...

19210
来自专栏开发与安全

算法:AOV网(Activity on Vextex Network)与拓扑排序

在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity on Vextex ...

2607
来自专栏聊聊技术

原 初学图论-Kahn拓扑排序算法(Kah

2878
来自专栏java闲聊

JDK1.8 ArrayList 源码解析

当运行 ArrayList<Integer> list = new ArrayList<>() ; ,因为它没有指定初始容量,所以它调用的是它的无参构造

1192
来自专栏Java Edge

AbstractList源码解析1 实现的方法2 两种内部迭代器3 两种内部类3 SubList 源码分析4 RandomAccessSubList 源码:AbstractList 作为 Lis

它实现了 List 的一些位置相关操作(比如 get,set,add,remove),是第一个实现随机访问方法的集合类,但不支持添加和替换

462
来自专栏学海无涯

Android开发之奇怪的Fragment

说起Android中的Fragment,在使用的时候稍加注意,就会发现存在以下两种: v4包中的兼容Fragment,android.support.v4.ap...

3165

扫码关注云+社区