在为线性回归编码分类特征时,有一条规则:哑元数应比总层数少一(以避免共线性)。
决策树(袋装,提升)是否存在类似的规则?我之所以这么问,是因为 Python 中的标准做法似乎是将n
级别扩展到n
虚拟对象(sklearns'OneHotEncoder
或 Pandas' pd.get_dummies
),这对我来说似乎不是最理想的。
作为决策树分类特征编码的最佳实践,您有什么建议?
在为线性回归编码分类特征时,有一条规则:哑元数应比总层数少一(以避免共线性)。
决策树(袋装,提升)是否存在类似的规则?我之所以这么问,是因为 Python 中的标准做法似乎是将n
级别扩展到n
虚拟对象(sklearns'OneHotEncoder
或 Pandas' pd.get_dummies
),这对我来说似乎不是最理想的。
作为决策树分类特征编码的最佳实践,您有什么建议?
看起来你明白你可以有n
水平,而不是n-1
,因为与线性回归不同,你不需要担心完美的共线性。
(我是从 R 的角度来看的,但我认为它在 Python 中是相同的。)这取决于几件事,例如 1)您正在使用哪个包和 2)您有多少因子级别。
1)如果您使用的是 R 的randomForest
软件包,那么如果您的因子水平 <33,那么您可以继续,如果您愿意,可以将它们保留在一个功能中。这是因为在 R 的随机森林实现中,它会检查哪些因子级别应该在拆分的一侧,哪些在另一侧(例如,您的 5 个级别可能在左侧分组在一起,而 7 个可能被分组一起在右边)。如果您将分类特征拆分为n
虚拟对象,则算法将无法使用此选项。
显然,如果您使用的特定包无法处理分类特征,那么您只需要创建n
虚拟变量。
2)正如我上面提到的,R 的随机森林实现只能处理 32 个因子级别——如果你有更多,那么你需要将你的因子分成更小的子集,或者为每个级别创建一个虚拟变量。
还有另一种处理分类变量的方法,称为目标/影响编码。
在这个方案中,想法是使用单个浮点列对特征进行编码,其中值是目标变量在共享类别的所有行上的平均值。这对于基于树的模型特别有用,因为它在特征中强加了顺序关系(即类别右侧的值比左侧的值具有更高的平均响应),并且更容易分割预测空间。
这是对该主题的一个很好的解释:
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 提出了一种解决这种编码引入的偏差的方法,但根据我的经验,这是一种编码高基数分类变量的简单且非常有用的方法.