Keras - пользовательская функция потерь / доступ к элементу 75-го процентиля тензора - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь реализовать слегка модифицированную двоичную функцию потери кроссентропии для модели в Керасе.Из 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.)
...