2016-12-08 4 views
11

У меня есть двоичная модель классификации с несколькими выходами (200), которую я написал в keras.Как вычислить получение эксплуатационных характеристик (ROC) и AUC в keras?

В этой модели я хочу добавить дополнительные показатели, такие как ROC и AUC, но, насколько мне известно, keras dosen't имеют встроенные метрические функции ROC и AUC.

Я пытался импортировать ROC, АУК функции из scikit учиться

from sklearn.metrics import roc_curve, auc 
from keras.models import Sequential 
from keras.layers import Dense 
. 
. 
. 
model.add(Dense(200, activation='relu')) 
model.add(Dense(300, activation='relu')) 
model.add(Dense(400, activation='relu')) 
model.add(Dense(300, activation='relu')) 
model.add(Dense(200,init='normal', activation='softmax')) #outputlayer 

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

, но это дает эту ошибку:

Exception: Invalid metric: roc_curve

Как следует добавить ROC, АУК в keras?

+0

Оставить свою ПКА функции и сделать model.predict - см [здесь] (http://stackoverflow.com/a/41722962/ 5307226) – ahmedhosny

ответ

5

'roc_curve', 'auc' не являются стандартными метриками, которые вы не можете передать им как переменную метрики, это недопустимо. Вы можете передать что-то вроде 'fmeasure', которое является стандартной метрикой.

Обзор имеющиеся метрики здесь: https://keras.io/metrics/ Вы также можете взглянуть на то, чтобы ваши собственные метрики: https://keras.io/metrics/#custom-metrics

также взглянуть на метод generate_results упомянутых в этом блоге для РПЦ, ППК ... https://vkolachalama.blogspot.in/2016/05/keras-implementation-of-mlp-neural.html

6

я решил мою проблему таким образом

рассмотреть у вас есть набор данных тестирования x_test для функций и y_test для соответствующих целей.

первым мы предсказываем цели из функции, используя нашу обученную модель

y_pred = model.predict_proba(x_test) 

затем из sklearn мы импортируем roc_auc_score функцию, а затем просто передача первоначальные цели и прогнозируемые цели к функции.

roc_auc_score(y_test, y_pred) 
7

Благодаря тому, что вы не можете рассчитывать ROC & АУК по мини-партий, можно только вычислить его на конце одной эпохи. Существует решение от jamartinh, я патча коды ниже для удобства:

from sklearn.metrics import roc_auc_score 
class roc_callback(Callback): 
    def __init__(self,training_data,validation_data): 
     self.x = training_data[0] 
     self.y = training_data[1] 
     self.x_val = validation_data[0] 
     self.y_val = validation_data[1] 


    def on_train_begin(self, logs={}): 
     return 

    def on_train_end(self, logs={}): 
     return 

    def on_epoch_begin(self, epoch, logs={}): 
     return 

    def on_epoch_end(self, epoch, logs={}): 
     y_pred = self.model.predict(self.x) 
     roc = roc_auc_score(self.y, y_pred) 
     y_pred_val = self.model.predict(self.x_val) 
     roc_val = roc_auc_score(self.y_val, y_pred_val) 
     print('\rroc-auc: %s - roc-auc_val: %s' % (str(round(roc,4)),str(round(roc_val,4))),end=100*' '+'\n') 
     return 

    def on_batch_begin(self, batch, logs={}): 
     return 

    def on_batch_end(self, batch, logs={}): 
     return 

model.fit(X_train, y_train, validation_data=(X_test, y_test), callbacks=[roc_callback(training_data=(X_train, y_train),validation_data=(X_test, y_test))]) 
+0

Можно ли вызвать roc_callback на другую проверку, установленную для каждой эпохи, например, указав validation_split и shuffle = True внутри метода fit, а затем передав проверку, установленную на обратный вызов roç? Я не уверен в правильном синтаксисе для этого. Любая помощь? Спасибо –

Смежные вопросы