Я пытаюсь реализовать слегка модифицированную двоичную функцию потери кроссентропии для модели в Керасе.Из Keras двоичная_кросентропия определяется как:
def binary_crossentropy(y_true, y_pred):
return K.mean(K.binary_crossentropy(y_true, y_pred), axis=-1)
Данные, которые я имею, сгруппированы (т. Е. Есть столбец, указывающий group1, group2 и т. Д.), Но для каждой группы имеется различное количество строк (т. Е.В группе 1 имеется 52 наблюдения, в группе 2 - 101 наблюдение и т.по группам).
Похоже, не было готовых решений для использования групп, и я не смог найти решение.Информация о том, к какой группе принадлежит наблюдение, теряется и не передается в y_true и y_pred, и я не уверен, как k-fold cv точно изменит то, что / сколько наблюдений будет передано как y_true и y_pred.Если бы был способ сохранить информацию о группе с помощью последовательной модели, это, вероятно, было бы решением.Код может выполнить что-то вроде:
def custom_loss(y_true, y_pred):
max_bc = []
for group in groups:
max_bc += [K.mean(K.binary_crossentropy(y_true, y_pred), axis=-1)]
return max_bc
Если вышеописанное невозможно, альтернативной мерой может быть что-то вроде значения тензора в 75-м процентиле.Что-то вроде:
def custom_loss(y_true, y_pred):
return K.binary_crossentropy(y_true, y_pred)[len(y_true)*0.75]
Но я точно знаю, что это неправильно - я просто недостаточно знаком с Keras и Tensorflow, чтобы получить правильный код.
РЕДАКТИРОВАТЬ: Возможно, я только что нашел способ сделать процентили, но результат не так, как хотелось бы ... Все равно было бы здорово получить представление о первой части.
def custom_loss(y_true, y_pred):
e = K.binary_crossentropy(y_true,y_pred)
return distributions.percentile(e, q=75.)