用于优化精度和召回/灵敏度和特异性的损失函数?

数据挖掘 神经网络 喀拉斯 优化 损失函数 公制
2021-09-25 07:15:41

根据keras-team/keras/pull/9393/files,我一直使用精确度和召回率作为我的指标

敏感性和特异性是我想要优化的。每个时代我都会输出它:

class SensitivitySpecificityCallback(Callback):
    def on_epoch_end(self, epoch, logs=None):
        if epoch:
            x_test = self.validation_data[0]
            y_test = self.validation_data[1]
            predictions = self.model.predict(x_test)
            output_sensitivity_specificity(epoch, predictions, y_test)


def output_sensitivity_specificity(epoch, predictions, y_test):
    y_test = np.argmax(y_test, axis=-1)
    predictions = np.argmax(predictions, axis=-1)
    c = confusion_matrix(y_test, predictions)
    print('Confusion matrix:\n', c)
    print('[{:03d}] sensitivity'.format(epoch), c[0, 0] / (c[0, 1] + c[0, 0]))
    print('[{:03d}] specificity'.format(epoch), c[1, 1] / (c[1, 1] + c[1, 0]))

在我的第 203 个 epoch,我得到了一个很好的结果,然后一切都在下坡——方向错误!——从那里开始。

如何优化灵敏度和特异性?- 考虑更新权重,和/或开发自定义损失函数……

1个回答

评论提出了两个重要的观点:

  • 你不能直接优化敏感性或特异性
  • 您应该将模型保存在最佳时期并使用该模型

下面我解释一些不直接相关的东西,但对你来说可能会很有趣:

您可以将权重添加到某些示例的损失中。例如,您可以增加正例的权重,这意味着模型将更多地专注于正确分类正例,而可能会牺牲负例。如果您的数据遭受类别不平衡,这将特别有用。