我主要处理的分类问题涉及数值特征,如大小、身高、体重、距离、时间、词袋/tf-idf 等。然而,我开始考虑处理更多包含分类特征的数据集。这些特征的例子包括种族、类型(书籍或电影)、颜色、形状、城市名称、学校等。如果我有一个名为“长度”的分类变量,它的层次包括小、中、大,那么将其重新编码为1、2、3是有意义的,因为其中已经存在某种层次或顺序。然而,我对如何编码那些没有自然转换为数值尺度或已经具有内在顺序感的变量感到困惑。
以颜色为例,假设选项有红色、绿色和蓝色。将红色设为1,绿色设为2,蓝色设为3是不合理的,因为这意味着红色在技术上“更接近”绿色而不是蓝色,而在这种情况下,颜色排名或距离意味着什么呢?同样,假设我们有一个简化的类型列表(浪漫、喜剧、戏剧、科幻、动作)。如果我将其编码为浪漫 – 1,喜剧 – 2,戏剧 – 3,科幻 – 4,动作 – 5,这意味着在这种表示中,浪漫“更接近”或与喜剧更相似,而不是戏剧,这实际上并不合理。我觉得这样做,我们人为地创造了并不存在的结构和意义。
如果你认为以这种方式编码是完全可以接受的,我很乐意被证明是错的(这将更方便和简单处理)——请解释为什么。如果我的理解是正确的,你能解释我该如何解决这个问题吗?你做过哪些事情的例子(或普遍接受的做法)是什么?我意识到二元变量在上述例子中相当简单,但如果我有更多的选项,情况就不一定如此了。注意:我主要使用Python、Pandas和Sklearn进行机器学习。如果你建议其他可以帮助解决这个问题的工具,请告诉我。
谢谢!
回答:
1 – 你可以使用OneHotEncoder将分类特征转换为二进制矩阵,如下所示:
0 -> 0 0 11 -> 0 1 02 -> 1 0 0
如果你有太多的类别,这种解决方案可能不可行,因为特征矩阵会变得非常大。在这种情况下,我通常的做法如下:如果类别分布不均匀,(例如,90%的样本属于5个类别,其余的属于剩余的5000个类别)我将这5000个类别转换为一个新的类别,称为“其他”。现在我只有6个类别,可以照常进行独热编码。
如果你有很多类别,并且样本在类别之间均匀分布,那么你不能删除类别或将它们合并为一个类别。
2 – 按原样使用。如果你的分类可以处理分类特征,那么你可以直接使用它们。我假设决策树可以处理数值和分类数据。
3 – 转换为数值特征。这在大多数情况下是不可能的。假设你的特征值是北、东南、西北等。在这种情况下,将它们转换为坐标,如北(0, 1)、东南(1, -1)、西北(-1, 1)是可以的。当然,这种转换在问题上应该是合乎逻辑的。