马修斯与Keras的相关系数

ste*_*ste 7 python neural-network 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)
Run Code Online (Sandbox Code Playgroud)

model.fit()打印出来 - 据说是根据metrics = ['matthews_correlation']部分 - 进度和Matthews相关系数(MCC).但它们与MCC最终的回馈有很大的不同.MCC函数最终给出了预测的整体MCC,并且与sklearn的MCC函数一致(即我信任该值).

1)model.evaluate()得分是多少?它们最终与MCC完全不同,或者与时代的MCC完全不同.

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

大纪元1/10五百八分之五百八十零[===========] - 0 - 损失:0.2500 - matthews_correlation:-0.5817

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

3)我可以以某种方式将函数matthews_correlation()添加到函数on_epoch_train()吗?然后我可以打印出独立计算的MCC.我不知道Keras隐含的是什么.

谢谢你的帮助.

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

Mat*_*t07 6

您的MCC否定的原因可能是由于Keras实施中最近修复的错误所致。检查此问题

你的问题的解决方案可能是从GitHub主分支重新安装Keras或写自己的回调(如描述在这里)为固定的问题:

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())
Run Code Online (Sandbox Code Playgroud)

  • 我可以使用tensorflow 2.0 api验证这在keras上运行良好。 (2认同)