处理多标签分类中的类不平衡

ric*_*izy 7 classification machine-learning vowpalwabbit text-classification

我在多类设置中看到了关于类不平衡的几个问题.但是,我有一个多标签问题,所以在这种情况下你会怎么处理?

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

从:

healthy fruit | bananas oranges jack fruit
evil monkey | bipedal organism family guy
...  
Run Code Online (Sandbox Code Playgroud)

至:

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
...  
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:我终于有机会测试类失衡,特别是vw.vw处理不平衡非常糟糕,至少对于高度维度,人口稀少的文本特征.我已经尝试过从1:1到1:25的比率,性能在1:2的比例下突然降低.

Zac*_*ach 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
Run Code Online (Sandbox Code Playgroud)

比较线性模型与逻辑模型的预测结果表明,线性模型始终预测 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 
Run Code Online (Sandbox Code Playgroud)

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

  • @avocado 这取决于你想从模型中得到什么。请注意原始问题中的引用“我注意到所有示例都是用“0”标签预测的......我猜这是最小化损失的一种方法”。我的观点很简单,最小化均方根误差往往会得到这个结果。如果你不想要这个,你需要使用另一个损失函数。 (2认同)

Sla*_*off 1

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

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

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

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

  • @iliasfl 事实上不是。我可能有点过于简单化了,但 auc 作为一个指标是专门选择来根除随机猜测和类别不平衡问题的,当简单的准确性在这些方面失败时。当您训练一个严重不平衡的模型并优化准确性时,模型很快就会收敛于仅选择一个类,正如问题中所发生的那样。相反,如果使用 AUC 而不是准确性作为评估指标,这个问题就会消失。如果您不相信,请想一想当您随机猜测或猜出一个数字的全部时会发生什么。 (3认同)
  • AUC 并不是“专门”为不平衡数据集设计的。这是关于推迟关于精确率/召回率权衡的决定(直到一些领域专家告诉您误报与漏报之间的成本是多少)。如果您知道所需的精确度/召回率水平,则不需要 AUC 来选择模型。拥有不平衡的数据集只需要监控两个量,而不是一个精度/召回率、灵敏度/特异性等。总结为 AUC 或 F 分数等一个量很容易误导您。所讨论的问题是完全不同的。 (2认同)