如何以简单的方式在Keras中分配class_weight?

Jav*_*avi 12 python deep-learning keras tensorflow

任何人都可以告诉我,当数据集不平衡时,在Keras中应用class_weight的最简单方法是什么.

我的目标中只有两个班级.

谢谢

pet*_*ich 16

函数的class_weight参数fit()是将类映射到权重值的字典.

假设您有500个0级样本和1500个1级样本,而不是您在class_weight = {0:3,1:1}中提供的样本.这使得0级成为第1级重量的三倍.

train_generator.classes 为您的加权提供正确的类名.

如果要以编程方式计算,可以使用scikit-learn的sklearn.utils.compute_class_weight().

该函数查看标签的分布并生成权重,以同等地惩罚训练集中的不足或过度表示的类.

另请参见此有用的主题:https://github.com/fchollet/keras/issues/1875

这个线程可能也有帮助:是否可以从Keras的flow_from_directory自动推断出class_weight?

  • 最后一个明确的例子!似乎没有其他地方可以说权重是放大还是缩小 (2认同)
  • 这应该是最重要的答案 - 它回答了问题所问的内容(关于 Keras,而不是 scikit-learn),并且还提供了文档和解释。 (2认同)

Joh*_*ieh 13

使用sklearn工具包中的class_weight.

我也使用这种方法来处理不平衡数据

from sklearn.utils import class_weight
class_weight = class_weight.compute_class_weight('balanced'
                                               ,np.unique(Y_train)
                                               ,Y_train)
Run Code Online (Sandbox Code Playgroud)

然后是model.fit

Classifier.fit(train_X,train_Y,batch_size = 100, epochs = 10
           ,validation_data= (test_X,test_Y),class_weight = class_weight )
Run Code Online (Sandbox Code Playgroud)


jav*_*vac 6

1- 用你的标签及其相关的权重定义一个字典

class_weight = {0: 0.1,
                1: 1.,
                2: 2.}
Run Code Online (Sandbox Code Playgroud)

2- 将字典作为参数提供:

model.fit(X_train, Y_train, batch_size = 100, epochs = 10, class_weight=class_weight)
Run Code Online (Sandbox Code Playgroud)


Mic*_*tti 4

您是否询问要应用的正确权重或如何在代码中执行此操作?代码很简单:

class_weights = {}
    for i in range(2):
        class_weights[i] = your_weight
Run Code Online (Sandbox Code Playgroud)

然后你将参数class_weight=class_weights传入model.fit.

正确使用的权重是某种逆频率;您还可以进行一些尝试和错误。