我正在训练以马修斯相关系数作为可观察指标的CNN,为此我将指标定义如下:
def mcc(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())
我多次检查了正确性,然后重新实施以进行验证。我相当确定这是正确的。
我按如下所示编译并拟合了模型:
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=[keras_auc, mcc, 'accuracy'])
model.fit(train, y_train, epochs=epochs, validation_split=0.2, batch_size=batch_size, verbose=verbose, shuffle = True)
在培训期间,我得到以下输出:
Epoch 11/15
6969/6969 [==============================] - 15s 2ms/step - loss: 0.1075 - keras_auc: 0.9199 - mcc: 0.3622 - acc: 0.9567 - val_loss: 0.1003 - val_keras_auc: 0.9218 - val_mcc: 0.1558 - val_acc: 0.9610
Epoch 12/15
6969/6969 [==============================] - 14s 2ms/step - loss: 0.1064 - keras_auc: 0.9237 - mcc: 0.3852 - acc: 0.9552 - val_loss: 0.1009 - val_keras_auc: 0.9254 - val_mcc: 0.1205 - val_acc: 0.9650
Epoch 13/15
6969/6969 [==============================] - 15s 2ms/step - loss: 0.0977 - keras_auc: 0.9271 - mcc: 0.3988 - acc: 0.9610 - val_loss: 0.1177 - val_keras_auc: 0.9284 - val_mcc: 0.0785 - val_acc: 0.9616
Epoch 14/15
6969/6969 [==============================] - 15s 2ms/step - loss: 0.1037 - keras_auc: 0.9295 - mcc: 0.3943 - acc: 0.9571 - val_loss: 0.0961 - val_keras_auc: 0.9307 - val_mcc: 0.0802 - val_acc: 0.9621
Epoch 15/15
6969/6969 [==============================] - 15s 2ms/step - loss: 0.0901 - keras_auc: 0.9321 - mcc: 0.4340 - acc: 0.9637 - val_loss: 0.1066 - val_keras_auc: 0.9337 - val_mcc: 0.1643 - val_acc: 0.9552
在这里,我可以看到我的训练指标大约是0.43(对于CV来说更高!),但是如果我进行预测并计算指标,结果大约是0.71。 (当然是正确和准确的)
我正在寻找一种在训练过程中准确计算我的马修斯相关系数的方法,任何建议都会有很大帮助。