我永远不确定何时对无序分类变量使用 one-hot 编码,何时不使用。每当算法使用距离度量来计算相似度时,我都会使用它。谁能给出一个一般的经验法则,什么类型的算法需要无序分类特征进行单热编码,哪些不需要?
哪些算法需要 one-hot 编码?
大多数算法(线性回归、逻辑回归、神经网络、支持向量机等)都需要对分类变量进行某种编码。这是因为大多数算法只将数值作为输入。
不需要编码的算法是可以直接处理联合离散分布的算法,例如马尔可夫链/朴素贝叶斯/贝叶斯网络、基于树的等。
补充评论:
一种热编码是编码方法之一。这是分类变量编码的好资源(不限于 R)。分类变量的 R 库对比编码系统
谁能列出哪些算法需要对分类特征进行一次热编码,哪些不需要?
AFAIU,它必须更多地处理特定数据,而不是特定算法。具体来说,这取决于类别中是否存在一些有意义的顺序。
考虑两种情况。第一个有类别bad, meh, good,第二个有apple, orange, pear。在第一种情况下有一个自然顺序,因为meh可能介于bad和good之间,但在apple, orange, pear中可能没有类似的情况发生。
如果您在第一种情况下避免单热编码,那么您将“丢失”有关订单的信息。如果您在第二种情况下使用 one-hot 编码,那么您将某些顺序分配给自然不正确的类别。
每当算法使用距离度量来计算相似度时,我都会这样做。
为什么?假设其中一个特征是分类的坏,meh,good,并且您有三个实例,1、2 和 3,它们是相同的,除了 1 是bad, 2 是meh, 3 是 good 。您可能想向算法表达 1 与 2 的相似性,而不是与 3 的相似性。
没有机器学习算法需要 一种热编码。这是处理分类变量的一种方法。虚拟变量是另一个。传统上,虚拟变量是首选解决方案。例如,R 函数 lm() 自动为分类数据创建虚拟变量。如果您使用的是 python 和 scikt-learn,那么我相信它的许多算法都需要对分类变量进行一次性编码。我相信 tensorFlow 也需要 one-hot 编码。这些是变量编码方式的选择。没有理由不能在代码中使用虚拟变量。这一切都必须处理算法的实际代码实现。
正如 hxd1011 指出的那样,描述分类变量之间的“距离”是一个微妙的问题。除了提到的距离之外,还有 Jaccard 距离。一些 ML 方法,特别是 SVM 不适合分类数据,并且添加分类变量可以/将(两者都由您决定)导致模型的预测能力非常差。大多数集成模型“按原样”处理分类数据,不需要预处理。