如何获得深度学习模型的平均绝对误差 (MAE)

Posted

技术标签:

【中文标题】如何获得深度学习模型的平均绝对误差 (MAE)【英文标题】:How to get Mean Absolute Errors (MAE) for deep learning model 【发布时间】:2021-11-13 08:24:36 【问题描述】:

我正在使用深度自动编码器模型开发推荐系统。如何定义mean absolute error(MAE)损失函数,并用它来计算模型准确率。

这是模型

model = deep_model(train_, layers, activation, last_activation, dropout, regularizer_encode, regularizer_decode)
model.compile(optimizer=Adam(lr=0.001), loss="mse", metrics=[  ] )
model.summary()

定义数据验证

data_valid =(train, validate)
hist_model = model.fit(x=train, y=train,
                  epochs=100,
                  batch_size=128,
                  validation_data= data_valid, verbose=2, shuffle=True)

【问题讨论】:

loss='mae' 不起作用? 不,它不起作用。 你说它不起作用是什么意思?如果操作正确,它确实有效。 【参考方案1】:

你可以自己定义:

import keras.backend as K

def my_mae(y_true, y_pred):
    return K.mean(K.abs(y_pred - y_true), axis=-1) # -1 is correct, using None gives different result '''

然后这样做:

model.compile(optimizer=Adam(learning_rate=1e-2), loss=my_mae) 

但调用 keras 中实现的方法仍然是一个更好的主意,以这种方式:

model.compile(optimizer=Adam(learning_rate=1e-2), loss=tf.keras.losses.MeanAbsoluteError(name="mean_absolute_error")) 

【讨论】:

【参考方案2】:

我认为你可以使用 scikit-learn 函数 here。这将返回您的预测值。 我建议将模型拟合为:

model.compile(optimizer=Adam(lr=0.001), loss="mae", metrics=[]) 
                           # instead of loss="mse"
model_history = model.fit(
   X_train,   # instead of: x=train, y=train
   y_train,   # why x and y are the same as 'train'?
   epochs=100,
   batch_size=128,
   validation_data=(X_test,y_test))

训练模型后,进行预测:

predicton = model.predict(X_test)

并通过以下方式获得 MAE:

mae_error = mean_absolute_error(y_test, prediction)

【讨论】:

能否详细说明一下,谢谢! @BestDoge*** ***.com/questions/48567012/… 或 ***.com/questions/64181260/… 我也认为这是@Karamo 适合x=train, y=train 的问题,也许是loss="mae" 不能正常工作的原因? @TrườngThuậnNguyễn x=train, y=train 不是问题所在。我正在使用自动编码器模型,其中输出是输入的重建。我确实在模型上使用了 RMSE 函数,结果是 `0.8010【参考方案3】:

我使用 RMSE 来测量模型,结果很好。低于定义的 loss=masked_ms 和 metrics=[masked_rmse_clip] 函数

对于损失函数

def masked_mse(y_true, y_pred):
       # masked function
       mask_true = K.cast(K.not_equal(y_true, 0), K.floatx())
       # masked squared error
       masked_squared_error = K.square(mask_true * (y_true - y_pred))
       masked_mse = K.sum(masked_squared_error, axis=-1) / K.maximum(K.sum(mask_true, axis=-1), 1)
       return masked_mse

指标



def masked_rmse_clip(y_true, y_pred):
        # masked function
        mask_true = K.cast(K.not_equal(y_true, 0), K.floatx())
        y_pred = K.clip(y_pred, 1, 5)
        # masked squared error
        masked_squared_error = K.square(mask_true * (y_true - y_pred))
        masked_mse = K.sqrt(K.sum(masked_squared_error, axis=-1) / K.maximum(K.sum(mask_true, axis=-1), 1))
        return masked_mse


模型

model = deep_model(train, layers, activation, last_activation, dropout, regularizer_encode, regularizer_decode)
model.compile(optimizer=Adam(lr=0.001), loss=masked_mse, metrics=[masked_rmse_clip] )
model.summary()

data_valid =(train, validate)


hist_model = model.fit(x=train, y=train,
                  epochs=100,
                  batch_size=128,
                  validation_data= data_valid, verbose=2, shuffle=True)

我在 100 个 epoch 后得到这个输出

Epoch 100/100
48/48 - 6s - loss: 0.9418 - masked_rmse_clip: 0.8024 - val_loss: 0.9853 - val_masked_rmse_clip: 0.8010

我想要这样的东西给 MAE。所以我需要有关 MAE 的 lossmetrics 功能的帮助。

【讨论】:

以上是关于如何获得深度学习模型的平均绝对误差 (MAE)的主要内容,如果未能解决你的问题,请参考以下文章

深度学习中的损失函数

深度学习中的损失函数

深度学习中的损失函数

深度学习中的损失函数

为啥我得到高 MAE(平均绝对误差)和 MSE(均方误差)与 MAPE(平均绝对百分比误差)相比?

回归任务中的评价指标之MSE,RMSE,MAE,R-Squared,MAPE