与Keras的马修斯相关系数



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

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,与sklearn的MCC函数一致(即I trust The value)。

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隐式做什么。

谢谢你的帮助。

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

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

你的问题的解决方案可能是从GitHub主分支重新安装Keras或编写你自己的回调(如这里所述)在问题中修复:

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())

相关内容

  • 没有找到相关文章

最新更新