我对分类数据和数值数据都有分类问题。我面临的问题是我的分类数据不固定,这意味着我要预测其标签的新候选者可能具有一个新类别,而该类别之前没有被观察到。
例如,如果我的分类数据为sex
,则无论如何female
,唯一可能的标签将是male
和other
。但是,我的分类变量是city
这样的,以至于我试图预测的人可能拥有一个我的分类器从未见过的新城市。
我想知道是否有一种方法可以按照这些术语进行分类,或者是否应该考虑这些新的分类数据再次进行培训。
我对分类数据和数值数据都有分类问题。我面临的问题是我的分类数据不固定,这意味着我要预测其标签的新候选者可能具有一个新类别,而该类别之前没有被观察到。
例如,如果我的分类数据为sex
,则无论如何female
,唯一可能的标签将是male
和other
。但是,我的分类变量是city
这样的,以至于我试图预测的人可能拥有一个我的分类器从未见过的新城市。
我想知道是否有一种方法可以按照这些术语进行分类,或者是否应该考虑这些新的分类数据再次进行培训。
Answers:
这是一个很好的问题。实际上,这个问题已经存在了一段时间,我还没有找到理想的解决方案。但很高兴分享我的经验:
使用其他编码方法。也许尝试更多地了解可解决此问题的其他方法,至少就目前而言,例如基于目标的编码,哈希(请参阅下面的一些参考资料)。如果您使用Python,则有一个不错的软件包提供了mant编码选项。您可能会惊讶地发现其他简单的方法通常效果很好。
重新训练模型。从理论上讲,训练您的火车/集合应该具有相同的分布(大多数情况下,这被认为是目标分布,但是关于变量也可以如此)。现在,随着新项目的投入使用,您的测试(看不见的)数据分布已经改变。然后,最好再次训练该模型,以便考虑这些新城市。
将新添加的子类别(和最不频繁的子类别)放到其他。虽然从理论上讲较早的观点是正确的,但在大多数情况下,(该特定类别的)测试分布很可能不会发生急剧变化,例如,只有极少的项目排在训练集中的类别顶部。也许像您的情况一样,您可能拥有100个城市,但随着时间的推移,只有很少的新城市出现。我会考虑的是查看该特定类别的X分位数,然后将频率最低的类别放入“ 其他”子类别。假设您新添加的数据点很少,那么它将在很大程度上进入其他组。这样做肯定会使您失去一定的粒度,但是再一次学习的重点是,不仅您的模型学习了训练数据,而且最重要的是能够很好地归纳看不见的数据以及这些新添加的类别是非常重要的数据点,将它们完全归入“ 其他”组是不会受到伤害的。
其他近期尚未成熟的解决方案,例如Cat2Vec(从NLP的Word2Vec借用)或相似性编码。这些都是非常近,检查纸张为前和github上和一个例子(基于Word2Vec)在Kaggle,这纸后者及其实现。前者的想法是将类别转换为向量。正如我不得不说的那样,工作确实很有意义,但是我没有使用它的经验。后者,即所谓的dirty_cat,看起来很有希望并且易于使用。我不清楚在测试数据中包含不可见的基数类别是否健壮!
PS:我想补充一点,在第一个评论中给出的地理位置上的城市概念真的很好,并且实际上并不复杂,因为它们有许多Python API,例如Google或HERE允许您这样做。但是请注意,这只是设计新功能的一种方式,当然不能被城市功能本身取代。
所有上述要点都是切实可行的解决方案,在理论上是正确的,在一定程度上需要进一步讨论。而且我非常乐于了解更多。
最简单的操作(通常是一个不错的起点)是对城市进行单点编码,其中每个城市都将成为一个要素,并且其值为1(此人来自该城市)或0(而不是来自该城市)该城市)。如果一个新的城市出现在训练集中不存在的测试集中,那么该人在训练集中的所有城市将只有0。这似乎很奇怪,但是,如果该城市不在训练范围内,那么来自该城市的人就不应承受任何压力。
下一步将按照Mohammad Athar的建议进行,并在您的训练集中了解到地理上与其他城市的距离。这将变得更加复杂,因此我将让其他人对此进行评论。
您应该签出Vowpal Wabbit,它使用哈希技巧和自适应学习率来处理非常好的新功能。
当出现新功能时(在训练或测试时),它不仅不会崩溃,而且还将开始更新其权重。最重要的是,它的速度很快。但是,它仅实现线性模型的变体,因此您在那方面受到限制。一个非常强大的工具,需要了解
city
根据某些功能转换为数字吗?像city' = f(latitude, longitude)
这样,你可以创建任何一个城市新的价值