如何使用不固定的分类数据进行分类?

数据挖掘 机器学习 分类 分类数据
2021-10-05 04:02:13

我对分类数据和数值数据都有分类问题。我面临的问题是我的分类数据不固定,这意味着我要预测其标签的新候选人可能有一个事先没有观察到的新类别。

例如,如果我的分类数据是sex,则唯一可能的标签是female,maleother,无论如何。但是,我的分类变量city可能会发生,我试图预测的人有一个我的分类器从未见过的新城市。

我想知道是否有办法按照这些术语进行分类,或者考虑到这些新的分类数据,我是否应该再次进行训练。

3个回答

这是一个很好的问题;事实上这个问题已经存在了一段时间,我还没有找到完美的解决方案。然而,非常乐意分享我的经验:

  • 尽可能避免 one-hot-encode (与上面的建议相反)。原因是它不起作用。仅当所有这些子级别都存在于训练数据中时,具有单热编码功能的模型才有效。该模型将无法进行预测,除非以某种方式对其进行手动调整。如果您搜索,您会发现很多人在将数据拆分为训练/测试时遇到了这个问题,并且面临特定特征的某些子级别在训练拆分中不存在并且随后未能对测试进行预测的问题。顺便说一句,如果你有非常高的基数特征(比如你的城市有 200 个城市名称),这将不必要地增加数据的维度!如果由于某些原因您可能需要进行一次热编码,请记住这些。
  • 使用其他编码方法也许尝试更多地了解其他对这个问题很健壮的方法,至少暂时像基于目标的编码、散列(参见下面的一些参考资料)。如果你使用 Python,有一个不错的提供 mant 编码选项。您可能会惊讶地发现,其他简单的方法通常也能正常工作。

  • 重新训练你的模型从理论上讲,在学习您的训练/集合时应该具有相同的分布(通常这被认为是目标分布,但对于变量也可能是正确的)。现在随着新项目的出现,您的测试(看不见的)数据分布发生了变化。然后最好再次重新训练模型,以便将那些新城市考虑在内。

  • 将新添加的子类别(和最不常见的子类别)放入Others虽然前面的观点在理论上是正确的,但在大多数情况下,(该特定类别的)测试分布很可能不会发生太大变化,例如,很少有项目在训练集中的类别中名列前茅。也许就像您的情况一样,您的城市特征中可能有 100 个城市,而随着时间的推移,只有很少的新城市出现。我会考虑查看该特定类别的 let's X 分位数,并将最不常见的分位数放入Others子类别。假设您新添加的数据点很少,它将非常多地进入其他团体。这样做你肯定会失去一定程度的粒度,但再次学习的重点是,你的模型不仅可以学习训练数据,而且最重要的是能够很好地概括看不见的数据,如果这些新添加的类别是非常数据点,将它们完全分组到其他组中不会受到伤害。

  • 其他近期尚未成熟的解决方案,例如Cat2Vec(借自 NLP 的 Word2Vec)相似度编码这些都是最新的,请查看前者及其github的论文和Kaggle 中示例(基于 Word2Vec) ,以及后者及其实现的论文前者的想法是将类别转换为向量。尽管我不得不说工作真的很有意义,但我没有使用它的经验。后者,即所谓的dirty_cat,看起来很有前途且易于使用。我不清楚你的测试数据中是否有看不见的主要类别!

PS:我想补充一点,第一条评论中给出的将城市与地理位置相结合的想法非常好,实际上并不复杂,因为它们有许多 Python API,例如 Google 或 HERE 允许您这样做。但需要注意的是,这只是设计新功能的一种方式,当然不会被城市功能本身所取代。

检查first , second , third , Fourth的有趣参考(没有特定顺序!)

以上各点都是切实可行的解决办法,具体理论上是正确的,肯定有待进一步讨论。我很高兴能学到更多。

最简单的事情(通常是一个很好的起点)只是对您的城市进行一次热编码,其中每个城市都成为一个单一的特征,并且具有 1(该人来自该城市)或 0(不是来自该城市)的值那个城市)。如果一个新城市出现在训练集中不存在的测试集中,则该人对于训练集中的所有城市将只有 0。这可能看起来很奇怪,但是如果那个城市不在训练集中,那么来自那个城市的人就不应该被赋予权重。

下一步将按照 Mohammad Athar 的建议进行,并了解您的训练集中与其他城市的地理接近程度。那将要复杂得多,所以我会让其他人对此发表评论。

您应该查看 Vowpal Wabbit,它使用散列技巧和自适应学习率处理非常好的新功能。

当新功能出现时(在训练或测试时),它不仅不会崩溃,它还会开始更新它的权重。最重要的是,它的速度非常快。它只实现了线性模型的变体,所以你在这方面受到限制。一个非常强大的工具来了解