【问题标题】:KNN classification with categorical data带有分类数据的 KNN 分类
【发布时间】:2025-11-25 21:30:01
【问题描述】:

我正忙于一个涉及 k-最近邻回归的项目。我混合了数值和分类字段。分类值是序数(例如银行名称、帐户类型)。数字类型是,例如工资和年龄。还有一些二进制类型(例如,男性、女性)。

如何将分类值纳入 KNN 分析?

据我所知,不能简单地将每个分类字段映射到数字键(例如银行 1 = 1;银行 2 = 2 等),因此我需要一种更好的方法来使用分类字段。我听说可以使用二进制数 - 这是一种可行的方法吗? 建议将不胜感激。

【问题讨论】:

  • 关于将分类数据转换为二进制值:查看arxiv.org/pdf/1210.7070v3.pdf sec的开头。 2 描述这种转换。
  • 我正在使用 k-最近邻聚类。我想使用多个参数/维度(年龄、性别、银行、工资、账户类型)在测试点周围生成一个 k = 20 个点的集群。对于账户类型,例如,您有活期账户、支票账户和储蓄账户(分类数据)。然而,工资是连续的(数字的)。如何使用具有连续字段的分类字段进行KNN聚类?
  • 你有训练数据吗?听起来您需要进行一些度量学习...
  • 我已将整个数据集分为 20% 的测试和 80% 的训练。从未听说过度量学习?我不能为分类数据找到某种数值等价物吗?
  • 你确定你说的不是knn分类

标签: matlab octave classification knn ordinal


【解决方案1】:

我们可以使用局部敏感哈希 (LSH) + 编辑距离并假设每个 bin 代表不同的类别吗?我知道分类数据没有显示任何顺序,并且 LSH 中的箱是根据散列函数排列的。在我看来,找到给出有意义数量的 bin 的哈希函数就像学习度量空间一样。

【讨论】:

    【解决方案2】:

    您需要找到适合您数据的距离函数。二元指标变量的使用隐含地解决了这个问题。这样做的好处是允许您使用此类数据继续您可能基于矩阵的实现,但更简单的方法(适用于大多数基于距离的方法)是仅使用修改后的距离函数。

    这样的组合数不胜数。您需要尝试最适合您的方法。本质上,您可能希望对数值使用一些经典度量(通常应用归一化;但也可以将此归一化移动到距离函数中),加上其他属性的距离,并适当缩放。

    在基于距离的算法的大多数实际应用领域中,这是最困难的部分,优化您的特定领域的距离函数。您可以将其视为预处理的一部分:定义相似性。

    不仅仅是欧几里得距离。有多种集合论测量方法可能更适合您的情况。例如谷本系数、Jaccard 相似度、Dice 系数等。余弦也可能是一种选择。

    有专门讨论相似性搜索主题的整个会议 - 除了欧几里得向量空间之外,没有人声称这在任何事情上都是微不足道的(实际上,甚至不存在):http://www.sisap.org/2012

    【讨论】:

    • 感谢您的回答。我仍在为如何实际实现这一点而苦苦挣扎。我正在使用一个简单的 Matlab 函数“knnsearch”,它计算到每个点的欧几里得距离。现在,当然,我可以说男/女 = 0/1,或者银行 1 = 100,银行 2 = 010,银行 3 = 001。但是,我该如何使用它?我只需要一些关于从哪里开始实现距离函数的指导,以及是否仍然可以使用 Matlab 的函数......
    • 我不使用 Matlab,所以我不知道如何在那里做。欧几里得距离在物理 2d/3d 中是有意义的,但在更高维的非物理数据中并不是那么好。我个人不喜欢这些值的“位编码”。请注意,在您的示例中,男性/女性的银行属性(欧几里得距离 0 或 sqrt(2))的权重较低(距离 0 或 1)!
    【解决方案3】:

    将分类数据转换为数字的最直接方法是使用指示符向量。请参阅我在之前的评论中发布的参考资料。

    【讨论】:

    • 感谢 Shai - 我对您论文中的技术细节感到有些压力。请参阅下面的 cmets。
    • 对于每个分类变量,只需创建 n 个维度,其中变量取 n 个可能值。这些维度中的每一个都对应一个特定的值,它可以是 0(不存在)或 1(存在)。因此,您的 n 路分类变量现在是 n 个二元特征。现在您可以使用欧几里得距离或您喜欢的任何其他指标
    • @BenAllison 如果您的向量是二进制向量(即,仅由零和一组成),一个好的距离度量可以是 Hamming 距离:en.wikipedia.org/wiki/Hamming_distance。它可以非常容易和有效地计算。
    • 对,在这种情况下,我认为您会将这些二进制特征与连续特征混合在一起(参见 OP)。但是,是的,您可以使用很多指标,甚至可以像 @Anony-Mousse 建议的那样进行一些指标学习(尽管我会在走这条路之前先尝试标准指标)