Я пытаюсь реализовать коэффициент корреляции Мэтьюса как метрику для подгонки моделей в глубокой нейронной сети 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