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



我正在尝试添加百分比平均绝对误差(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

我还尝试在K.mean()调用中添加, axis=-1,但没有改进(如其他堆栈溢出答案所示(。有谁知道出了什么问题?

资源

  1. keras 网站以 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])
  1. 其他人已经在堆栈溢出上回答了其他自定义指标(例如 Keras 自定义 RMSLE 指标以及如何在 keras 中实现自定义指标?(,但那里的回复并没有帮助我计算 pmae。

让我们将您的实现与 Keras 中的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()(默认情况下设置为1e-7(,因此如果y_true接近0,错误不会变为无穷大。

最新更新