python - 编码没有分类等级/顺序的分类变量?
问题描述
我主要处理具有数字特征大小、高度、重量、距离、时间、词袋/tf-idf 等的分类问题。但是,我开始考虑使用更多具有分类特征的数据集。此类特征的示例包括种族、流派(书籍或电影)、颜色、形状、城市名称、学校等。如果我有一个名为 length 的分类变量,其级别为 small、medium、large,那么将其重新编码为1、2、3,因为已经存在一些层次结构或顺序。但是,我对编码没有自然转换为数字尺度或已经具有内在秩序感的变量感到困惑。
对于颜色之类的东西,想象选项是红色、绿色和蓝色。红色为 1,绿色为 2,蓝色为 3 是没有意义的,因为这意味着红色在技术上比蓝色“更接近”绿色,在这种情况下,对颜色进行排名或有距离吗?同样,假设我们有一个流派的简化列表(浪漫、喜剧、戏剧、科幻、动作)。如果我将其编码为浪漫 - 1,喜剧 - 2,戏剧 - 3,科幻 - 4,动作 - 5,这意味着在这种表示中,浪漫比戏剧“更接近”或更类似于喜剧,这真的没有意义。我觉得通过这样做,我们人为地创造了不存在的结构和意义。
如果您认为以这种方式编码是完全可以接受的,我很乐意被证明是错误的(使用起来会更方便和简单)——请解释原因。如果我的解释是正确的,你能解释一下我该如何解决这个问题吗?你做过的事情(或普遍接受的做法)有哪些例子?我意识到二进制变量在上面的例子中相当简单,但如果我有更多的选择就不一定了。注意:我主要使用 Python、Pandas 和 Sklearn 进行 ML。如果您建议其他可以帮助解决此问题的工具,请告诉我。
谢谢!
解决方案
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) 就可以了。当然,就问题而言,这种转换应该是合乎逻辑的。
推荐阅读
- node.js - 无法信任 Node.js 中来自 IIS Express 的自签名 SSL 证书
- python - Python os.system 或 subprocess.run 保持输出状态
- python - 使用 beautifulsoup 进行网页抓取的困难
- haproxy - HTTPS 请求的 HA 代理上的用户会话已过期
- apache-superset - 如何为 superset-ui 构建包?
- python - 有一种方法来停止 tweepy 流的最佳方法是什么?
- python - Apache Beam ReadFromMongoDB python sdk 抛出错误:无法从 MongoDb 读取
- sql - 避免使用 IF SQL 除以零
- python - 通过创建一个实例作为属性,我可以从 Electric Car 类访问 Car 类的任何方法。谁能深入解释这些?
- java - 放心的 POST 调用,多部分在 contentbody 中包含越南语字符