加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何计算keras中的接收操作特性(ROC)和AUC?

发布时间:2020-12-20 10:33:04 所属栏目:Python 来源:网络整理
导读:我有一个多输出(200)二进制分类模型,我在keras中写道. 在这个模型中,我想添加其他指标,如ROC和AUC,但据我所知,keras没有内置的ROC和AUC指标函数. 我试图从scikit-learn导入ROC,AUC功能 from sklearn.metrics import roc_curve,aucfrom keras.models import S
我有一个多输出(200)二进制分类模型,我在keras中写道.

在这个模型中,我想添加其他指标,如ROC和AUC,但据我所知,keras没有内置的ROC和AUC指标函数.

我试图从scikit-learn导入ROC,AUC功能

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(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?

解决方法

由于您无法通过小批量计算ROC和AUC,因此您只能在一个时期结束时计算它.从 jamartinh开始有一个解决方案,为方便起见,我修补了下面的代码:

from sklearn.metrics import roc_auc_score
from keras.callbacks import Callback
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,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,logs={}):
        return

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

使用tf.contrib.metrics.streaming_auc的更具攻击性的方法:

import numpy as np
import tensorflow as tf
from sklearn.metrics import roc_auc_score
from sklearn.datasets import make_classification
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
from keras.callbacks import Callback,EarlyStopping


# define roc_callback,inspired by https://github.com/keras-team/keras/issues/6050#issuecomment-329996505
def auc_roc(y_true,y_pred):
    # any tensorflow metric
    value,update_op = tf.contrib.metrics.streaming_auc(y_pred,y_true)

    # find all variables created for this metric
    metric_vars = [i for i in tf.local_variables() if 'auc_roc' in i.name.split('/')[1]]

    # Add metric variables to GLOBAL_VARIABLES collection.
    # They will be initialized for new session.
    for v in metric_vars:
        tf.add_to_collection(tf.GraphKeys.GLOBAL_VARIABLES,v)

    # force to update metric values
    with tf.control_dependencies([update_op]):
        value = tf.identity(value)
        return value

# generation a small dataset
N_all = 10000
N_tr = int(0.7 * N_all)
N_te = N_all - N_tr
X,y = make_classification(n_samples=N_all,n_features=20,n_classes=2)
y = np_utils.to_categorical(y,num_classes=2)

X_train,X_valid = X[:N_tr,:],X[N_tr:,:]
y_train,y_valid = y[:N_tr,y[N_tr:,:]

# model & train
model = Sequential()
model.add(Dense(2,activation="softmax",input_shape=(X.shape[1],)))

model.compile(loss='categorical_crossentropy',auc_roc])

my_callbacks = [EarlyStopping(monitor='auc_roc',patience=300,verbose=1,mode='max')]

model.fit(X,y,validation_split=0.3,shuffle=True,batch_size=32,nb_epoch=5,callbacks=my_callbacks)

# # or use independent valid set
# model.fit(X_train,#           validation_data=(X_valid,y_valid),#           batch_size=32,#           callbacks=my_callbacks)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读