Python 自定义TensorFlow度量:给定假阳性率下的真阳性率
我有一个二元分类问题,背景类别(bg)=0,信号类别(sig)=1,为此我正在训练NNs。出于监控目的,我正在尝试使用TensorFlow后端在Keras中实现一个自定义度量,它执行以下操作: 1) 计算我的NN输出上的阈值,该阈值将导致X的假阳性率(将bg分类为信号)(在本例中,X=0.02,但它可以是任何值) 2) 计算此阈值下的真实阳性率 给定numpy数组y_true,y_pred,我将编写如下函数:Python 自定义TensorFlow度量:给定假阳性率下的真阳性率,python,tensorflow,keras,Python,Tensorflow,Keras,我有一个二元分类问题,背景类别(bg)=0,信号类别(sig)=1,为此我正在训练NNs。出于监控目的,我正在尝试使用TensorFlow后端在Keras中实现一个自定义度量,它执行以下操作: 1) 计算我的NN输出上的阈值,该阈值将导致X的假阳性率(将bg分类为信号)(在本例中,X=0.02,但它可以是任何值) 2) 计算此阈值下的真实阳性率 给定numpy数组y_true,y_pred,我将编写如下函数: def eff_at_2percent_metric(y_true, y_pred):
def eff_at_2percent_metric(y_true, y_pred):
#Find list of bg events
bg_list = np.argwhere(y_true < 0.5)
#Order by the NN output
ordered_bg_predictions = np.flip(np.sort(y_pred[bg_list]),axis=0)
#Find the threshold with 2% false positive rate
threshold = ordered_bg_predictions[0.02*round(len(ordered_bg_list))]
#Find list of signal events
sig_list = np.argwhere(y_true > 0.5)
#Order these by NN output
ordered_sig_predictions = np.sort(y_pred[sig_list])
#Find true positive rate with this threshold
sig_eff = 1 - np.searchsorted(ordered_sig_predictions,threshold)/len(ordered_sig_predictions)
return sig_eff
def eff_at_2percent_度量(y_true,y_pred):
#查找bg事件列表
bg_list=np.argwhere(y_true<0.5)
#按NN输出排序
有序预测=np.flip(np.sort(y_pred[bg_list]),轴=0)
#找到假阳性率为2%的阈值
阈值=有序bg预测[0.02*轮(len(有序bg列表))]
#查找信号事件列表
sig_list=np.argwhere(y_true>0.5)
#通过NN输出对其进行排序
有序的信号预测=np.sort(y\u pred[sig\u list])
#使用此阈值查找真实阳性率
sig_eff=1-np.searchsorted(有序sig_预测,阈值)/len(有序sig_预测)
返回信号有效
当然,这不起作用,因为要实现自定义度量,y_true和y_pred应该是张量流张量,而不是numpy数组。有什么方法可以让这项工作正确吗?有一个指标,我认为是等效的(特异性是1减去FPR)。完美,这正是我想要的!现在我只需要弄清楚如何在Keras中实现tf指标。已经有一些用于此的stackoverflow线程。谢谢另外,我还发现我可以用自定义回调来做我需要的一切。