来自 200 多个类别的高度不平衡数据集

数据挖掘 机器学习 多类分类 阶级失衡 采样
2022-02-18 02:42:19

我有一个文本数据集,我需要在其中训练一个分类器来将标题分类。数据集形状超过 575000。这里有 256 个目标类。问题是数据集高度不平衡。对于目标X1,它有 171793 条记录,X2 有 101575,........Xn-1 有 2,Xn 有 2 条记录考虑目标值计数是按降序排列的。

为了处理不平衡的数据集,过采样和欠采样适用于多类,比如 3 个类。但就我而言,有 256 个班级。在这种情况下如何对我的数据集进行采样?如何以某种方式对数据集进行采样,以便我的模型对所有目标都稳定?

我是否必须从此数据集中删除值计数为 2 - 100 的类?并应用欠采样/过采样。有什么方法可以处理这类情况吗?

3个回答

你描述的情况是一个小样本学习问题:你有很多类,其中一些只有几个例子。

使用孪生神经网络的相似性度量学习非常适合这项任务。这个想法是学习示例之间的一般相似性度量,然后将新示例分类为属于训练集中“最接近”样本的类别。这似乎有点复杂,但它可能是“跨”类学习的最佳方式。

我在上面分享的链接适用于 NLP 问题,因此应该能够很容易地重用它。

其实200也不算多。这更多地取决于这些是如何分配的。如何从原始文本中提取特征?例如:嵌入器为您提供固定大小的数字向量,它们非常适合重采样。

没有免费的午餐

您不能说重采样可能会损害您的决策空间,除非您实际尝试过。我建议你做简单的重采样,SMOTESVM然后是Tomek-Links. 运行它并比较在weightedmode 中计算的指标。然后我们将决定下一步该做什么。

尽管建议对数据进行抽样或给予额外的权重来处理不平衡的数据集,但这并不是好方法。我建议您在学习过程中使用适当的损失函数来处理不平衡的数据集,而不是对异常类进行采样。

引入了许多有用的指标来评估不平衡数据集的分类方法的性能。其中一些是KappaCENMCENMCCDP

免责声明:

如果您使用 python,PyCM模块可以帮助您找出这些指标。

这是一个从该模块获取推荐参数的简单代码:

>>> from pycm import *

>>> cm = ConfusionMatrix(matrix={"Class1": {"Class1": 1, "Class2":2}, "Class2": {"Class1": 0, "Class2": 5}})  

>>> print(cm.recommended_list)
["Kappa", "SOA1(Landis & Koch)", "SOA2(Fleiss)", "SOA3(Altman)", "SOA4(Cicchetti)", "CEN", "MCEN", "MCC", "J", "Overall J", "Overall MCC", "Overall CEN", "Overall MCEN", "AUC", "AUCI", "G", "DP", "DPI", "GI"]

之后,您想用作损失函数的每个参数都可以按如下方式使用:

>>> y_pred = model.predict      #the prediction of the implemented model

>>> y_actu = data.target        #data labels

>>> cm = ConfusionMatrix(y_actu, y_pred)

>>> loss = cm.Kappa             #or any other parameter (Example: cm.SOA1)