使用 XGBoost 时二进制特征的一种热编码

机器算法验证 机器学习 随机森林 scikit-学习 数据挖掘 助推
2022-03-13 01:47:07

我已经问过这个问题了;但是,我意识到这可能是解决此类问题的更好地方。

我很清楚,当将分类特征与基于树的模型(例如随机森林和梯度提升)一起使用时,无需从 N 级分类特征中删除一级。例如,下面的具有三个级别的颜色特征可以做成三个二值特征。

Color|| Color_R | Color_B | Color_G
____ ||_________|_________|________
 R   ||   1     |   0     |   0
 B   ||   0     |   1     |   0
 G   ||   0     |   0     |   1

但是,二元特征(例如,TRUE/FALSE、MALE/FEMALE)呢?是否应该将其保留为单个二进制特征(下面的选项 I),还是应该将其一次性编码为两个二进制特征(下面的选项 II)

选项一

Gender || Gender  | 
____   ||_________|
M      ||   1     | 
F      ||   0     | 
M      ||   1     | 

选项二

Gender || Gender_M | Gender_F 
____   || _________|_________
M      ||    1     |   0     
F      ||    0     |   1     
M      ||    1     |   0  
4个回答

确实,当您只使用个类别时,您不会丢失信息。在线性模型中,我们都熟悉虚拟变量陷阱以及具有水平和截距的模型与具有水平且没有截距的模型之间的关系。但是,您使用的是基于树的模型,因此递归二元拆分的工作原理很重要!k1k1k

对于具有2个水平的因子,例如“red”和“blue”,显然使用 1hot 方法等同于选择 1-hot 方法。这是因为暗示在这种情况下,没有区别。k1kNOT bluered

但是对于类别,您需要二进制拆分来隔离省略的级别(第个级别)。因此,如果您有 3 个级别,例如“red”、“green”、“blue”,但您只包含“red”和“green”的 1-hot 特征,则需要 2 次连续拆分来隔离“blue”样本. 这是因为如果您在“红色”上拆分,则子节点是和的节点要在编码方案中省略类别“蓝色”时隔离“蓝色”,您必须再次拆分“绿色”,因为这样子节点将是k>2k1kredNOT red = green OR bluegreen OR bluebluegreen

随着的增加,这个问题变得更加明显,因为您需要更多的拆分。这可能会以奇怪的方式与您的其他超参数交互,因为指定最大树深度是避免与 boosted trees/ 过度拟合的常用策略kxgboost

如果隔离类别不重要,那么这种影响可能对您的问题根本不重要。但是,如果类别重要,您将倾向于通过分类变量或通过识别其他变量的潜在相互作用来尝试将其隔离开来。kk

选择您的选项 I - 当只有两个类别时,无需进行 one-hot 编码。
这两列Gender_M带有Gender_F完全相同的信息(因为它是二进制的,至少在您的示例中)。
我认为一些框架需要二进制来进行一次热编码,而不是特性。

我对这件事也有同样的疑问。当您有 K = 2(就像在性别情况下一样)时,无论如何您最终都会与其他值具有 100% 的多重共线性(就共线性而言,GenderMale = GenderFemale),因此删除其中一个是有意义的。由于树模型可以处理多重共线性,因此当 K > 2 时不一定要丢弃。但是,当 K = 2 时,即使树模型可以很好地处理多重共线性,您仍然应该丢弃其中一个值,因为它会导致完美的多重共线性。这就是我的看法。

从这里引用

将二进制变量转换为 one-hot 编码的变量是多余的,并且可能会导致不必要的和不请自来的麻烦。尽管相关特征可能并不总是会使您的模型恶化,但它们也不总是会改善它。