Как я могу реализовать коэффициент корреляции Мэтьюса в Керасе? - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь реализовать коэффициент корреляции Мэтьюса как метрику для подгонки моделей в глубокой нейронной сети Keras. Я могу сделать это в задачах двоичной классификации, но я не могу реализовать это таким образом, чтобы работать с проблемами классификации нескольких классов.

Я проверил источник для scikit-learn MCC, который работает с бинарными и мультиклассовыми проблемами. Я пытался адаптировать его для использования бэкэнда Keras, но не смог разобраться.

Это очень важно иметь, так как мне нужно это сравнить с проблемами двоичной классификации, которые оцениваются с помощью MCC.

Вот код для двоичной реализации:

def matthews_correlation(y_true, y_pred):
  y_pred_pos = K.round(K.clip(y_pred, 0, 1))
  y_pred_neg = 1 - y_pred_pos
  y_pos = K.round(K.clip(y_true, 0, 1))
  y_neg = 1 - y_pos
  tp = K.sum(y_pos * y_pred_pos)
  tn = K.sum(y_neg * y_pred_neg)
  fp = K.sum(y_neg * y_pred_pos)
  fn = K.sum(y_pos * y_pred_neg)
  numerator = (tp * tn - fp * fn)
  denominator = K.sqrt((tp + fp) * (tp + fn) * (tn + fp) * (tn + fn))
  return numerator / (denominator + K.epsilon())

Код, который я пытаюсь адаптировать из sklearn, следующий:

def matthews_correlation_v2(y_true,y_pred):
  lb = LabelEncoder()
  lb.fit(K.concatenate([y_true, y_pred]))
  y_true = lb.transform(y_true)
  y_pred = lb.transform(y_pred)

  C = confusion_matrix(y_true, y_pred, sample_weight=sample_weight)
  t_sum = C.sum(axis=1, dtype=np.float64)
  p_sum = C.sum(axis=0, dtype=np.float64)
  n_correct = np.trace(C, dtype=np.float64)
  n_samples = p_sum.sum()
  cov_ytyp = n_correct * n_samples - np.dot(t_sum, p_sum)
  cov_ypyp = n_samples ** 2 - np.dot(p_sum, p_sum)
  cov_ytyt = n_samples ** 2 - np.dot(t_sum, t_sum)
  mcc = cov_ytyp / np.sqrt(cov_ytyt * cov_ypyp)
  return mcc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...