python - Matthews 相关系数与 Keras

标签 python neural-network keras

我在 Python 3 中有一个 Keras 模型(顺序):

class LossHistory(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.matthews_correlation = []

    def on_epoch_end(self, batch, logs={}):
        self.matthews_correlation.append(logs.get('matthews_correlation'))
...    
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['matthews_correlation'])
history = LossHistory()
model.fit(Xtrain, Ytrain, nb_epoch=10, batch_size=10, callbacks=[history])
scores = model.evaluate(Xtest, Ytest, verbose=1)

...
MCC = matthews_correlation(Ytest, predictions)

model.fit() 打印出 - 据说根据 metrics = ['matthews_correlation'] 部分 - 进度和马修斯相关系数 (MCC)。但它们与 MCC 最终回馈的内容大不相同。最后的MCC函数给出了预测的整体MCC,和sklearn的MCC函数是一致的(即我相信这个值)。

1) model.evaluate() 的分数是多少?它们与末世的MCC或时代的MCC完全不同。

2) 时代的 MCC 是什么?它看起来像这样:

Epoch 1/10 580/580 [===========] - 0s - loss: 0.2500 - matthews_correlation: -0.5817

它们是如何计算的,为什么最终与 MCC 相差如此之大?

3) 我能否以某种方式将函数 matthews_correlation() 添加到函数 on_epoch_train() 中?然后我可以打印出独立计算的 MCC。我不知道 Keras 隐含地做了什么。

感谢您的帮助。

编辑:Here是他们如何记录损失历史的一个例子。如果我打印 (history.matthews_correlation),我会得到进度报告给我的相同 MCC 的列表。

最佳答案

您的 MCC 为负数的原因可能是由于 Keras 实现中最近修复的错误。检查这个issue .

您的问题的解决方案可能是从 GitHub master 分支重新安装 Keras 或编写您自己的回调(如 here 所述),如问题中所修复:

import keras.backend as K
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())

关于python - Matthews 相关系数与 Keras,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39895742/

相关文章:

python - 阻止 Python 使用多个 CPU

machine-learning - 训练 Keras Stateful LSTM return_seq=true 不学习

neural-network - 在 Caffe 中使用组合层时形状不匹配

python - 在 virtualenv : module 'tensorflow' has no attribute 'truncated_normal' 中运行tensorflow时出错

python - 近似小于或等于的可微分张量运算?

python - tensorflow 2.0 中的批量归一化使预测结果变得更糟

python - 使用 Pygame 播放 ADPCM 流

python - 恢复训练 tf.keras Tensorboard

python - 如何找到二维矩阵的两条对角线?

python - Keras MNIST 目标向量自动转换为 one-hot?