Python 文本分类 - 不属于任何类别的数据

数据挖掘 Python 分类 nlp 文本分类
2022-03-15 01:42:54

对于我面临的这个问题,我很难找到任何答案。

我有一些我正在测试的文本分类器,它们适用于适合任何预定义类别的数据,但是如果我输入,让我们说“fhjakdlfsah”,它仍然会将它分配给某个类别,因为我猜predict_proba 功能必须为所有类别加 1。

我在这里缺少什么吗?我很难找到解决方案,我想这是一件很常见的事情。现在我正在使用 sklearn 的梯度提升,并尝试按照其他人的建议将其包装在 onevsrestclassifier 中,但它仍然具有相同的东西,所有概率加起来为 1,并且它被分配了最高概率

基本上我正在寻找一种解决方案,可以说是的,这适合这些类别之一,或者不,这不适合这些类别中的任何一个。

任何帮助将不胜感激,因为我在这里陷入困境

谢谢!

2个回答

监督学习的主要假设是训练集是问题所有可能实例空间的代表性样本。

这就是为什么在常规分类设置中根本没有办法考虑“不在任何类别中”选项:模型学习的是区分训练集中看到的类别,仅此而已。在标准的one-vs-rest 多类设置中,重要的是要了解模型一般不会预测实例是否可能属于“A 类”,它只预测实例是否更有可能属于A 类与任何其他已知类相比这是一个常见的误解,但 one-vs-rest 并不能解决“不在任何班级”的问题。

有一些选项可以处理这个问题,但必须设计系统以便模型可以处理这种情况。一般来说,问题实际上是开集分类:在常规分类中,可能的类集是封闭的,如上所述。开放集分类设置的标准要低得多,而且通常更难,因为模型必须对它从训练数据中不知道的东西进行预测。这里有几个选项:

  • 将问题视为异常值检测问题:在运行常规分类器之前,消除看起来不像常规训练集案例的异常实例。
  • 多标签分类:在多标签分类中,一个实例可能属于零个、一个或多个类。为每个类训练一个二元分类器,并且一个实例可能不属于任何一个类。这比多类分类更灵活,但它仍然是闭集分类:例如,模型应该在训练集中看到不属于任何类的示例。
  • 一类分类是一种分类类型,其中模型“一般”学习识别单个类,而不是与任何其他类进行对比。这是正确的开集分类:如果一个模型针对每个已知类进行了训练,并且每个模型都将实例预测为负数,那么该实例不属于任何已知类。

有关于开放类分类的前沿研究,但是在生产中常用的一种解决方法是使用概率作为预测置信度,并且只预测模型有信心的类。例如,当您预测“fhjakdlfsah”时,与正确预测相比,它应该以较低的概率预测类别。因此,您总是会拥有一些模型无法预测的已识别数据子集,您可以将其称为聊天机器人中通常所说的辐射/回退。在聊天机器人中,回退通常由人工代理处理。

关键问题是预测通常正确的概率截止值应该是多少?应该是 0.7/ 0.8/ 其他吗?答案将来自您的特定用例。在几个测试数据集上,您需要预测类别和概率。然后绘制出辐射百分比和非辐射部分的准确率如何随着概率截止值的不同选择而变化。选择适合您的准确性需求以及可管理的辐射量的截止值。

如果您的模型没有很好地校准,您需要谨慎对待概率尺度。概率通常可能偏高。但是上面解释的情节仍然应该给你一个答案。