我在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
如下:
可选的命名列表映射索引(整数)到权重(浮点数)到 适用于模型在此期间从该类中取样的损失 训练。这可以告诉模型“更多关注” 来自代表性不足的班级的样本。
有任何想法或建议吗?
答案 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
,则建议:由于权重基于频率,因此具有不同数量的训练验证样本可能会使验证结果产生偏差。它们应该大小相等。