如何在Keras中实现Matthews相关系数?

时间:2019-06-13 14:46:28

标签: python tensorflow keras deep-learning

我正在尝试将Matthews相关系数作为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

0 个答案:

没有答案