首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tf.metrics.auc产量与sklearn.metrics.roc_auc_score非常不同

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

Stack Overflow用户
提问于 2018-08-19 23:04:42
回答 2查看 2.7K关注 0票数 6

在某些情况下,tf.metrics.aucsklearn.metrics.roc_auc_score相比产生了非常不同的值。

我无法确定这种情况的特殊性,但我得到了一个可重复的例子:

可从AUC.zip?raw=1下载的代码和数据

代码:

代码语言:javascript
复制
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])

结果:

sklearn.metrics.roc_auc_score: 0.40476190476190477 vs tf.metrics.auc: 0.2756012196724231

讨论:--我读过tf.metrics.auc 是近似的num_thresholds越高,它就越接近理想的AUC。(变更-请求/侧注:我的数据只有65个样本,所以有65个阈值就可以计算理想的sklearn.metrics.roc_auc_score ),我用几个阈值进行了测试,输出的AUC值不同,但与不太匹配

编辑:--我也用batchsize = X.shape[0]进行了测试,所以它只计算了一批,而这并没有“修复”它

我没有发现sklearn.metrics.roc_auc_score是近似的还是理想的。

问:怎么了?我们应该创建一个bug罚单吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-26 10:39:17

在库赛提到的基础上:

  • 小于0.5的AUC值不是评估工作分类器时的期望
  • 在TF案例(引用文档)中,“使用了一组线性间距的阈值”,这意味着如果有一些非常接近的预测,那么得分就会非常差。

本例中的分类器实际上不起作用,当标签值为0或1时,得到的预测值接近0.5。

另外,考虑到预测结果非常接近,计算出的分数确实相差很远。

票数 0
EN

Stack Overflow用户

发布于 2021-01-17 03:03:28

我相信在您的培训过程中使用auc作为度量标准(model.fit(..., metrics=[auc],...)意味着它将计算每个小批的auc并给出平均值,这不是auc的工作方式。)

最后使用预测和真实标签的roc_auc_score更准确。您可以通过绘制roc曲线来验证这些值,因为~0.2 auc和~0.4可以很容易地区分开来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51922500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档