Работа с несбалансированным набором данных в текстовой классификации с Keras и Theano - PullRequest
0 голосов
/ 17 апреля 2019

Для ~ 20000 наборов текстовых данных истинные и ложные выборки составляют ~ 5000 против ~ 1500. Для классификации используется двухканальный textCNN с Keras и Theano. Оценка F1 является метрикой оценки. Оценка F1 неплоха, в то время как матрица путаницы показывает, что точность истинных выборок относительно низкая (~ 40%). Но на самом деле очень важно точно предсказать истинные образцы. Поэтому вы хотите разработать собственную функцию двоичной кросс-энтропийной потери, чтобы увеличить вес ошибочно классифицированных истинных выборок и сделать модель более ориентированной на точный прогноз истинных выборок.

  • пробовал class_weight с sklearn в методе model.fit, и он работал не очень хорошо, поскольку вес применялся ко всем выборкам, а не к ошибочно классифицированным.
  • попробовал и скорректировал метод, упомянутый здесь: https://github.com/keras-team/keras/issues/2115,, но функция потерь была категорической кросс-энтропией, и она не работала хорошо для проблемы двоичной классификации. Попытка изменить функцию потерь на двоичную, но столкнулась с некоторыми проблемами, касающимися входного измерения.

Пример кода функции потерь, чувствительных к затратам, с упором на неправильно классифицированные выборки:

def w_categorical_crossentropy(y_true, y_pred, weights):
    nb_cl = len(weights)
    final_mask = K.zeros_like(y_pred[:, 0])
    y_pred_max = K.max(y_pred, axis=1)
    y_pred_max = K.reshape(y_pred_max, (K.shape(y_pred)[0], 1))
    y_pred_max_mat = K.equal(y_pred, y_pred_max)
    for c_p, c_t in product(range(nb_cl), range(nb_cl)):
        final_mask += (weights[c_t, c_p] * y_pred_max_mat[:, c_p] * y_true[:, c_t])
    return K.categorical_crossentropy(y_pred, y_true) * final_mask

На самом деле, пользовательская функция потерь для двоичной классификации, реализованная с Keras и Theano, которая фокусируется на неправильно классифицированных выборках, имеет большое значение для несбалансированного набора данных. Пожалуйста, помогите решить эту проблему. Спасибо!

1 Ответ

0 голосов
/ 19 апреля 2019

Хорошо, когда мне приходится иметь дело с несбалансированными наборами данных в кератах, я сначала вычисляю весовые коэффициенты для каждого класса и передаю их экземпляру модели во время обучения. Это будет выглядеть примерно так:

from sklearn.utils import compute_class_weight

w = compute_class_weight('balanced', np.unique(targets), targets)

# here I am adding only two categories with their corresponding weights
# you can spin a loop or continue by hand until you include all of your categories
weights = {
     np.unique(targets)[0] : w[0], # class 0 with weight 0
     np.unique(targets)[1] : w[1]  # class 1 with weight 1 
}

# then during training you do like this
model.fit(x=features, y=targets, {..}, class_weight=weights)

Я верю, что это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...