Для ~ 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, которая фокусируется на неправильно классифицированных выборках, имеет большое значение для несбалансированного набора данных. Пожалуйста, помогите решить эту проблему. Спасибо!