在某些情况下,tf.metrics.auc与sklearn.metrics.roc_auc_score相比产生了非常不同的值。
我无法确定这种情况的特殊性,但我得到了一个可重复的例子:
可从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])结果:
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
发布于 2018-10-26 10:39:17
在库赛提到的基础上:
本例中的分类器实际上不起作用,当标签值为0或1时,得到的预测值接近0.5。
另外,考虑到预测结果非常接近,计算出的分数确实相差很远。
发布于 2021-01-17 03:03:28
我相信在您的培训过程中使用auc作为度量标准(model.fit(..., metrics=[auc],...)意味着它将计算每个小批的auc并给出平均值,这不是auc的工作方式。)
最后使用预测和真实标签的roc_auc_score更准确。您可以通过绘制roc曲线来验证这些值,因为~0.2 auc和~0.4可以很容易地区分开来。
https://stackoverflow.com/questions/51922500
复制相似问题