Python 如何将自定义度量添加到keras?(平均绝对误差百分比)

Python 如何将自定义度量添加到keras?(平均绝对误差百分比),python,tensorflow,keras,neural-network,deep-learning,Python,Tensorflow,Keras,Neural Network,Deep Learning,我试图将平均绝对误差百分比(pmae)添加为keras中的自定义指标。定义为(MAE除以平均绝对y值乘以100)。我试过: def pmae(y_真,y_pred): 返回K.mean(K.abs(y_pred-y_true))/K.mean(K.abs(y_true))*100 ... compile(loss='mse',optimizer=Adam(),metrics=[pmae]) 它运行,但值相差很多数量级(当我查看model.history.history.pmae) 工作nump

我试图将平均绝对误差百分比(pmae)添加为keras中的自定义指标。定义为(MAE除以平均绝对y值乘以100)。我试过:

def pmae(y_真,y_pred):
返回K.mean(K.abs(y_pred-y_true))/K.mean(K.abs(y_true))*100
...
compile(loss='mse',optimizer=Adam(),metrics=[pmae])
它运行,但值相差很多数量级(当我查看
model.history.history.pmae

工作numpy版本(在测试样本上)为:

y_pred=model.predict(X_检验)
pmae=abs(y_pred-y_test).mean()/abs(y_true).mean()*100
我还尝试将
,axis=-1
添加到
K.mean()
调用中,但没有任何改进(如其他stackoverflow答案所示)。有人知道怎么了吗

资源

  • 以y的平均值为例:
  • 将keras.backend导入为K
    def mean_pred(y_true,y_pred):
    返回K.平均值(y_pred)
    model.compile(优化器='rmsprop',
    损失='binary\u交叉熵',
    指标=[“准确度”,平均值]
    
  • 其他人在stackoverflow上回答了其他自定义指标(如和),但那里的回答没有帮助我进行pmae计算

  • 让我们将您的实现与Keras中的实现进行比较:

    def mean_absolute_percentage_error(y_true, y_pred):
        if not K.is_tensor(y_pred):
            y_pred = K.constant(y_pred)
        y_true = K.cast(y_true, y_pred.dtype)
        diff = K.abs((y_true - y_pred) / K.clip(K.abs(y_true),
                                                K.epsilon(),
                                                None))
        return 100. * K.mean(diff, axis=-1)
    
    基于此,以下内容适用于您的案例:

    def percent_mean_absolute_error(y_true, y_pred):
        if not K.is_tensor(y_pred):
            y_pred = K.constant(y_pred)
        y_true = K.cast(y_true, y_pred.dtype)
        diff = K.mean(K.abs((y_pred - y_true)) / K.mean(K.clip(K.abs(y_true),
                                                               K.epsilon(),
                                                               None)))
        return 100. * K.mean(diff)
    

    您尝试的主要区别在于这里的
    y\u true
    y\u pred
    都被转换为相同的数据类型,分母至少是
    K.epsilon()
    (即),因此如果
    y\u true
    接近
    0
    ,那么错误不会无限大,您不能使用吗?我认为它们是一样的…这个链接指的是MAPE(平均绝对百分比误差),它是不同的[平均(绝对百分比误差)]。我正在尝试计算PMAE,或[百分比(平均值(误差))],它对个人观察的大百分比不太敏感。谢谢,这(几乎)有效。我只需要删除最后一行中的“axis=-1”,否则我会得到错误“ValueError:Invalid reduction dimension-1,用于0维的输入。对于输入形状为[]、[]和计算输入张量的'metrics/pmae/Mean_2'(op:'Mean'):输入[1]=”你能解释一下为什么这样做以及我尝试的解决方案有什么问题吗?很高兴我能提供帮助,我删除了错误的
    轴=-1
    。如果不知道您输入了哪些值,就无法确定,但我假设关键的区别在于分母不能变成
    0
    。它始终至少是
    K.epsilon()
    ,默认设置为
    1e-7
    。如果
    y\u true
    接近
    0
    ,这可以防止错误扩大到无穷大。