如何处理Keras中不平衡的班级

时间:2019-06-01 17:50:13

标签: keras deep-learning multilabel-classification

我正在处理multi-label的{​​{1}}图像分类问题,因此我使用函数Kerasflow_from_dataframe()

我大约有fit_generator()个类,并且您可以猜测它们高度偏斜/不平衡。经过一番搜索之后,我遇到了参数2000class_weight,我决定尝试一下。我的问题是,我不确定是否正确使用它们。这是一个示例:

让我们假设我已经平整了所有类的出现,以便获得以下(重复的)标签列表:

classes

这是计算labels = ['classD', 'classA', 'classA', 'classC', 'classD', 'classD'] classes的函数:

class_weight

我们还假设我只考虑排名前2位的班级:

from collections import Counter
def get_classes_weights(l, n):
    counter = Counter(l).most_common(n)
    classes = [cls for cls, ocu in counter]
    majority = max([ocu for cls, ocu in counter])
    weights = {idx: float(majority/ocu) for idx, (cls, ocu) in enumerate(counter)}
    return classes, weights

这给出了:

classes, class_weight = get_classes_weights(labels, 2)

和:

classes: ['classD', 'classA']

最后,这就是我在函数中使用它们的方式:

class_weight: {0: 1.0, 1: 1.5}
generator_train.flow_from_dataframe(
    classes=classes,
)

所以我的问题是:

  • 鉴于我致力于解决model.fit_generator( class_weight=class_weight ) 图像分类问题,上述方法是正确的加权方法吗?
  • 我的验证集是否需要平衡,或者是否取自与训练集相同的分布(分别为20%和80%随机选择),可以吗?

0 个答案:

没有答案