преобразование пользовательской функции metri c на основе Sklearn -> для использования в качестве метрики c Keras для обратных вызовов - PullRequest
0 голосов
/ 10 января 2020

Мне уже дали пользовательский код метрики c, по которому будет оцениваться моя модель, но они использовали sklearn's метрики. Я знаю, если у меня есть метри c, я могу использовать его в обратных вызовах, таких как


model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy', custom_metric])


ModelCheckpoint(monitor='val_custom_metric',
                save_best_only=True,
                save_weights_only=True,
                mode='max',
                verbose=1)

Это проблема с несколькими выходами с 3 метками,

Представления оцениваются с использованием иерархическое усреднение по макросам. Во-первых, для каждого компонента вычисляется стандартное повторное усреднение по макросам (label_1, label_2 или label_3). Окончательный результат представляет собой средневзвешенное значение этих трех показателей, при label_1 указан удвоенный вес. Вы можете повторить метри c с помощью следующего python фрагмента:

, и я не могу понять, как мне реализовать приведенный ниже код в keras-

import numpy as np
import sklearn.metrics

scores = []
for component in ['label_1', 'label_2', 'label_3']:
    y_true_subset = solution[solution[component] == component]['target'].values
    y_pred_subset = submission[submission[component] == component]['target'].values
    scores.append(sklearn.metrics.recall_score(
        y_true_subset, y_pred_subset, average='macro'))
final_score = np.average(scores, weights=[2,1,1])

Как я могу преобразовать его в форму для использования в качестве метри c? или более точно, как я могу использовать keras.backend или реализовать этот код?

1 Ответ

0 голосов
/ 10 января 2020

Вы можете реализовать только метри c, остальное очень неясно и, конечно, не будет участвовать в Керасе.

threshold = 0.5 #you can work this threshold for better results


#considering y_true is made of 0 and 1 only
#considering output shape is (batch, 3)
def custom_metric(y_true, y_pred):
    weights = K.constant([2,1,1]) #shape (3,)

    y_pred = K.cast(K.greater(y_pred, threshold), K.floatx()) #shape (batch, 3)
    true_positives = K.sum(y_pred * y_true, axis=0)  #shape (3,)
    false_negatives = K.sum((1-y_pred) * y_true, axis=0) #shape (3,)

    recall = true_positives / (true_positives + false_negatives)
    return K.mean(recall * weights)

Обратите внимание, что это будет рассчитываться по частям, и поскольку знаменатель отличается в зависимости от результатов, вычисленный показатель c по партиям будет отличаться по сравнению с тем, когда вы используете показатель c для весь набор данных.

Возможно, вам понадобятся большие размеры партий, чтобы избежать нестабильности метрических c. И может быть интересно применить metri c ко всем данным с обратным вызовом, чтобы получить точный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...