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


10

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

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

我想知道是否有一种方法可以按照这些术语进行分类,或者是否应该考虑这些新的分类数据再次进行培训。


1
可以city根据某些功能转换为数字吗?像city' = f(latitude, longitude)这样,你可以创建任何一个城市新的价值
穆罕默德阿塔尔玛嘎

@MohammadAthar在这里给出了完美的解决方案,希望OP能够看到!
Francesco Pegoraro

Answers:


11

这是一个很好的问题。实际上,这个问题已经存在了一段时间,我还没有找到理想的解决方案。但很高兴分享我的经验:

  • 尽可能避免一次热编码(与上面建议的相反)。原因是它不起作用。只有在训练数据中已经存在所有这些子级别的情况下,具有“一键编码”功能的模型才起作用。该模型将无法进行预测,除非以某种方式对其进行了手动调整。如果您进行搜索,您会发现许多人在将他们的数据分为训练/测试时遇到了这个问题,并且面临着某个特定功能的某些子级别在训练拆分中不存在的问题,随后未能对测试进行预测。顺便说一句,如果您具有很高的基数特征(例如,您的城市有200个城市名称),这将不必要地增加数据的维度!如果由于某些原因您可能需要进行一次热编码,请记住这些。
  • 使用其他编码方法。也许尝试更多地了解可解决此问题的其他方法,至少就目前而言,例如基于目标的编码,哈希(请参阅下面的一些参考资料)。如果您使用Python,则有一个不错的软件包提供了mant编码选项。您可能会惊讶地发现其他简单的方法通常效果很好。

  • 重新训练模型。从理论上讲,训练您的火车/集合应该具有相同的分布(大多数情况下,这被认为是目标分布,但是关于变量也可以如此)。现在,随着新项目的投入使用,您的测试(看不见的)数据分布已经改变。然后,最好再次训练该模型,以便考虑这些新城市。

  • 将新添加的子类别(和最不频繁的子类别)放到其他。虽然从理论上讲较早的观点是正确的,但在大多数情况下,(该特定类别的)测试分布很可能不会发生急剧变化,例如,只有极少的项目排在训练集中的类别顶部。也许像您的情况一样,您可能拥有100个城市,但随着时间的推移,只有很少的新城市出现。我会考虑的是查看该特定类别的X分位数,然后将频率最低的类别放入“ 其他”子类别。假设您新添加的数据点很少,那么它将在很大程度上进入其他组。这样做肯定会使您失去一定的粒度,但是再一次学习的重点是,不仅您的模型学习了训练数据,而且最重要的是能够很好地归纳看不见的数据以及这些新添加的类别是非常重要的数据点,将它们完全归入“ 其他”组是不会受到伤害的。

  • 其他近期尚未成熟的解决方案,例如Cat2Vec(从NLP的Word2Vec借用)相似性编码。这些都是非常近,检查纸张为前和github上和一个例子(基于Word2Vec)在Kaggle,这后者及其实现。前者的想法是将类别转换为向量。正如我不得不说的那样,工作确实很有意义,但是我没有使用它的经验。后者,即所谓的dirty_cat,看起来很有希望并且易于使用。我不清楚在测试数据中包含不可见的基数类别是否健壮!

PS:我想补充一点,在第一个评论中给出的地理位置上的城市概念真的很好,并且实际上并不复杂,因为它们有许多Python API,例如Google或HERE允许您这样做。但是请注意,这只是设计新功能的一种方式,当然不能被城市功能本身取代。

检查第一第二第三第四的有趣参考(无特定顺序!)

所有上述要点都是切实可行的解决方案,在理论上是正确的,在一定程度上需要进一步讨论。而且我非常乐于了解更多。


1
如何创建类似城市的集群?就像我们有一个新城市一样,这与我们已经拥有的城市没有什么不同,我们可以与最近的匹配城市进行交叉核对吗?
Aditya

欢乐Aditya。这也是另一个好主意。我不知道新的“相似编码”,可能是他们在做完全一样的事情。检查他们的教程。还要注意的一点是,在所有距离都不具有与数值相似的含义之后,必须注意将哪种聚类用于分类数据(如k模式)。
TwinPenguins

感谢您的出色回答。我该如何进行再培训?我的意思是,假设我有一个新候选人,并且我想预测他/她的好坏,如果我没有他/她的真实标签表明好不好,该如何训练我的模型?我看不到将这些新数据包括进去进行重新训练的方法,并且我将失去预测的重点。我错了吗?
玛丽莎(Marisa)

别客气。关于再培训:从字面上看,它意味着重新开始,混合所有数据以确保您有新数据,然后再次开始学习。您提到的另一点是,您没有该特定新数据点的真实标签:这本身就是一个完全不同的故事。您可以为该数据点添加标签的方法是查找最相似的数据点,然后像非常简单的KNN算法一样从那里获取标签。
TwinPenguins

4

最简单的操作(通常是一个不错的起点)是对城市进行单点编码,其中每个城市都将成为一个要素,并且其值为1(此人来自该城市)或0(而不是来自该城市)该城市)。如果一个新的城市出现在训练集中不存在的测试集中,那么该人在训练集中的所有城市将只有0。这似乎很奇怪,但是,如果该城市不在训练范围内,那么来自该城市的人就不应承受任何压力。

下一步将按照Mohammad Athar的建议进行,并在您的训练集中了解到地理上与其他城市的距离。这将变得更加复杂,因此我将让其他人对此进行评论。


从简单开始并从那里成长是一个很好的建议!
Escachator

0

您应该签出Vowpal Wabbit,它使用哈希技巧和自适应学习率来处理非常好的新功能。

当出现新功能时(在训练或测试时),它不仅不会崩溃,而且还将开始更新其权重。最重要的是,它的速度很快。但是,它仅实现线性模型的变体,因此您在那方面受到限制。一个非常强大的工具,需要了解

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.