批量数据应该平衡吗?

时间:2018-01-11 05:09:56

标签: tensorflow machine-learning

我训练深度学习模型,通过提供推文内容来预测三种情绪(快乐,悲伤,愤怒)。

我遇到的一个问题是,我的模特可以在悲伤,快乐上学习,但在快乐方面却非常糟糕。

Confusion matrix in three emotion

我认为原因是我的火车数据集不平衡。

欢乐中的数据大小:196952,悲伤:29407,愤怒:42420

因此,在训练模型时,批量大小包含太多的欢乐数据集,这使得模型只能猜测答案是喜悦而不是其他。

我想通过平衡每个批次中的数据来解决此问题。 也就是说批量大小为128,我们随机选择相同数量的三种情绪数据。通过欢乐数据防止模型占主导地位。

  

问题是:批量数据是否应该平衡?

其他问题是,我随机选择了数据集,这是违反了时代的定义。

因为epoch意味着阅读所有火车数据集。当随机选择时,可能在某个时代不会选择某些数据集。或者只是训练更多时代将解决这个问题?

如果我认为有什么不对,欢迎指出。谢谢!

3 个答案:

答案 0 :(得分:1)

一种可能的方法是向分类器添加权重。

来自: https://www.tensorflow.org/tutorials/structured_data/imbalanced_data#class_weights

<块引用>

目标是识别欺诈交易,但您没有 很多这些阳性样本都可以使用,所以你会想要 让分类器对少数几个例子进行大量加权 可用的。您可以通过为每个类传递 Keras 权重来做到这一点 通过一个参数。这些将导致模型“支付更多 注意”来自代表性不足的类的示例。

因为你的问题是多类的,你可以用 https://scikit-learn.org/stable/modules/generated/sklearn.utils.class_weight.compute_class_weight.html

我这样做是为了:

from sklearn.utils import class_weight

class_weights = dict (enumerate (class_weight.compute_class_weight (
  class_weight = 'balanced', 
  classes = available_labels, 
  y = self.dataset.get_split (df, 'train')['label']
)))

然后:

history = model.fit (
   ...
   class_weight = class_weights
)

根据我的经验,这种方法可以实现更好的解决方案,同时还能加快训练速度。

此外,我认为保持大批量并确保数据是随机的也是处理不平衡数据的其他好方法。

答案 1 :(得分:1)

小批量不需要平衡,但要确保批量足够大。动态调整权重,而不是分配固定的类权重,从而获得更好的性能。

https://ieeexplore.ieee.org/abstract/document/9324926?casa_token=DqoPop5Ho_8AAAAA:MSeJfxg1Pi2x36DUCkkFgPJF0YUYdkfRENItzMisNsiD-2aBL-ldiZgQGuEMWZa_rLImHYGd

答案 2 :(得分:0)

不应要求平衡微型计算机,并且可能会干扰数据中的自然偏差。从替换的数据集中随机抽样(而不是在时期中没有替换)也有效但有时表现更差。