未知类别的分类

机器算法验证 分类 异常值
2022-04-15 12:04:07

我想知道如何训练一个能够识别几个类和不属于任何现有类的记录的分类器。

假设有2个类:

  • 高的
  • 低的

但是可能会发生某些记录不属于这些类中的任何一个,因此我们需要第三种状态,例如未识别其他

  • 高的
  • 低的
  • 其他

如何训练这样的分类器?我猜这个问题也可能与异常检测有关,因为您识别出与预期不同的示例。

4个回答

一个可行的替代方案是创建两个模型:

  • 高与低及其他
  • 低与高及其他

你会得到概率如果两个概率都不高于阈值(例如),您可以将实例标记为P(High|Data)P(Low|Data)50%Unknown


R中的示例

kernlabR 中使用's的示例ksvm(任何概率分类器都可以)。

library(kernlab)

#our data
x = as.matrix(iris[,-c(2,4,5)])
y = iris$Species

#our new classes
ysetosa = (y == "setosa") + 0
yversic = (y == "versicolor") + 0

#our two models
fitsetosa = ksvm(y = ysetosa, x = x, type = "C-bsvc", prob.model = TRUE)
fitversic = ksvm(y = yversic, x = x, type = "C-bsvc", prob.model = TRUE)

#the class predictions
predsetosa = predict(fitsetosa, x, type = "probabilities")
predversic = predict(fitversic, x, type = "probabilities")

#the unknown probability is 1 minus the other probabilities
pred = cbind(setosa = predsetosa[,2L], versicolor = predversic[,2L], unknown = 1 - predsetosa[,2L] - predversic[,2L])

tail(pred)

#> tail(pred)
#            setosa  versicolor   unknown
#[145,] 0.009275878 0.005356246 0.9853679
#[146,] 0.009058278 0.141930931 0.8490108
#[147,] 0.009945749 0.101307355 0.8887469
#[148,] 0.009903443 0.034164283 0.9559323
#[149,] 0.009027848 0.002268708 0.9887034
#[150,] 0.009679991 0.028774113 0.9615459

我们知道最后 50 个示例iris既不是 setosa 也不是 versicolor,这反映在各自的概率中。


问题

差异会产生负概率。存在更好的概率耦合方法,应改为使用。我相当确定您可以编辑kernlab那些(主要基于二进制概率)不等于 1,这实际上会导致我创建的示例。

是的,看起来像异常检测问题。您还可以尝试为您的第三类生成人工样本并使用它们训练您的模型。当然,另一个问题是如何生成它。但这在很大程度上取决于您解决的问题。

这取决于您的分类器。任何为每个类分配权重然后使用决策规则的方法都可以修改为您的方法。例如,随机森林通常使用多数投票。假设您有一个包含 1000 个决策树的设备。您可以修改该方法,以便仅当您的一个类被至少 600 个决策树预测时才使用多数投票,否则如果投票计数太接近,即两者都在 400 和 600 之间,则输出“未知”。

可能您根本不需要更改分类器,只需更改您解释结果的方式即可。例如。如果你有 2 个分类器,第一个预测训练样本属于它的类的概率为 10%,第二个预测概率为 9%,那么似乎训练样本不属于任何一个类,所以你可以标记它作为“其他”。