如何获得深度学习模型的平均绝对误差 (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 的 loss
和 metrics
功能的帮助。
【讨论】:
以上是关于如何获得深度学习模型的平均绝对误差 (MAE)的主要内容,如果未能解决你的问题,请参考以下文章