在Scikit Learn中处理被动攻击在线学习者的类不平衡

3 投票
1 回答
1663 浏览
提问于 2025-04-18 04:30

我现在正在处理一个大规模的多类别图像分类问题。我使用的是在线学习策略,具体是用scikit-learn中的被动攻击算法,因为它比随机梯度下降(SGD)收敛得更快。我采用的是一对多(One Vs All,简称OVA)的方法,构建了N个OVA分类器(N是类别的数量)。

为了处理大量的训练数据,我把数据集分成分层的小批量,然后通过在线学习器(每个OVA分类器)进行多次迭代,直到验证批次的性能稳定下来。(模型的初始化和超参数选择是在第一个批次上完成的)我的主要评估指标是平均精度均值(MAP),也就是对每个OVA模型的sklearn.metrics.average_precision_score得分进行平均。

有了这个框架,每当我有新的标签可用时,我就可以创建一个新的批次,并通过部分拟合操作来运行它们,从而进一步提高模型的性能。

我担心的是,这种方法能否处理小批量中可能出现的类别不平衡问题,或者在未来添加更多小批量时是否会出现这种情况。我怀疑由于类别不平衡,模型可能会偏向于多数类,导致少数类的召回率很低。

一个快速的解决办法是在学习过程中使用class_weight='auto',但这只支持“SGD”实现,而不支持被动攻击实现。?考虑到这两者都使用相同的基础SGD实现,为什么会这样呢?

我想到的另一个选项是制作平衡的小批量,以确保模型不会偏向于多数类。

我希望能听听大家对这个架构的看法以及可能的缺点。 - MAP是正确的评估指标吗? - 如何在类别不平衡的情况下处理在线学习? - 有没有其他线性算法可以替代被动攻击和SGD,更适合这个问题?

谢谢!

1 个回答

4

被动攻击分类器的工作方式和你熟悉的大多数算法不太一样,它不会像那些算法那样“收敛”。实际上,如果你读过相关论文,就会知道被动攻击的目的是在更新时,尽量完全纠正错误,同时对权重向量的变化保持最小。需要注意的是,被动攻击中的正则化参数会让它在每个样本上不能完全纠正。

因此,被动攻击特别适合在线学习,而不是批量训练。所以,如果你在小批量数据上运行被动攻击,直到它稳定下来,这可能并不会帮助你提高模型的泛化准确率,甚至可能会有负面影响。

MAP是正确的衡量标准吗?

这完全取决于你的数据和需求。

有没有其他线性算法可以替代被动攻击和随机梯度下降(SGD),更适合这个问题?

这同样完全取决于你的数据和需求。

一个快速的解决办法是在学习过程中使用class_weight='auto',但这只支持“SGD”实现,而不支持被动攻击实现。为什么会这样,既然它们都使用相同的SGD基础实现?

是的,看看我对被动攻击的描述。被动攻击的学习方法不允许这种添加。虽然你可以通过对每个类别的正则化进行调整来实现,但我觉得这样做没有意义。如果你想了解更多,可以查看原始论文。

你可以搜索“类别不平衡”来找到更多处理这个问题的方法,但这都取决于你的数据。

如果你愿意使用Java,JSAT有一个直接支持多类别的被动攻击实现,叫做SPA。它可能对你的问题更准确,也可能不准确。

撰写回答