如何在分类机器学习算法中发现新的类?

How to discover new classes in a classification machine learning algorithm?

我正在使用 multiclass classifier(支持向量机,通过 One-Vs-All)来 classify 数据样本。假设我目前有 n 个不同的 classes.

但是,在我面临的情况下,新数据样本可能属于 new class n+1以前见过。

所以我想你可以说我需要一种在线学习形式,因为一开始没有适合所有数据的独特训练集。相反,我需要 SVM 动态适应将来可能出现的新 classes。

所以我想知道我是否以及如何...

  1. 确定新的数据样本不太适合现有的 classes,而是应该创建一个新的 class.

  2. 将新的 class 集成到现有的 classifier 中。

我能依稀想到一些可能是解决这个问题的思路:

  1. 如果二进制 SVM class 的 none(因为我在 OVA 案例中每个 class 都有一个)预测相当高的概率(例如> 0.5) 对于新的数据样本,我可以假设这个新的数据样本可能代表一个新的 class.

  2. 我可以为新 class 训练一个新的二进制 classifier 并将其添加到 multiclass SVM。

然而,这些只是我幼稚的想法。我想知道是否有一些 "proper" 方法来代替,例如使用聚类算法查找所有 classes.

或许我尝试为此使用 SVM 的方法甚至不适合此类问题?

非常感谢对此的帮助。

与任何其他机器学习问题一样,如果您没有质量标准,那就很糟糕。

当人们说 "classification" 时,他们想到的是监督学习:您可以根据一些基本事实来训练和检查您的算法。如果新的 classes 可以出现,这个基本事实是不明确的。想象一个 class 是 "horse",你看到很多马:黑色的马,棕色的马,甚至是白色的。突然你看到一匹斑马。哇!它是一匹新的 class 还是一匹不寻常的马?答案将取决于您将如何使用 class 标签。 SVM 本身无法决定,因为 SVM 不使用这些标签,它只产生它们。决定取决于人(或某些知道什么是 "good" 和 "bad" 的决策算法,也就是说,有自己的 "loss function" 或 "utility function")。

所以你需要一个主管。但你如何协助这位主管呢?我想到了两个选项:

  1. 异常检测。这可以帮助您及早出现新的 classes。在您的算法看到第一条斑马线后会发出警报:"There is something unusual!"。例如,in sklearn 从随机森林到 one-class SVM 的各种算法可用于检测异常观察。然后您的主管可以查看它们并决定它们是否值得组成一个全新的 class.

  2. 聚类。它可以帮助您决定拆分 classes。例如,在第一个斑马之后,您认为不值得制作一个新的 class。但随着时间的推移,你的算法已经积累了数十张他们的图像。因此,如果您 运行 对标记为 "horses" 的所有观察结果进行聚类算法,您最终可能会得到两个分离良好的聚类。是否应将条纹马从普通马中分离出来,变成新的class,这将再次由主管决定。

如果您希望此决定完全自动进行,则可以拆分 classes,前提是簇内平均距离与簇间距离的比率足够低。但只有当您首先拥有良好的距离度量时,它才会很好地工作。什么是 "good" 再次取决于您如何使用算法以及您的最终目标是什么。