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

如何处理Keras中的不平衡班级,keras,deep-learning,multilabel-classification,Keras,Deep Learning,Multilabel Classification,我正在使用Keras处理一个multi-label图像分类问题,因此我使用了来自\u dataframe()和fit\u generator()的函数flow\u 我有大约2000个类,你可以猜到它们是高度倾斜/不平衡的。搜索一段时间后,我遇到了参数class\u weight和classes,我决定试一试。我的问题是,我不确定我是否正确使用了它们。以下是一个例子: 假设我已展平所有类引用,以便获得以下(重复)标签列表: 这是计算类和类权重的函数: from collections import

我正在使用
Keras
处理一个
multi-label
图像分类问题,因此我使用了来自\u dataframe()和
fit\u generator()的函数
flow\u

我有大约2000个
类,你可以猜到它们是高度倾斜/不平衡的。搜索一段时间后,我遇到了参数
class\u weight
classes
,我决定试一试。我的问题是,我不确定我是否正确使用了它们。以下是一个例子:

假设我已展平所有类引用,以便获得以下(重复)标签列表:

这是计算
类权重
的函数:

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

我们也假设我只考虑Top-2类:

classes, class_weight = get_classes_weights(labels, 2)
这使得:

classes: ['classD', 'classA']
以及:

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

generator_train.flow_from_dataframe(
    classes=classes,
)
因此,我的问题是:

  • 鉴于我正在处理一个
    多标签
    图像分类问题,上述方法是否是应用权重的正确方法
  • 我的验证集是否需要平衡,或者如果它来自与训练集相同的分布(分别为20%和80%随机选择),那么它是否正常
class_weight: {0: 1.0, 1: 1.5}
generator_train.flow_from_dataframe(
    classes=classes,
)
model.fit_generator(
    class_weight=class_weight
)