How can I specify a loss function to be quadratic weighted kappa in Keras?

后端 未结 2 1175
逝去的感伤
逝去的感伤 2020-12-11 07:43

My understanding is that keras requires loss functions to have the signature:

def custom_loss(y_true, y_pred):

I am trying to use skl

相关标签:
2条回答
  • 2020-12-11 08:12

    You can define it as a custom loss and yes you are right that keras accepts only two arguments in the loss function. Here is how you can define your loss:

    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
    

    Now you can pass this function to your model as:

    model.compile(loss=get_cohen_kappa_score(weights=weights),
                  optimizer='adam')
    model.fit(...)
    
    0 讨论(0)
  • 2020-12-11 08:13

    There are two steps in implementing a parameterized custom loss function (cohen_kappa_score) in Keras. Since there are implemented function for your needs, there is no need for you to implement it yourself. However, according to TensorFlow Documentation, sklearn.metrics.cohen_kappa_score does not support weighted matrix. Therefore, I suggest TensorFlow's implementation of cohen_kappa. However, using TensorFlow in Keras is not that easy... According to this Question, they used control_dependencies to use a TensorFlow metric in Keras. Here is a example:

    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
    

    Since Keras loss functions take (y_true, y_pred) as parameters, you need a wrapper function that returns another function. Here is some code:

    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
    

    Finally, you can use it as follows in 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'])
    

    Regarding using the Cohen-Kappa metric as a loss function. In general it is possible to use weighted kappa as a loss function. Here is a paper using weighted kappa as a loss function for multi-class classification.

    0 讨论(0)
提交回复
热议问题