背景

Gradient Boosting

Gradient Boosting是一种Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向。损失函数是评价模型性能(一般为拟合程度+正则项),认为损失函数越小,性能越好。而让损失函数持续下降,就能使得模型不断改性提升性能,其最好的方法就是使损失函数沿着梯度方向下降(讲道理梯度方向上下降最快)。

Gradient Boost是一个框架,里面可以套入很多不同的算法。

Gradient Boosting Decision Tree

每一次建立树模型是在之前建立模型损失函数的梯度下降方向。即利用了损失函数的负梯度在当前模型的值作为回归问题提升树算法的残差近似值,去拟合一个回归树。

GBDT应用-回归和分类

GBDT分类:每一颗树拟合当前整个模型的损失函数的负梯度,构建新的树加到当前模型中形成新模型,下一棵树拟合新模型的损失函数的负梯度。下面是其在Python的sklearn包下简单调用方法。

from sklearn import ensemble

clf = ensemble.GradientBoostingClassifier()

gbdt_model = clf.fit(X_train, y_train) # Training model

predicty_x = gbdt_model.predict_proba(test1217_x)[:, 1] # predict: probablity of 1

# 包含的参数

# loss = loss, learning_rate = learning_rate, n_estimators = n_estimators,

# min_samples_split = min_samples_split,

# min_samples_leaf = min_samples_leaf,

# min_weight_fraction_leaf = min_weight_fraction_leaf,

# max_depth = max_depth, init = init, subsample = subsample,

# max_features = max_features,

# random_state = random_state, verbose = verbose,

# max_leaf_nodes = max_leaf_nodes, warm_start = warm_start,

# presort = presort

1

2

3

4

5

6

7

8

9

10

11

12

13

14

GBDT回归:每一颗树拟合当前整个模型的残差,构建新的树加到当前模型中形成新模型,下一棵树拟合新模型的损失函数的负梯度。

from sklearn import ensemble

clf = ensemble.GradientBoostingRegressor()

gbdt_model = clf.fit(X_train, y_train) # Training model

y_upper = gbdt_model.predict(x_test) # predict

# 包含的参数和上面一致。

1

2

3

4

5

GBDT运用的正则化技巧,防止模型过于复杂,参考这篇文章GBDT运用的正则化技巧

GBDT构建新的特征思想

特征决定模型性能上界,例如深度学习方法也是将数据如何更好的表达为特征。如果能够将数据表达成为线性可分的数据,那么使用简单的线性模型就可以取得很好的效果。GBDT构建新的特征也是使特征更好地表达数据。

主要参考Facebook[1],原文提升效果:

在预测Facebook广告点击中,使用一种将决策树与逻辑回归结合在一起的模型,其优于其他方法,超过3%。

主要思想:GBDT每棵树的路径直接作为LR输入特征使用。

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

上图为混合模型结构。输入特征通过增强的决策树进行转换。 每个单独树的输出被视为稀疏线性分类器的分类输入特征。 增强的决策树被证明是非常强大的特征转换。

例子1:上图有两棵树,左树有三个叶子节点,右树有两个叶子节点,最终的特征即为五维的向量。对于输入x,假设他落在左树第一个节点,编码[1,0,0],落在右树第二个节点则编码[0,1],所以整体的编码为[1,0,0,0,1],这类编码作为特征,输入到线性分类模型(LR or FM)中进行分类。

论文中GBDT的参数,树的数量最多500颗(500以上就没有提升了),每棵树的节点不多于12。

GBDT与LR融合方案

在CTR预估中,如何利用AD ID是一个问题。

直接将AD ID作为特征建树不可行,而onehot编码过于稀疏,为每个AD ID建GBDT树,相当于发掘出区分每个广告的特征。而对于曝光不充分的样本即长尾部分,无法单独建树。

综合方案为:使用GBDT对非ID和ID分别建一类树。

非ID类树:

不以细粒度的ID建树,此类树作为base,即这些ID一起构建GBDT。即便曝光少的广告、广告主,仍可以通过此类树得到有区分性的特征、特征组合。

ID类树:

以细粒度 的ID建一类树(每个ID构建GBDT),用于发现曝光充分的ID对应有区分性的特征、特征组合。如何根据GBDT建的两类树,对原始特征进行映射?以如下图3为例,当一条样本x进来之后,遍历两类树到叶子节点,得到的特征作为LR的输入。当AD曝光不充分不足以训练树时,其它树恰好作为补充。

方案如图:

其中kaggle竞赛一般树的数目最多为30,通过GBDT转换得到特征空间相比于原始ID低了很多。

源码内容

generate GBDT features:

例子2:下图假设训练了3颗深度2的树模型,对于输入X,在第1个树属于节点4,在第2个树属于节点7,第3颗树属于节点6,所以生成的特征为”1:4 2:7 3:6”

generate features for FFM

数值型特征:进行变换:v←⌊log(v)2⌋

类别特征:出现小于10的类转换到一个特殊的value,即合为一种。

GBDT特征直接使用。

使用hashing trick将三类特征映射到1M-dimensionl。

Python实现

上面的源码用到了多线程实现,Python的sklearn库中提供了该方法,下面简单的实践:

首先要明确使用libFFM还是逻辑回归,两者不同之处在于:

libFFM适用于例子2的情况,即只用使用每棵树的index。

逻辑回归适用于例子1的情况,须将节点使用one-hot编码,核心代码如下:其中关键方法为树模型(GBDT)的apply()方法。

# 弱分类器的数目

n_estimator = 10

# 随机生成分类数据。

X, y = make_classification(n_samples=80000)

# 切分为测试集和训练集,比例0.5

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5)

# 将训练集切分为两部分,一部分用于训练GBDT模型,另一部分输入到训练好的GBDT模型生成GBDT特征,然后作为LR的特征。这样分成两部分是为了防止过拟合。

X_train, X_train_lr, y_train, y_train_lr = train_test_split(X_train, y_train, test_size=0.5)

# 调用GBDT分类模型。

grd = GradientBoostingClassifier(n_estimators=n_estimator)

# 调用one-hot编码。

grd_enc = OneHotEncoder()

# 调用LR分类模型。

grd_lm = LogisticRegression()

'''使用X_train训练GBDT模型,后面用此模型构造特征'''

grd.fit(X_train, y_train)

# fit one-hot编码器

grd_enc.fit(grd.apply(X_train)[:, :, 0])

'''

使用训练好的GBDT模型构建特征,然后将特征经过one-hot编码作为新的特征输入到LR模型训练。

'''

grd_lm.fit(grd_enc.transform(grd.apply(X_train_lr)[:, :, 0]), y_train_lr)

# 用训练好的LR模型多X_test做预测

y_pred_grd_lm = grd_lm.predict_proba(grd_enc.transform(grd.apply(X_test)[:, :, 0]))[:, 1]

# 根据预测结果输出

fpr_grd_lm, tpr_grd_lm, _ = roc_curve(y_test, y_pred_grd_lm)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

总结

对于样本量大的数据,线性模型具有训练速度快的特点,但线性模型学习能力限于线性可分数据,所以就需要特征工程将数据尽可能地从输入空间转换到线性可分的特征空间。GBDT与LR的融合模型,其实使用GBDT来发掘有区分度的特征以及组合特征,来替代人工组合特征。工业种GBDT+LR、GBDT+FM都是应用比较广泛。

python处理grd格式文件_GBDT原理及利用GBDT构造新的特征-Python实现相关推荐

  1. GBDT原理及利用GBDT构造新的特征-Python实现

    向AI转型的程序员都关注了这个号

  2. python用os.system打开wav文件_使用python读取wav格式文件

    ** 使用python读取wav格式文件 ** - 基本概念 [采样频率] 即取样频率, 指每秒钟取得声音样本的次数.采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同时它占的资源比较多.由 ...

  3. Python:pmml格式文件的简介、安装、使用方法(利用python将机器学习模型转为Java常用的pmml格式文件)之详细攻略

    Python:pmml格式文件的简介.安装.使用方法(利用python将机器学习模型转为Java常用的pmml格式文件)之详细攻略 目录 pmml格式文件的简介 1.PMML结构 pmml安装 pmm ...

  4. python获取的html转换为json,python读取XML格式文件并转为json格式

    XML文件如下: 红楼梦书名> 曹雪芹作者> 描述贾宝玉和林黛玉的爱情故事主要内容> 人民文学出版社出版社> 图书> 一.python读取XML格式文件代码: impor ...

  5. python 读取csv文件转成字符串,python实现csv格式文件转为asc格式文件的方法

    一.背景描述 csv格式文件是一种类似于excel的文件格式 asc格式文件是一种可以用text打开的文本文件 csv转asc本来可以用arcgis顺利完成,但由于csv数据量太大(744万行),ar ...

  6. python操作xlsx格式文件

    python操作xlsx格式文件 一.准备工作 二 .xlrd库读取 三.pandas库读取 1.安装pandas: pip install pandas 2.代码如下 3.操作行列 一.准备工作 二 ...

  7. csv加header python_用python处理csv格式文件

    用python处理csv格式文件 在各种平台上获取数据时,我们常常获得的是csv格式的文件.csv格式是一种逗号分隔值的文件格式,它并不是非常reader-friendly.所幸,python标准库中 ...

  8. python读取各种格式文件方式

    python读取各种格式文件方式 1.读取图片并显示 #方法1 from PIL import Image img=Image.open('1.jpg') img.show() #方法2 import ...

  9. python读取特殊格式文件

    python读取特殊格式文件 1.pytorch读取lmdb格式文件 参考文献 做深度学习/数据分析,数据读取是基础.必需的一环.特整理,以待后用. 1.pytorch读取lmdb格式文件 内容来源于 ...

  10. Python——读取raw格式文件

    Python--读取raw格式文件 文章目录 Python--读取raw格式文件 前言 一.直接上代码 前言 简单记录一下python读取raw格式图像,因为reshape来来回回还交换轴搞得人头大, ...

最新文章

  1. 【操作系统】【C/C++开发】内存管理
  2. 服务器读取excel文件,作为服务器进程读取Excel文件
  3. [深度学习] 自然语言处理--- 基于Keras Bert使用(下)
  4. 常见的注册界面实现的效果
  5. SDL 播放pcm数据
  6. 推荐系统应该如何保障推荐的多样性?
  7. 【零基础学Java】—TCP通信(五十四)
  8. c# 批量mqtt_Paho-MQTT C#接入示例
  9. CMU 15-213 Introduction to Computer Systems学习笔记(4) Machine-Level Programming-Basic
  10. ajax和jquery教程pdf,ajax和jquery教程pdf
  11. intellij idea的GitHub安装与使用教程
  12. Java基础--文件合并器
  13. 京津冀辽迎入汛以来最强降雨,四川盆地西部形成暴雨结界
  14. 3D编辑器-Web在线编辑基于WebGL/Threejs技术
  15. IP地址子网划分基础知识
  16. 千锋python培训机构可靠吗
  17. 平板做笔记本电脑的副屏教程
  18. wps交叉表_WPS交叉引用的使用方法
  19. 银联在线支付对接流程以及签名算法
  20. 全球及中国HDPE电熔配件行业规模预测及十四五动态发展研究报告2021-2027年版

热门文章

  1. 自主创新高科技IC企业的数字化转型 ——上海达策助力上海芯钛迈向企业发展新赛道
  2. excel 职位分析
  3. 从战略到执行:业务领先模型 BLM 战略篇「市场洞察」
  4. matlab 周期卷积,matlab连续时间信号卷积和离散时间信号卷积程序
  5. 很舒服的几句话,心静,人就不会累了
  6. 笔记本处理器排名_上半年最受欢迎处理器TOP10榜单:AMD终进榜,9代酷睿无缘前10...
  7. 硬核干货,史上最强获取GitHub所有仓库内容数据分析教程
  8. 小白的倔强-NPN和PNP三极管的使用区别以及简单检测
  9. ElasticSearch常用语法大全
  10. MATLAB生成随机数