【发布时间】:2019-01-26 02:19:18
【问题描述】:
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])
结果:
sklearn.metrics.roc_auc_score:0.40476190476190477
对比
tf.metrics.auc:0.2756012196724231
讨论:我读过tf.metrics.aucis approximate,num_thresholds 越高,它就越接近理想的 AUC。 (更改请求/旁注:我的数据只有 65 个样本,因此使用 65 个阈值可以计算出理想的 AUC)
我测试了几个阈值,输出的 AUC 值有所不同,但与sklearn.metrics.roc_auc_score
编辑:我还用batchsize = X.shape[0] 进行了测试,所以它只计算了 1 个批次,并且没有“修复”它
我没有发现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
【问题讨论】:
-
首先,如果 AUC
标签: python tensorflow scikit-learn