Python 如何在tensorflow.keras模型度量中使用sklearn AUC?

Python 如何在tensorflow.keras模型度量中使用sklearn AUC?,python,tensorflow,keras,scikit-learn,auc,Python,Tensorflow,Keras,Scikit Learn,Auc,我试图使用tf.keras中的sklearn AUC作为模型度量,因为我使用了这个链接中的定制函数 以下是我的模型: def auc(y_true, y_pred): return tf.py_func(roc_auc_score, (y_true, y_pred), tf.double) model = Model(inputs= [text_x,state_x,grade_x,cat_x,subcat_x,teach_x,num_x],outputs = [output_layer

我试图使用tf.keras中的sklearn AUC作为模型度量,因为我使用了这个链接中的定制函数

以下是我的模型:

def auc(y_true, y_pred):
    return tf.py_func(roc_auc_score, (y_true, y_pred), tf.double)

model = Model(inputs= [text_x,state_x,grade_x,cat_x,subcat_x,teach_x,num_x],outputs = [output_layer])
model.compile(optimizer = 'Adam', loss= 'binary_crossentropy', metrics=[auc])

history = model.fit(x = input_data , y= y_train,batch_size = 180, epochs = 15, callbacks = [es, mc], validation_data = (val_data, y_val))

Train on 69918 samples, validate on 17480 samples
Epoch 1/15
69918/69918 [==============================] - 278s 4ms/sample - loss: 0.3086 - auc: 0.8516 - val_loss: 0.4711 - val_auc: 0.6896
Epoch 2/15
69918/69918 [==============================] - 275s 4ms/sample - loss: 0.1417 - auc: 0.9738 - val_loss: 0.6638 - val_auc: 0.6692
Epoch 3/15
69918/69918 [==============================] - 275s 4ms/sample - loss: 0.0506 - auc: 0.9964 - val_loss: 0.9611 - val_auc: 0.6824
Epoch 4/15
69918/69918 [==============================] - 276s 4ms/sample - loss: 0.0329 - auc: 0.9983 - val_loss: 0.9462 - val_auc: 0.6719
我在评估模型时遇到此错误,ValueError:

test_input_data = [text_test_1,state_test,grade_test,cat_test,subcat_test,teach_test,num_test]
score = model.evaluate(test_input_data, y_test,verbose = 1)
print('test_loss: ',score[0])
print('test_acc: ',score[1])

<ipython-input-103-336c032c70f4> in <module>()
      1 test_input_data = [text_test_1,state_test,grade_test,cat_test,subcat_test,teach_test,num_test]
----> 2 score = model.evaluate(test_input_data, y_test,verbose = 1)
      3 print('test_loss: ',score[0])
      4 print('test_acc: ',score[1])

3 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py in __call__(self, *args, **kwargs)
   1456         ret = tf_session.TF_SessionRunCallable(self._session._session,
   1457                                                self._handle, args,
-> 1458                                                run_metadata_ptr)
   1459         if run_metadata:
   1460           proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

InvalidArgumentError: 2 root error(s) found.
  (0) Invalid argument: ValueError: Only one class present in y_true. ROC AUC score is not defined in that case.
Traceback (most recent call last):

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/script_ops.py", line 209, in __call__
    ret = func(*args)

  File "/usr/local/lib/python3.6/dist-packages/sklearn/metrics/ranking.py", line 355, in roc_auc_score
    sample_weight=sample_weight)

  File "/usr/local/lib/python3.6/dist-packages/sklearn/metrics/base.py", line 76, in _average_binary_score
    return binary_metric(y_true, y_score, sample_weight=sample_weight)

  File "/usr/local/lib/python3.6/dist-packages/sklearn/metrics/ranking.py", line 323, in _binary_roc_auc_score
    raise ValueError("Only one class present in y_true. ROC AUC score "

ValueError: Only one class present in y_true. ROC AUC score is not defined in that case.


     [[{{node metrics_15/auc/PyFunc}}]]
  (1) Invalid argument: ValueError: Only one class present in y_true. ROC AUC score is not defined in that case.
Traceback (most recent call last):

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/script_ops.py", line 209, in __call__
    ret = func(*args)

  File "/usr/local/lib/python3.6/dist-packages/sklearn/metrics/ranking.py", line 355, in roc_auc_score
    sample_weight=sample_weight)

  File "/usr/local/lib/python3.6/dist-packages/sklearn/metrics/base.py", line 76, in _average_binary_score
    return binary_metric(y_true, y_score, sample_weight=sample_weight)

  File "/usr/local/lib/python3.6/dist-packages/sklearn/metrics/ranking.py", line 323, in _binary_roc_auc_score
    raise ValueError("Only one class present in y_true. ROC AUC score "

ValueError: Only one class present in y_true. ROC AUC score is not defined in that case.


     [[{{node metrics_15/auc/PyFunc}}]]
     [[metrics_15/auc/PyFunc/_1683]]
0 successful operations.
0 derived errors ignored.
test\u input\u data=[text\u test\u 1、state\u test、grade\u test、cat\u test、subcat\u test、teach\u test、num\u test]
分数=模型。评估(测试\输入\数据,y \测试,详细=1)
打印('test_loss:',分数[0])
打印('test_acc:',分数[1])
在()
1测试\输入\数据=[文本\测试\ 1、状态\测试、等级\测试、类别\测试、子类别\测试、教学\测试、数值\测试]
---->2分=模型评估(测试\输入\数据,y \测试,详细=1)
3打印('测试丢失:',分数[0])
4打印('test_acc:',分数[1])
3帧
/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py in_u_调用(self,*args,**kwargs)
1456 ret=tf_session.tf_SessionRunCallable(self._session._session,
1457自动控制手柄,args,
->1458运行(元数据)
1459如果运行\u元数据:
1460 proto_data=tf_session.tf_GetBuffer(run_metadata_ptr)
InvalidArgumentError:发现2个根错误。
(0)无效参数:ValueError:y_true中仅存在一个类。在这种情况下,ROC AUC分数没有定义。
回溯(最近一次呼叫最后一次):
文件“/usr/local/lib/python3.6/dist packages/tensorflow/python/ops/script_ops.py”,第209行,在调用中__
ret=func(*args)
文件“/usr/local/lib/python3.6/dist packages/sklearn/metrics/ranking.py”,第355行,在roc_auc_分数中
样品重量=样品重量)
文件“/usr/local/lib/python3.6/dist packages/sklearn/metrics/base.py”,第76行,以二进制平均分数表示
返回二进制度量(y_真,y_分数,样本权重=样本权重)
文件“/usr/local/lib/python3.6/dist packages/sklearn/metrics/ranking.py”,第323行,二进制roc auc评分
raise VALUE ERROR(“y_true.ROC AUC分数中仅存在一个类”)
ValueError:y_中只有一个类为true。这种情况下未定义ROC AUC分数。
[{{node metrics_15/auc/PyFunc}}]]
(1) 无效参数:ValueError:y_true中仅存在一个类。在这种情况下未定义ROC AUC分数。
回溯(最近一次呼叫最后一次):
文件“/usr/local/lib/python3.6/dist packages/tensorflow/python/ops/script_ops.py”,第209行,在调用中__
ret=func(*args)
文件“/usr/local/lib/python3.6/dist packages/sklearn/metrics/ranking.py”,第355行,在roc_auc_分数中
样品重量=样品重量)
文件“/usr/local/lib/python3.6/dist packages/sklearn/metrics/base.py”,第76行,以二进制平均分数表示
返回二进制度量(y_真,y_分数,样本权重=样本权重)
文件“/usr/local/lib/python3.6/dist packages/sklearn/metrics/ranking.py”,第323行,二进制roc auc评分
raise VALUE ERROR(“y_true.ROC AUC分数中仅存在一个类”)
ValueError:y_中只有一个类为true。这种情况下未定义ROC AUC分数。
[{{node metrics_15/auc/PyFunc}}]]
[[metrics_15/auc/PyFunc/_1683]]
0成功的操作。
忽略0个派生错误。
我尝试了tf.keras.metrics.AUC,然后它工作得很好,但是当使用sklearn AUC时,我遇到了这个错误。 如何在tf.keras.model度量函数中设置sklearn的AUC。
任何帮助都将不胜感激。谢谢。

我也遇到了同样的问题,但在Github上发现了这段代码:pranaya mathur帐户 你也可以这样做

from sklearn.metrics import roc_auc_score
def auc_score(y_true, y_pred):
    if len(np.unique(y_true[:,1])) == 1:
        return 0.5
    else:
        return roc_auc_score(y_true, y_pred)
def auc(y_true, y_pred):
    return tf.py_func(auc1, (y_true, y_pred), tf.double)
#in model.compile you can use auc function name
model.compile(optimizer=optimizer,loss='categorical_crossentropy',metrics=[auc])

问题是y_测试只对其中一个类有标签,你应该对两个类都有标签,否则无法计算AUC。@MatiasValdenegro你是对的,我的数据是不平衡的数据,我有两个标签,在keras模型中将数据按批次划分,可能一个批次中只有一个标签。那么如何克服它呢@MatiasValdenegro甚至我在尝试使用它时也遇到了类似的问题。我们有没有办法编写一个函数,可以跳过只存在一个类标签的批处理。我找不到任何帮助(或)解决此问题的方法。这是否回答了您的问题?