EarlyStopping игнорирует мои определенные метрики.Модель керас - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь классифицировать мошенничество с кредитными картами с помощью модели nn Keras. Поскольку набор данных несбалансирован, мне нужно использовать f1_score для улучшения отзыва.

Видимо, не принимает определение f1s. Как отслеживать мои новые показатели в каждой эпохе? Ранняя остановка работает нормально, если с val_loss, но не с определенными Буду признателен за помощь в решении моей проблемы.

Я получаю это сообщение:

Поезд на 139554 проб, проверка на 59810 проб Эпоха 1/10

7 с - потеря: 0,3585 - в соответствии с: 0,9887 - потеря по величине: 0,0560 - допустимая ошибка: 0,9989 /home/libardo/anaconda3/lib/python3.6/site-packages/keras/callbacks.py:526: RuntimeWarning: ранняя остановка, обусловленная метрикой f1s, которая недоступна. Доступны следующие показатели: val_loss, val_acc, убыток, соотв. (self.monitor, ','. join (список (logs.keys ()))), RuntimeWarning EarlyStopping игнорирует мои пользовательские метрики, определенные # 10018

Примечание: мне не удалось вставить сюда свой код. Я прошу прощения за это.

1 Ответ

0 голосов
/ 27 февраля 2019

Я понимаю, что это было опубликовано давным-давно, но я нашел этот вопрос, когда искал тот же ответ, и в конце концов понял это сам. Короче говоря, вы должны помнить, что оба должны определять метрику для обратного вызова EarlyStopping и как метрику при компиляции модели

ОК, поэтому вы определилипользовательская функция потерь или метрика с чем-то вроде этого (взято из https://github.com/keras-team/keras/issues/10018, которое само взято из https://stackoverflow.com/a/45305384/5210098):

#https://stackoverflow.com/a/45305384/5210098
def f1_metric(y_true, y_pred):

    def recall(y_true, y_pred):
        true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
        possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
        recall = (true_positives + K.epsilon()) / (possible_positives + K.epsilon())
        return recall

    def precision(y_true, y_pred):
        true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
        predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
        precision = (true_positives + K.epsilon()) / (predicted_positives + K.epsilon())
        return precision

    precision = precision(y_true, y_pred)
    recall = recall(y_true, y_pred)
    return 2*((precision*recall)/(precision+recall+K.epsilon()))

Теперь, чтобы использовать это с обратным вызовом EarlyStopping, вы можете предоставить его какстрока типа EarlyStopping(monitor='f1_metric') или, для контроля за проверкой используйте вместо нее EarlyStopping(monitor='val_f1_metric').

Но этого недостаточно! Если вы остановитесь там, вы получите ошибку, которую получили.Вам также необходимо указать фактическую функцию в качестве аргумента при компиляции модели с использованием model.compile(metrics=[f1_metric]). Обратите внимание на отсутствие кавычек - вы ссылаетесь на саму функцию.

Если вы компилируете модель, включив функциюиспользуя ключевое слово metrics, а также включите функцию обратного вызова EarlyStopping, тогда она должна работать без ошибок.

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