python - 如何向keras添加自定义指标? (平均绝对误差百分比)

标签 python tensorflow keras neural-network deep-learning

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

def pmae(y_true,y_pred):
    return K.mean(K.abs(y_pred - y_true)) / K.mean(K.abs(y_true)) * 100
...
model.compile(loss='mse', optimizer=Adam(),metrics=[pmae])

它可以运行,但值相差很多数量级(当我查看model.history.history.pmae时)

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

y_pred = model.predict(X_test)
pmae = abs(y_pred - y_test).mean() / abs(y_true).mean() * 100

我还尝试将 , axis=-1 添加到 K.mean() 调用中,但没有任何改进(如其他 stackoverflow 答案中所建议的那样)。有谁知道出了什么问题吗?

资源

  1. keras website以 y 的平均值为例:
import keras.backend as K

def mean_pred(y_true, y_pred):
    return K.mean(y_pred)

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy', mean_pred])
  • 其他人在 stackoverflow 上回答了有关其他自定义指标的问题(例如 Keras custom RMSLE metrichow to implement custom metric in keras? ),但那里的回答并没有帮助我进行 pmae 计算。
  • 最佳答案

    让我们将您的实现与 mean_absolute_percentage_error 进行比较在喀拉斯:

    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_truey_pred 都转换为相同的数据类型,并且分母至少为 K.epsilon() (即 set to 1e-7 by default ),因此如果 y_true 接近 0,误差不会达到无穷大。

    关于python - 如何向keras添加自定义指标? (平均绝对误差百分比),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58104698/

    相关文章:

    python - 网状不会实时打印到控制台

    python - 使用占位符作为 tensorflow 中池化的形状

    python - 如何使用FixedLengthRecordReader读取Tensorflow中的自定义数据格式?

    c++ - tensorflow内核代码修改

    tensorflow - keras 模型中的平均权重

    python-3.x - Early Stopping,模型经历了多少个epoch?

    python - 在 numpy 中从单个 block 创建 block 矩阵的更好方法?

    python - 来自 pandas DataFrame 的热图 - 二维数组

    python - zip 参数 #1 在循环 zip 时必须支持迭代错误

    python - 为什么当我设置为 300 时,keras 只执行 10 个 epoch?