如何在Keras中将损失函数指定为二次加权kappa?

时间:2019-02-22 16:11:57

标签: python keras scikit-learn

我的理解是,keras要求损失函数具有签名:

-I

我正在尝试使用def custom_loss(y_true, y_pred): ,这需要 (y1,y2,标签=无,权重=无,sample_weight =无)`

如果按原样使用它:

sklearn.metrics.cohen_kappa_score

然后将不会设置model.compile(loss=metrics.cohen_kappa_score, optimizer='adam', metrics=['accuracy']) 。我想将其设置为weights。有什么要传递的吗?

2 个答案:

答案 0 :(得分:4)

您可以将其定义为自定义损失,是的,keras在损失函数中仅接受两个参数是正确的。这是定义损失的方法:

def get_cohen_kappa(weights=None):
    def cohen_kappa_score(y_true, y_pred):
        """
        Define your code here. You can now use `weights` directly
        in this function
        """
        return score
    return cohen_kappa_score

现在您可以通过以下方式将此功能传递给模型:

model.compile(loss=get_cohen_kappa_score(weights=weights),
              optimizer='adam')
model.fit(...)

答案 1 :(得分:1)

在Keras中实现参数化的自定义损失函数(cohen_kappa_score)有两个步骤。由于已经实现了满足您需要的功能,因此您无需自己实现它。但是,根据TensorFlow Documentationsklearn.metrics.cohen_kappa_score不支持加权矩阵。 因此,我建议TensorFlow的cohen_kappa实现。但是,在Keras中使用TensorFlow并非易事... 根据此Question,他们使用control_dependencies在Keras中使用TensorFlow指标。这是一个示例:

import keras.backend as K
def _cohen_kappa(y_true, y_pred, num_classes, weights=None, metrics_collections=None, updates_collections=None, name=None):
   kappa, update_op = tf.contrib.metrics.cohen_kappa(y_true, y_pred, num_classes, weights, metrics_collections, updates_collections, name)
   K.get_session().run(tf.local_variables_initializer())
   with tf.control_dependencies([update_op]):
      kappa = tf.identity(kappa)
   return kappa

由于Keras loss functions(y_true, y_pred)作为参数,因此需要一个包装函数,该包装函数返回另一个函数。这是一些代码:

def cohen_kappa_loss(num_classes, weights=None, metrics_collections=None, updates_collections=None, name=None):
   def cohen_kappa(y_true, y_pred):
      return -_cohen_kappa(y_true, y_pred, num_classes, weights, metrics_collections, updates_collections, name)
   return cohen_kappa

最后,您可以在Keras中按如下方式使用它:

# get the loss function and set parameters
model_cohen_kappa = cohen_kappa_loss(num_classes=3,weights=weights)
# compile model
model.compile(loss=model_cohen_kappa,
          optimizer='adam', metrics=['accuracy'])

关于将Cohen-Kappa度量用作损失函数。通常,可以将加权kappa用作损失函数。这是paper,使用加权kappa作为损失函数进行多类分类。