tf.metrics.auc 的产量与 sklearn.metrics.roc_auc_score 非常不同

Wur*_*rmD 6 python scikit-learn tensorflow

tf.metrics.auc与相比产生非常不同的值sklearn.metrics.roc_auc_score与某些情况

我无法确定这种情况的特殊性,但获得一个可重现的示例:

代码和数据可从https://www.dropbox.com/s/ym2ptqaqw2qjite/minimal_program_AUC.zip?raw=1下载

代码:

import sklearn.metrics
from keras.models import Model, load_model
import tensorflow as tf
from keras import backend as K
import numpy as np

def auc(y_true, y_pred):
    auc = tf.metrics.auc(y_true, y_pred, num_thresholds=65)[1]
    K.get_session().run(tf.local_variables_initializer())
    return auc

model = load_model('Model.hdf5', custom_objects={'auc': auc})

X = np.fromfile('X_test(65, 80, 1292, 1).txt', sep=',').reshape(65, 80, 1292, 1)
Y = np.fromfile('Y_test(65, 1).txt', sep=',').reshape(65, 1)
batchsize = 45

evaluation = model.evaluate(X, Y, batch_size=batchsize, verbose=1)

predictions = model.predict(X, batch_size=batchsize, verbose=0, steps=None)

auc = sklearn.metrics.roc_auc_score(Y, predictions, average='macro', sample_weight=None)

print('sklearn.metrics.roc_auc_score: ', auc)
print('vs')
print('tf.metrics.auc: ', evaluation[2])
Run Code Online (Sandbox Code Playgroud)

结果:

sklearn.metrics.roc_auc_score:0.40476190476190477

tf.metrics.auc:0.2756012196724231



讨论:我读过这tf.metrics.auc 是近似值,越高,num_thresholds它就越接近理想的 AUC。(更改请求/旁注:我的数据只有 65 个样本,因此使用 65 个阈值可以计算理想的 AUC)我已经使用多个阈值进行了测试,输出的 AUC 值有所不同,但并不完全匹配sklearn.metrics.roc_auc_score

编辑:我也进行了测试,batchsize = X.shape[0]因此它仅在一批中计算,并且没有“修复”它

我不知道是sklearn.metrics.roc_auc_score近似的还是理想的。

问: 怎么了?我们应该创建错误单吗?

EDIT2:这里是罪魁祸首,预测几乎都是0.5,这导致TF AUC计算的近似性质被加剧

0.506357729434967 0.4968412518501282 0.506340742111206 0.4976259469985962 0.5060197114944458 0.5054880976676941 0.506357729434967 0.5063252449035645 0.506357729434967 0.5028414130210876 0.49709421396255493 0.505968451499939 0.49766668677330017 0.506357729434967 0.506357729434967 0.5059878826141357 0.5063162446022034 0.5062981247901917 0.506357729434967 0.4971608519554138 0.506357729434967 0.506357729434967 0.4985077977180481 0.4981336295604706 0.5063574314117432 0.49704432487487793 0.506357729434967 0.5062510967254639 0.506357729434967 0.49734553694725037 0.49696335196495056 0.506357729434967 0.506357729434967 0.4975492060184479 0.49732962250709534 0.5019861459732056 0.4974926710128784 0.506357729434967 0.4975907504558563 0.49734383821487427 0.49705255031585693 0.506357729434967 0.5036844611167908 0.506357729434967 0.5041226148605347 0.5029517412185669 0.49785998463630676 0.5061197280883789 0.506357729434967 0.49714547395706177 0.506357729434967 0.506357729434967 0.5018795132637024 0.4972745478153229 0.49750152230262756 0.5063059329986572 0.49842190742492676 0.5164832472801208 0.496705561876297 0.49700644612312317 0.49824368953704834 0.5063083171844482 0.5031181573867798 0.49714842438697815 0.4966968595981598

Wur*_*rmD 0

基于 Qusai 提到的内容:

  • 评估工作分类器时,小于 0.5 的 AUC 值不是预期的
  • 在 TF 案例中(引用文档)“使用一组线性间隔的阈值”,这意味着如果有一些预测非常接近,则分数将非常偏离。

本示例中的分类器并未真正发挥作用,当标签值为 0 或 1 时,上述预测结果接近 0.5。

另外,鉴于预测都非常接近,计算出的分数确实相差很大。