我知道像随机森林和增强树这样的模型不需要对预测器级别进行一次热编码,但我并不真正理解为什么。如果树是在特征空间中分割的,那么是否存在固有的排序呢?这里一定有我遗漏的东西。
让我更困惑的是,我遇到了我正在研究的一个问题,尝试在分类特性上使用一次热编码,而在R中使用xgboost将其转换为整数,使用一次热编码的泛化错误稍微好一些。
然后我又取了一个变量,做了同样的测试,结果正好相反。
有人能帮我解释一下吗?
发布于 2017-04-02 11:20:00
编码带来了一个表示问题,以及算法处理表示的方法。
让我们考虑表示特性的n个范畴值的3种方法:
注意,我们可以在相同的方法中表示相同的值。热编码效率较低,需要n位而不是log n位。此外,如果我们不知道on热编码中的n个特征是排他性的,那么我们的vc维数和假设集就会更大。
因此,人们可能会想,为什么首先使用一个热编码?
问题是,在单一特征表示和日志表示中,我们可能使用错误的演绎。
在一个单一的特征表示中,该算法可能是有序的。通常编码是任意的,从8开始,3的值是3的最远。然而,该算法可能会将特征看作一个数字特征,并提出"f < 4“这样的规则。在这里,您可能会声称,如果算法找到这样的规则,它可能是有益的,即使不是有意的。虽然这可能是正确的,但小数据集、噪声和其他拥有mis表示底层分布的数据集的原因可能会导致错误的规则。
在对数表示法中也可能发生同样的情况(例如,有“第三位是打开的”这样的规则。在这里,我们可能会得到更复杂的规则,所有这些规则都是无意的,有时也是误导性的。
因此,我们应该有相同的表现,导致相同的结果在理想世界。然而,在某些情况下,效率较低的表示可能导致更坏的结果,而在其他情况下,糟糕的推理规则可能导致更坏的结果。
一般来说,如果这些值在行为上确实是非常不同的,那么算法可能不会推导出这样的规则,并且您将受益于更高效的表示。很多时候,很难事先分析它,所以你所做的,尝试这两种表达方式,是选择合适的表达方式的好方法。
发布于 2017-04-06 17:34:21
xgboost
通常在一次热编码之后表现得更好.否则,它将把你的分类变量视为数值变量。
但是大多数其他树包都支持分类变量;换句话说,它们支持规则,比如:If(Car = Mercedes).
。
同样,不幸的是,xgboost
没有。因此,必须将分类变量转换为二进制变量,以便它能够执行:If(Car[Mercedes] >= 0.5).
https://datascience.stackexchange.com/questions/18056
复制相似问题