一、 Mean Absolute Error
平均绝对误差(MAE)也是一种常用的回归损失函数,它是目标值
y
j
y_{j}
yj与预测值
y
j
^
\hat{y_{j}}
yj^之差绝对值的和,表示了预测值的平均误差幅度,而不需要考虑误差的方向,其公式如下所示:
M
A
E
=
1
N
∑
i
=
1
N
∣
y
j
−
y
j
^
∣
MAE= \frac{1}{N} \sum_{i =1}^{N} |y_{j} - \hat{ y_{j} } |
MAE=N1i=1∑N∣yj−yj^∣
二、 Mean Square Error
均方误差(MSE)用于计算预测值
y
j
^
\hat{y_{j}}
yj^与真实值
y
j
y_{j}
yj之间差的平均值,其公式如下所示:
M
S
E
=
1
N
∑
i
=
1
N
(
y
j
−
y
j
^
)
2
MSE = \frac{1}{N}\sum_{i=1}^{N}(y_{j}-\hat{y_{j}})^2
MSE=N1i=1∑N(yj−yj^)2
三、 代码实现MAE和MSE
import numpy as np
import matplotlib.pyplot as plt
def MAE_Loss(act, pred):
diff = act - pred
diff_abs = np.absolute(diff)
mae = diff_abs.mean()
return mae
def MSE_Loss(act, pred):
diff = act - pred
diff_square = diff ** 2
mse = diff_square.mean()
return mse
'''
create an array containning 500 numbers,
the value range is between -1 and 1.
'''
pred = np.linspace(-1., 1., 500)
# the actual value is 0
target = 0.
l1_y = []
l2_y = []
for x in pred:
y = MAE_Loss(target, x)
l1_y.append(y)
for x2 in pred:
y2 = MSE_Loss(target, x2)
l2_y.append(y2)
plt.plot(pred, l1_y, label="L1_loss")
plt.plot(pred, l2_y, label="L2_loss")
plt.legend()
结果图:
四、 MAE与MSE的比较
通常来说,利用均方差更容易求解,但平方绝对误差则对于局外点更鲁棒。
在机器学习的模型通常是用来找到使目标函数最小的点。在最小值处每一种损失函数都会得到最小值。
MAE优于MSE的情况
由上图可知,当预测值与目标值很接近,误差与方差都很小,而由于局外点的存在使得 MSE误差变得很大。
由于均方误差(MSE)在误差较大点时的损失远大于平均绝对误差(MAE),它会给局外点赋予更大的权重,模型会致力减小局外点造成的误差,从而使得模型的整体表现下降。
所以当训练数据中含有较多的局外点时,平均绝对误差(MAE)更为有效。当我们对所有观测值进行处理时,如果利用MSE进行优化则我们会得到所有观测的均值,而使用MAE则能得到所有观测的中值。与均值相比,中值对于局外点的鲁棒性更好,这就意味着平均绝对误差对于局外点有着比均方误差更好的鲁棒性。
** MSE优于MAE的情况**
但MAE也存在一个问题,特别是对于神经网络来说,它的梯度在极值点处会有很大的跃变,及时很小的损失值也会长生很大的误差,这不利于学习过程。为了解决这个问题,需要在解决极值点的过程中动态减小学习率。MSE在极值点却有着良好的特性,及时在固定学习率下也能收敛。MSE的梯度随着损失函数的减小而减小,这一特性使得它在最后的训练过程中能得到更精确的结果。
总结
L1损失对于局外点更鲁棒,但它的导数不连续使得寻找最优解的过程低效;L2损失对于局外点敏感,但在优化过程中更为稳定和准确。
但现实中还存在两种损失都很难处理的问题。例如某个任务中90%的数据都符合目标值——150,而其余的10%数据取值则在0-30之间。那么利用MAE优化的模型将会得到150的预测值而忽略的剩下的10%(倾向于中值);而对于MSE来说由于局外点会带来很大的损失,将使得模型倾向于在0-30的方向取值。这两种结果在实际的业务场景中都是我们不希望看到的。