2016-12-08 13 views
11

Mam wielo-wyjściowy (200) binarny model klasyfikacji, który napisałem w keras.Jak obliczyć charakterystykę odbioru (ROC) i AUC w kamerze?

W tym modelu chcę dodać dodatkowe dane, takie jak ROC i AUC, ale według mojej wiedzy keras nie ma wbudowanych funkcji metrycznych ROC i AUC.

Próbowałem zaimportować ROC, funkcje AUC od scikit-learn

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']) 

ale to daje ten błąd:

Exception: Invalid metric: roc_curve

Jak Dodam ROC AUC do Keras?

+0

Napisz własną funkcję AUC i zrobić model.predict - patrz [tutaj] (http://stackoverflow.com/a/41722962/ 5307226) – ahmedhosny

Odpowiedz

5

"roc_curve", "auc" nie są standardowymi danymi, których nie można przekazać w ten sposób do zmiennej metryki, jest to niedozwolone. Możesz przekazać coś w rodzaju "fmeasure", które jest standardową miarą.

przejrzeć dostępne metryki tutaj: https://keras.io/metrics/ Można też rzucić okiem na celu swój własny Metric: https://keras.io/metrics/#custom-metrics

mają również zapoznać się metodą generate_results mowa w niniejszym blogu, ROC AUC ... https://vkolachalama.blogspot.in/2016/05/keras-implementation-of-mlp-neural.html

6

i rozwiązać mój problem w ten sposób

rozważenia masz testowania zestaw danych x_test dla funkcji i y_test dla odpowiednich celów.

najpierw przewidzieć cele z funkcji za pomocą naszego wyszkolonego modelu

y_pred = model.predict_proba(x_test) 

następnie z sklearn sprowadzamy roc_auc_score funkcję, a następnie prosty wprost pierwotne cele i przewidywane cele do funkcji.

roc_auc_score(y_test, y_pred) 
7

Ze względu na to, że nie można obliczyć ROC & AUC przez mini-partii, można tylko obliczyć ją na koniec jednej epoki. Istnieje rozwiązanie z jamartinh, ja załatać kody poniżej dla wygody:

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

Czy można wywołać roc_callback na innym zestawie sprawdzania poprawności dla każdej epoki, na przykład przez określenie metody validation_split i shuffle = True wewnątrz metody dopasowania, a następnie przekazanie zestawu sprawdzania poprawności do wywołania zwrotnego roç? Nie jestem pewien poprawnej składni, aby to zrobić. Każda pomoc? Dziękuję –

Powiązane problemy