【问题标题】:Encoding categorical variables that do not have a rank/order for classification?编码没有分类等级/顺序的分类变量?
【发布时间】:2018-11-27 19:26:19
【问题描述】:

我主要处理具有数字特征大小、高度、重量、距离、时间、词袋/tf-idf 等的分类问题。但是,我开始考虑使用更多具有分类特征的数据集。此类特征的示例包括种族、流派(书籍或电影)、颜色、形状、城市名称、学校等。如果我有一个名为 length 的分类变量,其级别为 small、medium、large,那么将其重新编码为1、2、3,因为已经存在一些层次结构或顺序。但是,我对编码没有自然转换为数字尺度或已经具有内在秩序感的变量感到困惑。

对于颜色之类的东西,想象选项是红色、绿色和蓝色。红色为 1、绿色为 2、蓝色为 3 是没有意义的,因为这意味着从技术上讲,红色比蓝色“更接近”绿色,在这种情况下,对颜色进行排名或有距离吗?同样,假设我们有一个流派的简化列表(浪漫、喜剧、戏剧、科幻、动作)。如果我将其编码为浪漫 - 1,喜剧 - 2,戏剧 - 3,科幻 - 4,动作 - 5,这意味着在这种表示中,浪漫比戏剧“更接近”或更类似于喜剧,这真的没有意义。我觉得通过这样做,我们人为地创造了不存在的结构和意义。

如果您认为以这种方式编码是完全可以接受的,我很乐意被证明是错误的(使用起来会更方便和简单)——请解释原因。如果我的解释是正确的,你能解释一下我该如何解决这个问题吗?你做过的事情(或普遍接受的做法)有哪些例子?我意识到二进制变量在上面的例子中相当简单,但如果我有更多的选择就不一定了。注意:我主要使用 Python、Pandas 和 Sklearn 进行 ML。如果您建议其他可以帮助解决此问题的工具,请告诉我。

谢谢!

【问题讨论】:

    标签: python machine-learning scikit-learn classification categorical-data


    【解决方案1】:

    1 - 您可以使用OneHotEncoder 将分类特征转换为二进制矩阵,例如:

    0 -> 0 0 1
    1 -> 0 1 0
    2 -> 1 0 0
    

    如果你有这么多的类别,这个解决方案可能不可行,因为特征矩阵会变得非常大。在这种情况下,我通常的做法是:如果类别分布不均匀,(例如,90% 的样本属于 5 个类别,其他属于剩余的 5000 个类别)我将这 5000 个类别全部转换为一个新类别,称为, 其他。现在我只有 6 个类别,可以像往常一样执行一个热编码。

    如果您有很多类别并且样本在类别之间平均分布,那么您不能删除类别或将它们合并为一个类别。

    2 - 按原样使用它们。如果您的分类可以处理分类特征,那么您可以直接使用它们。我假设 DecisionTrees 可以处理数字和分类数据。

    3 - 转换为数字特征。大多数时候这是不可能的。假设您的特征值为 NORTH、SOUTHEAST、NORTHWEST 等。在这种情况下,将它们转换为坐标,例如 NORTH 的 (0, 1)、SOUTHEAST 的 (1, -1) 和 NORTHWEST 的 (-1, 1) 就可以了。当然,从问题的角度来看,这种转换应该是合乎逻辑的。

    【讨论】:

      【解决方案2】:

      我会推荐一种热编码,它可以通过pd.get_dummies 轻松获得。明显的缺点是# added features = # possible classes of initial feature,但不需要定义任何类型的排序。

      不过,请查看this 精彩教程。如果你想更花哨,请参阅Category Encoders

      【讨论】:

        猜你喜欢
        • 2018-02-22
        • 1970-01-01
        • 2020-11-29
        • 2016-12-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-07
        • 1970-01-01
        • 2017-01-10
        相关资源
        最近更新 更多