8

我已经看到了一些关于多类设置中类不平衡的问题。但是,我有一个多标签问题,那么在这种情况下您将如何处理呢?

我有一组大约 300k 的文本示例。正如标题中提到的,每个示例至少有一个标签,并且只有 100 个可能的唯一标签。我通过利用命名空间将这个问题简化为 Vowpal Wabbit 的二进制分类,例如

从:

healthy fruit | bananas oranges jack fruit
evil monkey | bipedal organism family guy
...  

至:

1 |healthy bananas oranges jack fruit
1 |fruit bananas oranges jack fruit
0 |evil bananas oranges jack fruit
0 |monkey bananas oranges jack fruit
0 |healthy bipedal organism family guy
0 |fruit bipedal organism family guy
1 |evil bipedal organism family guy
1 |monkey bipedal organism family guy
...  

我正在使用大众提供的默认选项(我认为是在线 SGD,具有平方损失函数)。我使用平方损失,因为它非常类似于汉明损失。

训练后,在同一训练集上进行测试时,我注意到所有示例都使用“0”标签进行预测......我猜这是最小化损失的一种方法。在这一点上,我不知道该怎么办。我正在考虑使用成本敏感的一对多分类来尝试平衡类,但是将多标签减少到多类是不可行的,因为存在 2^100 个标签组合。我想知道是否还有其他人有任何建议。

编辑:我终于有机会测试类不平衡,特别是对于vw. vw对不平衡的处理非常糟糕,至少对于高维、稀疏的文本特征来说是这样。我尝试了从 1:1 到 1:25 的比例,但在 1:2 的比例下性能会突然下降。

4

3 回答 3

6

如果你强迫它使用平方损失来解决二元分类问题,任何线性模型都会“非常糟糕”地处理类不平衡。想想损失函数:如果 99% 的观测值为零,那么在所有情况下预测为 0 的平方误差为 0.01。Vowpal Wabbit 不能做魔术:如果你要求它最小化平方误差损失,它确实会最小化平方误差损失,就像任何其他回归程序一样。

这是使用 R 中的线性回归模型演示相同的“问题”:

set.seed(42)
rows <- 10000
cols <- 100
x <- matrix(sample(0:1, rows*cols, replace=TRUE), nrow=rows)
y <- x %*% runif(cols) + runif(rows)
y <- ifelse(y<quantile(y, 0.99), 0, 1)
lin_mod <- glm(y~., data.frame(y, x), family='gaussian') #Linear model
log_mod <- glm(factor(y)~., data.frame(y, x), family='binomial') #Logistic model

比较线性与逻辑模型的预测表明,线性模型总是预测 0,而逻辑模型预测 0 和 1 的正确组合:

> table(ifelse(predict(lin_mod, type='response')>0.50, 1, 0))

    0 
10000 
> table(ifelse(predict(log_mod, type='response')>0.50, 1, 0))

   0    1 
9900  100 

用于vowpal wabbit--loss_function="logistic"--loss_function="hinge"的二元分类问题。您可以使用汉明损失在事后评估您的预测,但将您的结果与始终预测为 0 的汉明损失进行比较可能会提供更多信息。

于 2014-03-31T16:54:21.230 回答
1

我认为您已将问题减少为 100 个二进制分类问题?这将是在多标签设置中做事的标准方式。

如果您的评估指标确实是 Hamming 损失,那么您实际上可能会更好地预测每个二元问题的大多数。对于高度不平衡的问题,很难击败它。但在大多数情况下,您的评估指标本身是不同的。例如,您可能想要优化 F1 度量(微观或宏观)。在这种情况下,您可以尝试以某种方式平衡每个二进制问题的 +ve 和 -ve 样本。有几种方法可以做到这一点。

正如 Slater 提到的,您可以尝试针对每个学习问题优化 AUC。在这种情况下,您将学习一个以实例为输入的实值函数。现在,您可以将其阈值设置为不同的值并尝试性能,而不是默认值(通常为 0)。

事实上,您甚至可以尝试对您优化的正常最小二乘法的“不同”阈值。这个阈值虽然很重要,但您必须通过交叉验证来选择它。

此外,您不能更改阈值,但可以更改不同学习问题中示例的“权重”。例如,如果您发现“健康”标签出现在 1k 个样本中,而没有出现在 29k 个样本中,只需对带有“健康”标签的示例使用 29 的权重,对于没有标签的示例使用 1 的权重。

我不知道你怎么会在大众汽车中做到这一点。你必须弄清楚。

于 2013-12-16T22:00:25.877 回答
0

一般来说,如果您要考虑训练数据中的类别不平衡,则意味着您必须更改为更适合的损失函数。特别是对于类别不平衡,您希望将损失函数更改为 ROC 曲线下的区域。专门设计用于解决此问题。

有一个多标签版本,但如果您已经将其简化为二进制分类,它应该可以开箱即用。

这是一篇更全面地解释这个概念的维基百科文章。

这是相关的sklearn 文档,它可能不太有用,因为我不确定这是用什么语言发生的。

于 2013-12-09T01:11:40.240 回答