代码之家  ›  专栏  ›  技术社区  ›  Jane Sully

对没有等级/分类的分类变量进行编码?

  •  -3
  • Jane Sully  · 技术社区  · 6 年前

    我主要工作的分类问题,有数字特征大小,高度,重量,距离,时间,字袋/TF IDF,等等。然而,我开始考虑使用具有分类特征的更多数据集。这类特征的例子是种族、体裁(书籍或电影)、颜色、形状、城市名称、学校等。如果我有一个叫做长度的分类变量,它具有小、中、大的级别,有意义的是将其重新编码为1, 2, 3,因为已经存在某种层次或顺序。然而,我对编码没有自然翻译为数值刻度的变量或已经具有内在的有序感感到困惑。

    用颜色之类的东西想象一下红色、绿色和蓝色的选择。红色是1,绿色是2,蓝色是3,这是没有意义的,因为这意味着红色在技术上比绿色更接近“绿色”。同样,假设我们有一个简单的流派列表(浪漫、喜剧、戏剧、科幻、动作)。如果我把它编码为浪漫- 1,喜剧- 2,戏剧- 3,科幻- 4,行动- 5,这意味着在这表示浪漫是“更接近”或更类似于喜剧比戏剧,这真的没有道理。我觉得通过这样做,我们是在人为地创造结构和意义,而这还不存在。

    如果你认为以这种方式编码是完全可以接受的,我希望被证明是错误的(这将是更方便和简单的工作)-请只解释为什么。如果我的解释是正确的,你能解释一下我怎样才能解决这个问题吗?你做过的事情(或普遍接受的做法)有哪些例子?我意识到二进制变量在上面的例子中是相当简单的,但如果我有更多的选择,不一定是这样。注:我主要与Python,熊猫,和Sklearn for ML.,如果你建议其他工具,可以帮助这一点,让我知道。

    谢谢您!

    2 回复  |  直到 6 年前
        1
  •  1
  •   Seljuk Gulcan    6 年前

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

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

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

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

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

    3-转换为数值特征。这在大多数情况下是不可能的。假设您的特征值是北、东南、西北等等。在这种情况下,将它们转换成像(0,1)表示北,(1,-1)表示东南和(-1,1)表示西北这样的坐标是可以的。当然,就问题而言,这种转换应该是合乎逻辑的。

        2
  •  0
  •   Jan K    6 年前

    我建议 一个热编码 很容易通过 pd.get_dummies . 明显的缺点是 # added features = # possible classes of initial feature 但没有必要定义任何排序。

    然而,检查 this 很棒的教程。如果你想得到更多的幻想 Category Encoders .