2016-12-08 69 views
11

我有一個多輸出(200)二進制分類模型,我寫在keras。如何計算keras中的接收操作特性(ROC)和AUC?

在這個模型中,我想添加其他指標,例如ROC和AUC,但是對於我的知識,keras並沒有內置ROC和AUC度量函數。

我試圖導入ROC,AUC功能從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,AUC到keras?

+0

寫自己的AUC功能,做model.predict - 參見[這裏](http://stackoverflow.com/a/41722962/ 5307226) – ahmedhosny

回答

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 & AUC通過微型批,你只能計算它在一個時代的結束。有一個從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,例如通過在fit方法中指定validation_split和shuffle = True,然後將驗證集傳遞給roç回調? 我不確定正確的語法來做到這一點。 任何幫助? 謝謝 –