Как бороться с несбалансированными занятиями в Керасе - PullRequest
1 голос
/ 01 июня 2019

Я работаю над multi-label проблемой классификации изображений с Keras, поэтому я использую функции flow_from_dataframe() и fit_generator().

У меня около 2000 классов, и, как вы можете догадаться, онисильно перекошены / несбалансированы.После небольшого поиска я натолкнулся на аргументы class_weight и classes и решил попробовать.Моя проблема в том, что я не уверен, правильно ли я их использую.Вот пример:

Давайте предположим, что я сгладил все вхождения классов, чтобы получить следующий список (дублированных) меток:

labels = ['classD', 'classA', 'classA', 'classC', 'classD', 'classD']

И это функция, которая вычисляет classes и class_weight:

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

Давайте также предположим, что я должен рассмотреть только топ-2 класса:

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
)

Итак, мой вопрос:

  • Является ли приведенный выше правильный способ применения весов, учитывая, что я работаю над проблемой классификации изображений multi-label?
  • Нужно ли балансировать мой набор проверки или все в порядке, если он был взят из того же самогоРаспределение как обучающий набор (20% и 80% случайного отбора соответственно)?
...