我知道诸如随机森林和提升树之类的模型不需要对预测器级别进行一次性编码,但我真的不明白为什么。如果树在特征空间中进行拆分,那么是否不涉及固有的顺序?这里一定有我遗漏的东西。
为了增加我的困惑,我遇到了一个我正在研究的问题,并尝试在分类特征上使用 one-hot 编码,而不是在 R 中使用 xgboost 转换为整数。使用 one-hot 编码的泛化错误稍微好一些。
然后我拿了另一个变量,做了同样的测试,结果却相反。
谁能帮忙解释一下?
我知道诸如随机森林和提升树之类的模型不需要对预测器级别进行一次性编码,但我真的不明白为什么。如果树在特征空间中进行拆分,那么是否不涉及固有的顺序?这里一定有我遗漏的东西。
为了增加我的困惑,我遇到了一个我正在研究的问题,并尝试在分类特征上使用 one-hot 编码,而不是在 R 中使用 xgboost 转换为整数。使用 one-hot 编码的泛化错误稍微好一些。
然后我拿了另一个变量,做了同样的测试,结果却相反。
谁能帮忙解释一下?
编码导致了表示问题以及算法处理表示的方式。
让我们考虑 3 种表示特征的 n 个类别值的方法:
请注意,我们可以用相同的方法表示相同的值。一种热编码效率较低,需要 n 位而不是 log n 位。不仅如此,如果我们不知道 on hot 编码中的 n 个特征是排他的,我们的vc 维度和我们的假设集就更大了。
所以,有人可能想知道为什么首先使用一种热编码?
问题在于,在单一特征表示和对数表示中,我们可能会使用错误的推导。
在单个特征表示中,算法可能会呈现顺序。通常编码是任意的,值 3 从 8 到 3。但是,该算法可能会将特征视为数字特征并提出诸如“f < 4”之类的规则。在这里,您可能会声称如果算法找到了这样的规则,即使不是有意的,它也可能是有益的。虽然这可能是真的,但小数据集、噪音和其他原因导致数据集错误地代表了基础分布可能会导致错误的规则。
在对数表示中也会发生同样的情况(例如,有“第三位开启”之类的规则)。在这里,我们可能会得到更复杂的规则,这些规则都是无意的,有时还会产生误导。
所以,我们应该有相同的表示,在理想世界中导致相同的结果。然而,在某些情况下,效率较低的表示会导致更糟糕的结果,而在其他情况下,糟糕的演绎规则会导致更糟糕的结果。
一般来说,如果值在行为上确实非常不同,算法可能不会推导出这样的规则,您将从更有效的表示中受益。很多时候,很难事先分析它,所以你所做的,尝试两种表示,是选择正确的一种好方法。
xgboost
通常在 one-hot 编码后表现更好。否则,它会将您的分类变量视为数值变量。
但是大多数其他树包都支持分类变量;换句话说,它们支持以下规则:If(Car = Mercedes).
同样,xgboost
不幸的是,没有。因此,您必须将分类变量转换为二进制变量,以便它可以执行以下操作:If(Car[Mercedes] >= 0.5).