【问题标题】:Adding Class Weights for imbalanced dataset in Convolutional Neural Network为卷积神经网络中的不平衡数据集添加类权重
【发布时间】:2018-12-19 23:51:42
【问题描述】:

我有一个具有以下分布的图像数据集:

  • 0 级:73.5%
  • 1 类:7%
  • 2 类:15%
  • 3 级:2.5%
  • 第 4 类:2%

我认为我需要添加类权重来弥补 1、2、3 和 4 类中图像数量少的问题。

我尝试通过将 0 类除以 1 类、0 类除以 2 类等等来计算类权重。

我假设类 0 对应于 1,因为它不需要缩放?但不确定这是否正确。

class_weights = np.array([1, 10.5, 4.9, 29.4, 36.75]) 

并将它们添加到我的 fit 函数中:

model.fit(x_train, y_train, batch_size=batch_size, class_weight=class_weights, epochs=epochs, validation_data=(x_test, y_test))

我不确定我是否正确计算了权重,是否应该这样做?

希望任何人都可以帮助澄清它。

【问题讨论】:

    标签: python tensorflow keras weighted


    【解决方案1】:

    首先确保传递一个字典,因为class_weights 参数需要一个字典。

    其次,加权类的要点如下。假设您有一个二元分类问题,其中class_1 有 1000 个实例,class_2 有 100 个实例。由于您想弥补不平衡的数据,您可以将权重设置为:

    class_weights={"class_1": 1, "class_2": 10}
    

    换句话说,这意味着如果模型在真实标签为class_2 的情况下犯了错误,它将受到比在真实类别为@987654326 的样本上犯错误时多 10 倍的惩罚@。你想要这样的东西,因为考虑到数据中的类分布,模型将在class_1 上具有过度拟合的固有趋势,因为它默认情况下是过度填充的。通过设置类权重,您对模型施加了一个隐式约束,即对 class_1 的 10 个实例进行错误预测和对 class_2 的实例进行 1 个错误预测同样糟糕。

    话虽如此,您可以随意设置class_weights,这意味着没有正确或错误的方法。你设置权重的方式对我来说似乎是合理的。

    【讨论】:

    • 感谢您的回复。我的 .csv 文件中的类是 0、1、2、3 和 4。我尝试按照您的建议制作一个字典: class_weights={"0": 1, "1": 10.5, "2": 4.8, "3": 29.5, "4": 36.4} 我收到以下错误: ValueError:class_weight 必须包含数据中的所有类。类 {0, 1, 2, 3, 4} 存在于数据中,但不存在于 class_weight 中。您知道为什么会发生这种情况吗?将它们命名为 0、1、2、3、4 是错误的吗?
    • 我的 csv 文件的结构如下:图像,作为标题的级别和 10_left、0、15_left、1、15_right、2、16_left、4 等。我假设类名应该是错误的0, 1, 2, 3, 4 和我的课程一样吗?
    • @jeez 很晚了,但你的字典不应该有字符串作为键。所以应该是class_weights = {0: 1, 1: 10.5, 2: 4.8, 3: 29.5, 4: 36.4}
    【解决方案2】:

    请访问此答案以获得正确的解决方案https://datascience.stackexchange.com/a/18722

    我了解到您正在尝试设置类权重,但还考虑了图像增强来为代表性不足的类生成更多图像。

    【讨论】:

      【解决方案3】:

      我解决了这个问题,非常感谢 gorjan。

      class_weight = {0: 1.0,
                  1: 10.5,
                  2: 4.8,
                  3: 29.5,
                  4: 36.4}
      

      不是在类名周围键入例如“0”或“1”,而是没有“”来解决问题 :-) 并按照您的建议使用 dict 而不是 np 数组。

      【讨论】:

      • 好吧,这是有道理的,因为您拥有的类不是字符串而是整数。
      猜你喜欢
      • 2017-11-14
      • 2019-03-26
      • 2018-02-11
      • 2017-05-20
      • 2016-12-04
      • 2017-01-01
      • 1970-01-01
      • 2018-01-25
      相关资源
      最近更新 更多