为决策树分类功能编码的最佳做法?


13

在为线性回归编码分类特征时,有一条规则:假人的数量应比级别总数少一个(以避免共线性)。

决策树是否存在类似的规则(袋装,增强)?我之所以这样问是因为,Python的标准做法似乎是将n级别扩展到对我而言似乎不是最佳的n虚拟对象(sklearns OneHotEncoder或Pandas pd.get_dummies)。

作为编码决策树分类功能的最佳做法,您有何建议?

Answers:


12

似乎您了解您能够拥有n与相对的水平n-1,因为与线性回归不同,您不必担心完美的共线性。

(我从R的角度来看这个问题,但我认为在Python中是相同的。)这取决于几件事,例如1)您正在使用的软件包和2)您拥有多少个因子水平。

1)如果您使用的是R的randomForest封装,那么如果您的因子水平小于33,则可以继续进行操作,并根据需要将其保留为一项功能。那是因为在R的随机森林实施中,它将检查以查看哪个因子级别应位于拆分的一侧,而另一因子级别应位于(例如,您的5个级别可以在左侧分组,而7个可以分组)一起在右边)。如果将分类特征拆分为n虚拟变量,则该算法将无法使用此选项。

显然,如果您使用的特定程序包无法处理分类功能,那么您只需要创建n虚拟变量即可。

2)如上文所述,R的随机森林实现只能处理32个因子级别-如果您有更多的因子,则需要将因子分解为较小的子集,或为每个级别创建一个虚拟变量。


1
谢谢!我能正确理解吗:除非我在R中建模,其中的分类特征randomForest会自动编码,否则我应该选择n假人,因为共线性不是RF的问题?
谢尔盖·布什曼诺夫

3
具有32个以上级别的二进制编码类别的树在行为上会略有不同,因为RF只会从那些二进制列中进行选择,而不是选择具有多个级别的因子的单个列。这种微妙的差异意味着,与因子列上的拆分相比,二元列上的拆分信息较少,因为只有一种选择(0/1)与(1 / {2,3},{2,1} / 3 )等
Sycorax说要恢复莫妮卡的状态

@ user777拥有32个以上的变量不是问题。它没有在Python“分组”类变量的问题sklearn......实事求是地讲,是有证据(实践经验,研究等)认为,“dummified”变量将[在R]性能比“分组”分类变量更糟
Sergey Bushmanov

1
从理论上讲,我们可以预期非分组的性能​​会稍差一些,因为您给模型的灵活性较小。在分组的情况下,如果将那个特征视为未分组确实更好,那么该模型将能够做到这一点(将一组放置在一侧,然后将所有其余的放置在另一侧)。但是在实践中,如果有很大的差异(尤其是在RF中,您要创建很多树),我会感到惊讶
Tchotchke 2015年

2
如前所述,我发现使用具有许多因子水平(> 15)的功能的randomForest实现速度很慢,而且还产生了中等的模型性能。我猜想可能的拆分数量会大大减少集合中树木的预期去相关性。extraTrees和Rborist仅在每个节点中尝试分类分割的子样本。这可能有助于解相关,当然也可以提高速度。因此,“ randomForest尝试任何拆分”和“ sklern虚拟变量只能尝试1-vs-rest拆分”之间的解决方案范围是可能的。同样,将许多级别分为不同级别的不同聚类也可能有用。
索伦·哈弗隆德·威灵

4

还有另一种处理分类变量的方法,称为目标/影响编码。

在此方案中,想法是使用单个浮点列对要素进行编码,其中值是共享类别的所有行上目标变量的平均值。这对于基于树的模型特别有用,因为它在特征内强加了顺序关系(即,类别右侧的值比左侧的值具有更高的平均响应),并且它更易于分割预测变量空间。

这是一个很好的主题解释:https :
//towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0

这是最初提出编码的论文的链接:http : //helios.mm.di.uoa.gr/~rouvas/ssi/sigkdd/sigkdd.vol3.1/barreca.pdf

有更多详细信息可以避免估计低计数类别的平均值,还有另一个模型CatBoost提出了针对此编码引入的偏差的解决方案,但以我的经验,这是一种编码高基数分类变量的简单且非常有用的方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.