问题描述
我有 2 个类别的不平衡数据集。我正在使用 categorical_crossentropy
。我想知道我的代码。将 class_weight
与 categorical_crossentropy
一起使用是否正确??如果是,class_weight
是仅应用于训练集还是应用于整个数据??
我搜索了很多次,但没有找到任何有用的网站。任何帮助将不胜感激。
我的代码:
model.compile(loss='categorical_crossentropy',optimizer=opt_adam,metrics=['accuracy'])
history=model.fit_generator(generate_arrays_for_training(indexPat,train_data,start=0,end=100)
validation_data=generate_arrays_for_training(indexPat,test_data,end=100)
steps_per_epoch=int((len(train_data)/2)),validation_steps=int((len(test_data)/2)),verbose=2,class_weight = {0:1,1:1.181},epochs=65,max_queue_size=2,shuffle=True)
解决方法
我没有足够的声誉来发表评论,但由于您要求提供参考论文,这里是一篇新发表的关于动态调整类权重和类不平衡的论文。 https://ieeexplore.ieee.org/document/9324926
,是的,您可以使用具有分类交叉熵的类权重。在计算损失函数时应用权重。根据权重对错误的分类进行惩罚。所以权重既不应用于验证集也不应用于测试集。然后的想法是在训练时间模型更多地关注一个类并相应地更新权重。
这就是为什么在测试或验证时,学习到的权重会相对于类权重隐式存在偏差。
您的代码中唯一的问题可能是类权重。可能权重必须加起来为 1,但您应该为此检查库详细信息。