在 Scikit learn 中处理 Passive Aggressive Online Learning 中的类不平衡

Posted

技术标签:

【中文标题】在 Scikit learn 中处理 Passive Aggressive Online Learning 中的类不平衡【英文标题】:Handling class imbalance in Passive Aggresive Online Learner in Scikit learn 【发布时间】:2014-06-13 05:57:19 【问题描述】:

我目前正在研究一个大规模的多类图像分类问题。我目前正在使用在线学习策略,利用 scikit learn 中的 Passive Aggressive 算法实现。 (因为与 SGD 实现相比,它的收敛速度更快)。我通过构建 N(类数)OVA 分类器来遵循 One Vs All (OVA) 方法。

为了处理大量的训练数据,我基本上将我的数据集分成分层的小批量,并通过在线学习器(每个 OVA)运行它们多次迭代,直到验证批量的性能下降。 (模型初始化和超参数选择在第一批完成) 我的衡量标准主要是 MAP 或平均平均精度。 (每个 OVA 模型的 sklearn.metrics.average_precision_score 得分的平均值)。

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

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

一种快速解决方法是在学习期间使用 class_weight='auto' 但这仅支持“SGD”实现,而不支持被动积极实现。 ?鉴于两者都使用相同的底层 sgd 实现,这是任何原因。

我能想到的其他选择是制作平衡的小批量,从而确保模型不偏向多数类。

如果能对架构及其可能存在的缺点有所了解,那就太好了。 - MAP 是正确的衡量标准吗? - 如何在不平衡的课堂场景中处理在线学习。 - 任何其他可能更适合该问题的线性算法,而不是 Passive Aggressive 和 SGD

谢谢

【问题讨论】:

【参考方案1】:

Passive Aggressive 分类器不像您习惯的大多数算法那样“收敛”。实际上,如果您阅读论文,PA 的重点是进行更新以完全纠正损失,但会导致权重向量范数的最小变化。请注意,PA 中的正则化参数使其无法在每个示例的基础上进行完全校正。

通过这种方式,PA 专门用于在线训练而不是批量训练,因此 - 在小批量上运行 PA 直到其稳定可能不会帮助(并且可能会损害)您的泛化准确性。

MAP 是正确的衡量标准吗

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

任何其他可能更适合该问题的线性算法,而不是 Passive Aggressive 和 SGD

完全取决于您的数据和需求

一种快速解决方法是在学习期间使用 class_weight='auto' 但这仅支持“SGD”实现,而不支持被动积极实现。 ?鉴于两者都使用相同的底层 sgd 实现,这是任何原因。

是的,请参阅我对 PA 的描述。 PA 的学习方法不允许添加。虽然您可以通过按类更改正则化来实现它,但我认为这没有任何意义。如果您需要了解更多信息,请参阅原始论文。

您可以搜索“类别不平衡”以找到更多尝试解决该问题的方法,但这完全取决于您的数据。

如果你愿意使用 Java,JSAT 有一个直接多类实现的 PA,称为 SPA。对于您的问题,它可能更准确,也可能不更准确。

【讨论】:

以上是关于在 Scikit learn 中处理 Passive Aggressive Online Learning 中的类不平衡的主要内容,如果未能解决你的问题,请参考以下文章

多处理 scikit-learn

数据预处理(Python scikit-learn)

在 Scikit learn 中处理 Passive Aggressive Online Learning 中的类不平衡

在 scikit-learn 中处理不平衡测试集的最佳方法

scikit-learn 可以处理多少文本?

Python / Scikit-Learn - 无法处理多类和连续的混合