【问题标题】:Matthews Correlation Coefficient with Keras使用 Keras 的 Matthews 相关系数
【发布时间】:2017-02-15 04:24:52
【问题描述】:

我在 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 是什么?它看起来像这样:

纪元 1/10 580/580 [===========] - 0s - 损失: 0.2500 - matthews_correlation: -0.5817

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

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

感谢您的帮助。

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

【问题讨论】:

    标签: python neural-network keras


    【解决方案1】:

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

    您的问题的解决方案可能是从 GitHub 主分支重新安装 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())
    

    【讨论】:

    • 这就解释了 scikit learn MCC 和 Keras MCC 之间的区别,感谢您关注新版本的 Keras。
    • 如果我使用这个实现,我会得到错误:'''ValueError: An operation has None for gradient。请确保您的所有操作都定义了渐变(即可微分)。无梯度的常用操作:K.argmax, K.round, K.eval.'''
    • @tag 此代码适用于 Keras 1.2。最新版本是 2.2,因此可能会更改底层接口。自定义指标的定义请参考最新文档keras.io/metrics
    • 我可以验证这在带有 tensorflow 2.0 api 的 keras 上运行良好。
    • MCC 代码采用单列输出的二进制分类。因此,如果您有一个具有两列输出的二元分类模型,那么生成的 MCC 将是完全错误的。请注意,MCC 是一个相关系数,因此它的值介于 -1 和 1 之间。
    猜你喜欢
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2018-10-01
    • 2021-09-26
    • 2018-03-19
    • 2018-06-15
    • 1970-01-01
    • 2017-08-17
    相关资源
    最近更新 更多