我有一组约300k文本示例.如标题中所述,每个示例至少有一个标签,并且只有100个可能的唯一标签.我已经通过利用命名空间将这个问题简化为Vowpal Wabbit的二进制分类,例如:
从:
healthy fruit | bananas oranges jack fruitevil monkey | bipedal organism family guy...
至:
1 |healthy bananas oranges jack fruit1 |fruit bananas oranges jack fruit0 |evil bananas oranges jack fruit0 |monkey bananas oranges jack fruit0 |healthy bipedal organism family guy0 |fruit bipedal organism family guy1 |evil bipedal organism family guy1 |monkey bipedal organism family guy...
我正在使用大众提供的默认选项(我认为是在线SGD,具有平方损失功能).我正在使用平方损失,因为它非常类似汉明损失.
在训练之后,当我在相同的训练集上进行测试时,我注意到所有的例子都是用’0’标签预测的……这是一种最小化损失的方法,我想.在这一点上,我不知道该怎么做.我正在考虑使用成本敏感的一对一分类来尝试平衡类,但是由于存在2 ^ 100个标签组合,因此将多标签减少到多类是不可行的.我想知道是否有其他人有任何建议.
编辑:我终于有机会测试阶级失衡,特别是对于大众. vw非常糟糕地处理不平衡,至少对于高维度,稀疏填充的文本特征.我已经尝试过从1:1到1:25的比率,性能在1:2的比例下突然降低.
解决方法 如果强制它使用平方损失进行二元分类问题,任何线性模型都会“非常糟糕”地处理类不平衡.想想损失函数:如果99%的观测值为零,则在所有情况下预测0都会得到0.01的平方误差. Vowpal Wabbit不能做魔术:如果你要求它最小化平方误差损失,它确实会最小化平方误差损失,就像任何其他回归程序一样.以下是R中线性回归模型的相同“问题”的演示:
set.seed(42)rows <- 10000cols <- 100x <- matrix(sample(0:1,rows*cols,replace=TRUE),nrow=rows)y <- x %*% runif(cols) + runif(rows)y <- ifelse(y<quantile(y,0.99),1)lin_mod <- glm(y~.,data.frame(y,x),family='gaussian') #linear modellog_mod <- glm(factor(y)~.,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,0)) 0 1 9900 100
对于vowpal wabbit中的二进制分类问题,请使用–loss_function =“logistic”或–loss_function =“hinge”.您可以在事后使用汉明损失评估您的预测,但是将您的结果与总是预测为0的汉明损失进行比较可能会提供信息.
总结以上是内存溢出为你收集整理的机器学习 – 处理多标签分类中的类不平衡全部内容,希望文章能够帮你解决机器学习 – 处理多标签分类中的类不平衡所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)