xgboost对one-hot编码特征特征选择时遇到的问题

16,767次阅读
没有评论

共计 2322 个字符,预计需要花费 6 分钟才能阅读完成。

xgboost对所有的输入特征都是当做数值型对待,所以你给定的数据也要是指定的数据类型
对于数据缺失或者稀疏,xgboost都可以自己处理
纠结于one-hot编码问题主要是将分类信息转化为一定长度索引的二进制数据
假设当前的数据类型是annimal={‘panda’,’cat’,’dog’}
经过one-hot编码可能就变成
[[1,0,0],
[0,1,0],
[0,0,1]]
上述是一个3*3 矩阵向量
对于xgboost而言,将其解释为3个特征变量,animal0,animal1,animal2,这三个共同表征animal
最终在get_fscore函数中计算特征的重要性也会将其分开来看,可能animal0占据着更重要的地位

xgboost树模型其实是不建议使用one-hot编码,在xgboost上面的issue也提到过,相关的说明如下
I do not know what you mean by vector. xgboost treat every input feature as numerical, with support for missing values and sparsity. The decision is at the user
So if you want ordered variables, you can transform the variables into numerical levels(say age). Or if you prefer treat it as categorical variable, do one hot encoding.
在另一个issues上也提到过(tqchen commented on 8 May 2015):
One-hot encoding could be helpful when the number of categories are small( in level of 10 to 100). In such case one-hot encoding can discover interesting interactions like (gender=male) AND (job = teacher).
While ordering them makes it harder to be discovered(need two split on job). However, indeed there is not a unified way handling categorical features in trees, and usually what tree was really good at was ordered continuous features anyway..
总结起来的结论,大至两条:
  • 1.对于类别有序的类别型变量,比如age等,当成数值型变量处理可以的。对于非类别有序的类别型变量,推荐one-hot。但是one-hot会增加内存开销以及训练时间开销。
  • 2.类别型变量在范围较小时(tqchen给出的是[10,100]范围内)推荐使用

为什么基于树模型不太需要one-hot

one-hot编码为什么可以解决类别型数据的离散值问题

首先,one-hot编码是N位状态寄存器为N个状态进行编码的方式
eg:高、中、低不可分,→ 用0 0 0 三位编码之后变得可分了,并且成为互相独立的事件
→ 类似 SVM中,原本线性不可分的特征,经过project之后到高维之后变得可分了
GBDT处理高维稀疏矩阵的时候效果并不好,即使是低维的稀疏矩阵也未必比SVM好

Tree Model不太需要one-hot编码

对于决策树来说,one-hot的本质是增加树的深度
tree-model是在动态的过程中生成类似 One-Hot + Feature Crossing 的机制
1. 一个特征或者多个特征最终转换成一个叶子节点作为编码 ,one-hot可以理解成三个独立事件
2. 决策树是没有特征大小的概念的,只有特征处于他分布的哪一部分的概念
one-hot可以解决线性可分问题 但是比不上label econding
one-hot降维后的缺点:
降维前可以交叉的降维后可能变得不能交叉
树模型的训练过程:
从根节点到叶子节点整条路中有多少个节点相当于交叉了多少次,所以树的模型是自行交叉
eg:是否是长的 { 否(是→ 柚子,否 → 苹果) ,是 → 香蕉 } 园 cross 黄 → 形状 (圆,长) 颜色 (黄,红) one-hot度为4的样本
使用树模型的叶子节点作为特征集交叉结果可以减少不必要的特征交叉的操作 或者减少维度和degree候选集
eg 2 degree → 8的特征向量 树 → 3个叶子节点
树模型:Ont-Hot + 高degree笛卡尔积 + lasso 要消耗更少的计算量和计算资源
这就是为什么树模型之后可以stack线性模型
n*m的输入样本 → 决策树训练之后可以知道在哪一个叶子节点上 → 输出叶子节点的index → 变成一个n*1的矩阵 → one-hot编码 → 可以得到一个n*o的矩阵(o是叶子节点的个数) → 训练一个线性模型
典型的使用: GBDT + RF
优点 : 节省做特征交叉的时间和空间
如果只使用one-hot训练模型,特征之间是独立的
对于现有模型的理解:(G(l(张量))):
其中:l(·)为节点的模型
G(·)为节点的拓扑方式
神经网络:l(·)取逻辑回归模型
G(·)取全连接的方式
决策树: l(·)取LR
G(·)取树形链接方式
创新点: l(·)取 NB,SVM 单层NN ,等
G(·)取怎样的信息传递方式

参考资料
正文完
请博主喝杯咖啡吧!
post-qrcode
 
admin
版权声明:本站原创文章,由 admin 2017-10-31发表,共计2322字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码