我用分类数据构建模型已经有一段时间了,在这种情况下,我基本上默认使用 scikit-learn 的 LabelEncoder 函数在构建模型之前转换这些数据。
我了解它们之间的区别OHE
,LabelEncoder
以及DictVectorizor
它们对数据所做的事情,但我不清楚的是何时您可能会选择使用一种技术而不是另一种技术。
是否有某些算法或情况相对于其他算法或情况具有优势/劣势?
我用分类数据构建模型已经有一段时间了,在这种情况下,我基本上默认使用 scikit-learn 的 LabelEncoder 函数在构建模型之前转换这些数据。
我了解它们之间的区别OHE
,LabelEncoder
以及DictVectorizor
它们对数据所做的事情,但我不清楚的是何时您可能会选择使用一种技术而不是另一种技术。
是否有某些算法或情况相对于其他算法或情况具有优势/劣势?
在某些情况下LabelEncoder
或DictVectorizor
有用的情况下,但由于顺序性,我认为这些情况非常有限。
LabelEncoder
可以[dog,cat,dog,mouse,cat]
变成[1,2,1,3,2]
,但是强加的序数意味着狗和老鼠的平均值是猫。仍然有诸如决策树和随机森林之类的算法可以很好地处理分类变量,并且LabelEncoder
可以使用更少的磁盘空间来存储值。
One-Hot-Encoding 的优点是结果是二进制而不是序数,并且所有内容都位于正交向量空间中。缺点是对于高基数,特征空间真的会很快爆炸,你开始与维度的诅咒作斗争。在这些情况下,我通常使用 one-hot-encoding 和 PCA 进行降维。我发现 one-hot 加 PCA 的明智组合很少能被其他编码方案击败。PCA 发现线性重叠,因此自然会倾向于将相似的特征分组为相同的特征。
虽然AN6U5给出了非常好的答案,但我想补充几点以供将来参考。在考虑One Hot Encoding (OHE) 和Label Encoding时,我们必须尝试并了解您要构建的模型。即我们将考虑的两类模型是:
让我们考虑在构建基于树的模型时何时应用 OHE 以及何时应用标签编码。
我们在以下情况下应用 OHE:
我们在以下情况下应用标签编码:
如果您想按照@AN6U5 的建议继续使用 OHE,您可能希望将 PCA 与 OHE 结合使用。
让我们考虑在构建非基于树的模型时何时应用 OHE 和标签编码。
要应用标签编码,特征和目标之间的依赖关系必须是线性的,才能有效地利用标签编码。
同样,如果依赖性是非线性的,您可能希望使用 OHE。
注意:部分解释参考了 Coursera的 How to Win a Data Science Competition。
LabelEncoder
用于序数数据,而 OHE 用于名义数据。
您还可以使用频率编码,在其中将值映射到它们的频率
示例取自如何从 Coursera 赢得数据科学竞赛,例如。对于泰坦尼克数据集:
encoding = titanic.groupby('Embarked').size()
encoding = encoding/len(titanic) // calculates frequency
titanic['enc'] = titanic.embarked.map('Encoding')
这将保留有关值分布的信息,并将有助于线性和基于树的模型。确保您没有多个具有相同频率的类别,您可以使用排名操作或任何其他相关操作。