序数编码或单热编码

Ordinal Encoding or One-Hot-Encoding

如果我们不确定分类特征的性质,例如它们是名义特征还是有序特征,我们应该使用哪种编码?序号编码还是单热编码? 关于这个主题是否有明确定义的规则?

我看到很多人在没有方向的分类数据上使用序号编码。 假设一个频率 table:

some_data[some_col].value_counts()
[OUTPUT]
color_white    11413
color_green     4544
color_black     1419
color_orang        3
Name: shirt_colors, dtype: int64

有很多人更喜欢在本专栏中进行序号编码。而且我一心想要使用 One-Hot-Encoding。 我对此的看法是,执行 Ordinal Encoding 将分配这些颜色的一些有序数字,这意味着排名。而且一开始就没有排名。换句话说,我的模型不应该认为 color_white 是 4 而 color_orang 是 0 或 1 或 2。 请记住,数据描述中也没有任何排名或顺序的提示。

我对这个题目有以下理解:

既没有方向也没有大小的数是标称变量。例如,fruit_list =['apple', 'orange', banana']。除非有特定的上下文,否则这个集合将被称为名义集合。 对于这样的变量,我们应该执行 get_dummies 或 one-hot-encoding

而序数变量有一个方向。例如,shirt_sizes_list = [大、中、小]。这些变量称为序数变量。如果同一个水果列表背后有上下文,比如价格或营养价值,即可以给 fruit_list 中的水果一些排名或顺序,我们将其称为序数变量。 对于序数变量,我们执行序数编码

我的理解对吗? 请提供您的反馈 这个话题变成了一场噩梦 谢谢!

你是对的。选择 OrdinalEncoderOneHotEncoder 需要考虑的一件事是 数据的顺序重要吗?

大多数 ML 算法会假设两个附近的值比两个距离较远的值更相似。这在某些情况下可能没问题,例如,对于有序类别,例如:

  • quality = ["bad", "average", "good", "excellent"]
  • shirt_size = ["large", "medium", "small"]

但显然情况并非如此:

  • color = ["white","orange","black","green"]

列(除了需要考虑频谱的情况,比如 从白到黑。请注意,在这种情况下,white 类别应编码为0black 应该被编码为你的类别中的最高数字),​​或者如果你有一些情况,例如,类别 0 和 4 可能比类别 0 和 1 更相似。修复这个问题,一个常见的解决方案是为每个类别创建一个二进制属性(One-Hot 编码)