问题标签 [imbalanced-data]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
731 浏览

tensorflow - 用正确的损失函数对抗类别不平衡:IoU、Dice 还是 2-class Dice?

我目前正在写我的学士论文,并在试图了解损失函数在类不平衡和类不平衡本身方面的差异时遇到了一些困难。

我正在使用 U-Net ( https://arxiv.org/pdf/1505.04597.pdf ) 的变体解决分割问题。

我的数据集包含 11 个类,其中一个类的频率远低于大多数其他类。我的网络的输入是一个 np 数组,形状为 (700,512,512,3),用于输入 rgb 图像,形状为 (700,512,512,11),用于地面实况标签。地面实况的 11 个通道中的每一个都经过二进制编码(1 表示存在特定类别,0 表示不存在)。因此,每个图像的每个类都有一个掩码。在大多数掩码中,1 的数量远远少于 0 的数量。

首先关于类不平衡:

我还没有找到术语“类不平衡”的任何明确定义。在我看来,三种解释是可能的:

  1. 在所有 700 个输入图像中,一个类别的频率远低于大多数其他类别。
  2. 一张图片的一张mask内,0的个数远高于1的个数
  3. 在所有输入图像中,对于一类,0 的(平均)数量远高于 1 的数量

对于这些解释中的每一个,我都可以想象出问题。在谈论阶级不平衡时,通常指的是哪一个?那将如何导致问题?

现在损失函数。我试图理解的损失函数是:

在我的研究中,我读到 IoU Loss 在面对不平衡的数据集时会出现问题。我也读过 Dice Loss 在这种情况下表现更好,但我找不到解释。它只是被贬低为“常识”。我假设 2-class Dice loss 会更好,因为它从两个角度考虑二元问题,在一定程度上补偿了类不平衡。

我的假设主要基于我练习的一个例子(见下文)是:

使用 IoU,与假阴性相比,假阳性预测的误差更小。但是,对于具有少量像素的类别,接收到误报预测的概率更高,因此网络可能会接受误报。Dice Loss 对假阴性和假阳性的惩罚比 IoU Loss 少,并且假阳性错误和假阴性错误之间的差异对于 Dice loss 更小。这应该会提高性能,因为概率的不平衡得到了轻微的补偿。使用 2-class Dice Loss,所有错误都会从两个角度受到惩罚,从而减少假阴性和假阳性错误项之间的差异。

这是真的吗?我哪里错了?在这一点上,我真的很困惑,并希望有任何迹象。关于我的问题的一些消息来源也会有很大帮助。

最后一个问题:关于类不平衡,哪种损失函数最适合我的情况?

提前致谢!

0 投票
2 回答
1135 浏览

python - 在 Pandas DataFrame 中使用不平衡学习

我的数据集非常不平衡。两个少数类中的每一个都包含多数类中样本的一半。我的 RNN 模型无法了解关于人口最少的班级的任何信息。

我正在尝试使用imbalanced-learn图书馆。例如:

如果train.drop(['label]仅包含所用特征的值,则有效。问题是我的 DataFrame 包含一个包含字符串作为值的附加列:我不能删除它,因为这些字符串是我的 RNN 的输入。如果我放弃它,我将无法分辨这些字符串属于过采样数据集的哪一行。

有没有办法保留所有列并告诉函数哪些列用于过采样?

0 投票
1 回答
191 浏览

python - 为什么我们使用损失来更新我们的模型,但使用指标来选择我们需要的模型?

首先,我很困惑为什么我们使用损失来更新模型,而使用指标来选择我们需要的模型。

也许不是所有的代码,但我见过的大部分代码都是这样,他们使用 EarlyStopping 来监控验证数据的指标以找到最佳时期(损失和指标不同)。

既然选择了使用损失来更新模型,为什么不使用损失来选择模型呢?毕竟,损失和指标并不完全相同。它给我的印象是你这样做是为了这个目的,然后你用另一个指标来评估它,这让我感到很奇怪。以回归问题为例,当有人使用'mse'作为他们的损失时,为什么他们定义 metrics=['mae']并监控它以提前停止或降低学习率,我只是无法理解,我想知道这样做有什么好处?

其次,当你的训练数据是不平衡数据并且问题是分类问题时,一些教程会告诉你使用 F1 或 AUC 作为你的指标,他们说这会改善由不平衡数据引起的问题。我不'不知道为什么这些指标可以改善数据不平衡带来的问题。

metrics第三,当有人向函数中的参数发送多个指标时,我感到困惑compile。我不明白为什么是多个,为什么不是一个。定义多个指标而不是一个指标有什么好处?

我似乎有太多的问题,他们已经困扰了我很长时间。

谢谢你的好意回答。


上面的内容是我之前编辑的。有些人认为我的问题太宽泛,所以我想重新组织我的语言。

现在假设有一个二分类问题,数据不平衡。正负类的比例为 500:1

我选择DNN作为我的分类模型。我选择了cross entropy作为我的loss. 现在的问题是我应该选择cross entropy作为 my metric,还是应该选择其他东西,为什么?

我想说说我从其他人的回答中得到的信息,就是当问题是回归问题时,一般的metric和loss是可区分的,所以其实选择相同的metrice和loss,或者不同的,完全取决于根据你自己对问题的理解。但是如果问题是分类,我们想要的度量是不可微的,所以我们会选择不同的损失和度量,比如F1AUC,它们是不可微的。我们为什么不cross entropy直接选择作为衡量标准呢?

0 投票
1 回答
187 浏览

machine-learning - 使用小数据集和 SMOTE 进行深度学习

我有一个包含 6000 条记录的数据。我有一个 60-20-20 的训练、验证和测试集。我使用 XGboost 获得了大约 76% 的准确度。我将数据转换为时间序列并应用 LSTM/1-D Convnets,准确率约为 60%。我的数据集对于深度学习来说太小了吗?

其次,可以在每个训练集、测试集和验证集上应用 SMOTE(拆分数据后)我知道在将数据拆分为训练/测试/验证之前不应该应用 SMOTE。拆分后可以对集合进行上采样、训练/测试/验证吗?

如果在拆分它们之后对训练/测试/验证集进行上采样,我会在 LSTM 左右(80%)获得更好的结果但是这种方法,对吗?我只是想表明,通过更多的数据,我们可以提高深度学习算法的准确性。

0 投票
1 回答
87 浏览

keras - 样本加权对不平衡的数据训练没有帮助

我正在训练一个两层 LSTM 网络,每层有 16 到 32 个单元,并且有一个相当不平衡的数据集进行训练。根据我的七个类频率,通过total_samples/class_frequency这个简单公式计算的样本权重是[3.7, 5.6, 26.4, 3.2, 191.6, 8.4, 13.2],我将每个样本的这个权重添加到(数据的元组中) ,标签)我的数据集生成器的输出以运行我的 Kerasmodel.fit()函数。训练代码是:

然后我使用保存最好的模型来评估它并通过这段代码计算性能统计数据(我的数据在 tensorflow 数据集中):

但我在输出统计数据中看到的是,加权统计数据总体上比未加权统计数据差(将所有权重设置为 1),即使对于稀有类(最高权重)也是如此。这是统计数据:

对于加权运行:

对于未加权运行:

这里有什么问题?

0 投票
2 回答
1716 浏览

python - 将列表作为 loss_weights 传递,每个模型输出应该有一个条目。Keras 告诉我模型有 1 个输出,但我认为有更多

我有一个df用于多类分类问题的数据集。我有一个巨大的班级不平衡。即,grade_Fgrade_G

同时,我对代表性较少的类有非常不准确的预测,正如可以在这里看到的那样。

我有一个输出维度为 7 的神经网络。我的意思是我要预测的数组是:

所以我尝试了以下神经网络:

所以我输入了一个与类频率成反比的权重向量:

但是它告诉我输出的大小为 1 :

0 投票
1 回答
208 浏览

python - KNN 平衡数据后找不到类

我有一个奇怪的问题,我有一个包含 4 个集群的模型,数据不平衡的比例如下:75%、15%、7% 和 3%。我将它分成训练和测试,比例为 80/20,然后我训练一个有 5 个邻居的 KNN,给我 1 的准确率。

虽然看起来很奇怪,但我继续,获取新数据并尝试根据这个模型对其进行分类,但它永远不会找到百分比较小的类,它总是将其错误分类为第二低类。所以我尝试使用带有 SMOTEENN 算法的不平衡学习库来平衡数据:

然后我做同样的事情,将它分成相同比例 80/20 的训练和测试,并用 5 个邻居训练一个新的 KNN 分类器。但分类报告现在似乎更糟了:

我看不出我做错了什么,在训练新分类器之前,除了拆分和洗牌之外,在重新采样数据之后我还需要做什么流程吗?为什么我的 KNN 现在没有看到 4 个类?

0 投票
2 回答
2302 浏览

pytorch - Pytorch中具有类不平衡的多标签分类

我有一个多标签分类问题,我试图用 Pytorch 中的 CNN 解决这个问题。我有 80,000 个训练示例和 7900 个课程;每个示例可以同时属于多个类,每个示例的平均类数为 130。

问题是我的数据集非常不平衡。对于某些课程,我只有大约 900 个示例,大约 1%。对于“过度代表”的课程,我有大约 12000 个示例(15%)。当我训练模型时,我使用来自pytorch 的BCEWithLogitsLoss和正权重参数。我计算权重的方式与文档中描述的相同:负例数除以正例数。

结果,我的模型几乎高估了每一个类……无论是小类还是大类,我得到的预测几乎是真实标签的两倍。而我的 AUPRC 只有 0.18。尽管它比完全没有加权要好得多,因为在这种情况下,模型将所有内容都预测为零。

所以我的问题是,如何提高性能?还有什么我可以做的吗?我尝试了不同的批量采样技术(对少数类进行过采样),但它们似乎不起作用。

0 投票
0 回答
70 浏览

python - 如何使用集成模型改进一类的大规模分类报告?

我有一个数据集,包括

{0: 6624, 1: 75} 0 表示非观察句,1 表示观察句。(基本上,我使用命名实体识别来注释我的句子,如果有像 DATA、TIME、LONG(坐标)这样的特定实体,我把标签 1)

现在我想制作一个模型来对它们进行分类,我制作的最佳模型(CV = 3 FOR ALL)是

其中有:

这个模型使用重新采样的 sgd 进行分类

如您所见,这两种情况下的问题都是 1 类,但在第一种情况下,我们有相当好的精度和 f1 分数,而在第二种情况下,我们有很好的召回率

所以我决定以这种方式同时使用集成模型:

现在我有这个结果:

当您使用时,集成模型对第 1 类具有更好的精度,但更差的召回率和 f1 socre 导致关于第 1 类的混淆矩阵更差(36 TP 对 1 类的 38 TP)

我的目标是提高第一类的 TP(f1 分数,第一类的召回)

你有什么建议来提高第一类的 TP(f1score,第一类的召回?一般来说你对我的工作流程有什么想法吗?

我已经尝试过参数调整,但我没有改进 sgd 模型。

0 投票
0 回答
39 浏览

random - 有没有比 random.sample() 更有效的数据过采样方法?

我遇到了一个很大的不平衡分类问题,想通过对次要类进行过采样来解决这个问题。(N(class 1) = 8,5mio, N(class n) = 3000)

为此,我想通过

其中data是特定于类的 DataFrame 的列表,len(data)=10并且data.shape=(9448788,97)

这按预期工作,但不幸的是需要永远。有没有更有效的方法来做同样的事情?