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

Machine learning 多标签分类中类别不平衡的处理,machine-learning,classification,text-classification,vowpalwabbit,Machine Learning,Classification,Text Classification,Vowpalwabbit,我看到了一些关于多班级环境中班级不平衡的问题。但是,我有一个多标签的问题,那么在这种情况下,您将如何处理它 我有一组大约300k的文本示例。如标题所述,每个示例至少有一个标签,并且只有100个可能的唯一标签。通过利用名称空间,我将这个问题简化为Vowpal Wabbit的二进制分类,例如 发件人: 致: 我使用的是大众提供的默认选项(我认为是在线SGD,带有平方损失函数)。我使用平方损失,因为它非常类似于汉明损失 训练后,当在同一训练集上进行测试时,我注意到所有的例子都是用“0”标签预测的。。。

我看到了一些关于多班级环境中班级不平衡的问题。但是,我有一个多标签的问题,那么在这种情况下,您将如何处理它

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

发件人:

致:

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

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


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

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

有一个多标签版本,但是如果你已经将其简化为二进制分类,那么它应该是开箱即用的

下面是一个更全面地解释这个概念的例子


这是相关的,可能没什么帮助,因为我不确定这是在什么语言中发生的。

我想你已经把这个问题减少到100个,二进制分类问题了?这将是在多标签设置中执行操作的标准方式

如果您的评估指标真的是汉明损失,那么您最好只预测每个二进制问题的多数。对于高度不平衡的问题来说,这是很难克服的。但在大多数情况下,您的评估指标本身是不同的。例如,您可能希望优化F1度量(微观或宏观)。在这种情况下,您可以尝试以某种方式平衡每个二进制问题的+ve和-ve样本。有几种方法可以做到这一点

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

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

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


我不知道你在大众是怎么做到的。你必须找出答案。

任何线性模型如果你强迫它在二元分类问题中使用平方损失,它将“非常糟糕地”处理类不平衡。想想损失函数:如果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

对于vowpal wabbit中的二进制分类问题,请使用
--loss\u function=“logistic”
--loss\u function=“铰链”
。您可以在事后使用汉明损失评估您的预测,但将您的结果与始终预测0的汉明损失进行比较可能会提供信息。

AUC不是“专门”为不平衡数据集设计的。它是关于推迟关于精确性/召回权衡的决定(直到一些领域专家告诉您误报与误报之间的成本)。如果您知道所需的精度/召回水平,则不需要AUC进行型号选择。拥有不平衡的数据集只需要监控两个数量,而不是一个精度/召回率、敏感性/特异性等。总结成一个数量,如AUC或F分数,很容易误导您。问题是完全不同的。@iliasfl事实并非如此。我可能有点过于简单化了,但auc作为一个指标被特别选择来消除随机猜测和类不平衡的问题,当简单的准确性在这些方面失败时。当您训练一个严重不平衡的模型,并为精确性进行优化时,模型会快速收敛到只选择一个类,正如问题中所发生的那样。相反,如果使用AUC作为评估指标,而不是准确性,则此问题将消失。如果你不相信,想想当你随机猜测,或者猜测一个数字时会发生什么。我可以完全去掉
0
标签。标签是二进制压缩中的名称空间。你能找到你问题的答案吗?看起来我们还没有一个可靠的答案。@ML\u Pro:use
--loss\u function logistic
。在不平衡分类中,线性模型比logistic更糟糕,有什么特别的原因吗?或极小值
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
...  
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
> 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