我在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()打印出来 - 据说是根据指标= [' 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列表。
答案 0 :(得分:6)
您的MCC为负面的原因可能是由于Keras实施中最近修复的错误。请检查此issue。
您的问题的解决方案可能是从GitHub主分支重新安装Keras或编写您自己的回调(如here所述),问题已解决:
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())