如何在R的keras包中设置class_weight?

时间:2017-10-24 10:15:35

标签: r tensorflow deep-learning keras

我在R中使用keras包来训练深度学习模型。我的数据集非常不平衡。因此,我想在class_weight函数中设置fit参数。这是我用于模型的fit函数及其参数

history <- model %>% fit(
  trainData, trainClass, 
  epochs = 5, batch_size = 1000, 
  class_weight = ????,
  validation_split = 0.2
)

在python中我可以设置class_weight如下:

class_weight={0:1, 1:30}

但我不知道如何在R中执行此操作。在R的帮助菜单中,它描述了class_weight如下:

  

可选的命名列表映射索引(整数)到权重(浮点数)到   适用于模型在此期间从该类中取样的损失   训练。这可以告诉模型“更多关注”   来自代表性不足的班级的样本。

有任何想法或建议吗?

2 个答案:

答案 0 :(得分:9)

Class_weight需要是一个列表,所以

    history <- model %>% fit(
        trainData, trainClass, 
        epochs = 5, batch_size = 1000, 
        class_weight = list("0"=1,"1"=30),
        validation_split = 0.2
    )

似乎有效。 Keras在内部使用一个名为as_class_weights的函数将列表更改为python-dictionary(参见https://rdrr.io/cran/keras/src/R/model.R)。

     class_weight <- dict(list('0'=1,'1'=10))
     class_weight
     >>> {0: 1.0, 1: 10.0}

看起来就像你上面提到的python字典。

答案 1 :(得分:0)

我在Python解决方案中found a generic solution,所以我转换为R:

counter=funModeling::freq(Y_data_aux_tr, plot=F) %>% select(var, frequency)
majority=max(counter$frequency)
counter$weight=ceil(majority/counter$frequency)


l_weights=setNames(as.list(counter$weight), counter$var)

使用它:

 fit(..., class_weight = l_weights)

如果您使用fit_generator,则建议:由于权重基于频率,因此具有不同数量的训练验证样本可能会使验证结果产生偏差。它们应该大小相等。