在卷积神经网络中为不平衡数据集添加类权重

时间:2018-12-19 23:51:43

标签: python tensorflow keras weighted

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

  • 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]) 

并将它们添加到我的健身功能中

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

我不确定我是否正确地计算了权重,甚至不确定应该怎么做?

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

3 个答案:

答案 0 :(得分:1)

请访问此答案以寻求适当的解决方法https://datascience.stackexchange.com/a/18722

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

答案 1 :(得分:0)

首先要确保通过字典,因为class_weights参数需要字典。

第二,对类进行加权的要点如下。假设您有一个二进制分类问题,其中class_1有1000个实例,class_2有100个实例。由于您要补偿不平衡的数据,因此可以将权重设置为:

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

换句话说,这意味着如果模型在真实标签为class_2的地方犯了错误,那么与在真实类别为的样本中犯错的情况相比,将被罚款10倍以上。 class_1。您想要这样的事情是因为给定数据中的类分布,由于默认情况下该模型人口过多,因此该模型将固有地过拟合class_1。通过设置类权重,您将对模型施加隐式约束,即对class_1的10个实例进行错误的预测和对class_2的实例进行1个错误的预测同样不好。 / p>

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

答案 2 :(得分:0)

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

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

不是在类名周围输入例如“ 0”或“ 1”,而是通过“:”而不是:“)并按照您的建议使用dict而不是np数组。