XGBoost Plotting API以及GBDT组合特征实践
写在前面:
最近在深入学习一些树模型相关知识点,打算整理一下。刚好昨晚看到余音大神在Github上分享了一波 MachineLearningTrick,赶紧上车学习一波!大神这波节奏分享了xgboost相关的干货,还有一些内容未分享….总之值得关注!我主要看了:Xgboost的叶子节点位置生成新特征封装的函数。之前就看过相关博文,比如Byran大神的这篇:http://blog.csdn.net/bryan__/article/details/51769118,但是自己从未实践过。本文是基于bryan大神博客以及余音大神的代码对GBDT组合特征实践的理解和拓展,此外探索了一下XGBoost的Plotting API,学习为主!
知乎上的讨论:决策树是否应该用one-hot编码?
官方API介绍:
http://xgboost.readthedocs.io/en/latest/python/python_api.html#module-xgboost.sklearn
1.利用GBDT构造组合特征原理介绍
从byran大神的博客以及这篇利用GBDT模型构造新特征中,可以比较好的理解GBDT组合特征:
论文的思想很简单,就是先用已有特征训练GBDT模型,然后利用GBDT模型学习到的树来构造新特征,最后把这些新特征加入原有特征一起训练模型。构造的新特征向量是取值0/1的,向量的每个元素对应于GBDT模型中树的叶子结点。当一个样本点通过某棵树最终落在这棵树的一个叶子结点上,那么在新特征向量中这个叶子结点对应的元素值为1,而这棵树的其他叶子结点对应的元素值为0。新特征向量的长度等于GBDT模型里所有树包含的叶子结点数之和。
举例说明。下面的图中的两棵树是GBDT学习到的,第一棵树有3个叶子结点,而第二棵树有2个叶子节点。对于一个输入样本点x,如果它在第一棵树最后落在其中的第二个叶子结点,而在第二棵树里最后落在其中的第一个叶子结点。那么通过GBDT获得的新特征向量为[0, 1, 0, 1, 0],其中向量中的前三位对应第一棵树的3个叶子结点,后两位对应第二棵树的2个叶子结点。
在实践中的关键点是如何获得每个样本在训练后树模型每棵树的哪个叶子结点上。之前知乎上看到过可以设置pre_leaf=True获得每个样本在每颗树上的leaf_Index,打开XGBoost官方文档查阅一下API:
原来这个参数是在predict里面,在对原始特征进行简单调参训练后,对原始数据以及测试数据进行new_feature= bst.predict(d_test, pred_leaf=True)
即可得到一个(nsample, ntrees) 的结果矩阵,即每个样本在每个树上的index。了解这个方法之后,我仔细学习了余音大神的代码,发现他并没有用到这个,如下:
可以看到他用的是apply()方法,这里就有点疑惑了,在XGBoost官方API并没有看到这个方法,于是我去SKlearn GBDT API看了下,果然有apply()方法可以获得leaf indices:
因为XGBoost有自带接口和Scikit-Learn接口,所以代码上有所差异。至此,基本了解了利用GBDT(XGBoost)构造组合特征的实现方法,接下去按两种接口实践一波。
## **2.利用GBDT构造组合特征实践** 发车发车~ (1).包导入以及数据准备from sklearn.model_selection import train_test_split
from pandas import DataFrame
from sklearn import metrics
from sklearn.datasets import make_hastie_10_2
from xgboost.sklearn import XGBClassifier
import xgboost as