欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

机器学习:MAE、MBE 和 MSE

最编程 2024-05-04 19:58:57
...

参考网址

www.jianshu.com/p/1ff7ae7ea…

1/mae(又称为L1损失函数)

mean absolute error ( 平均 绝对 误差 )
absolute:绝对的

image.pngimage.pngimage.png

优点:相比于mse这种评价指标,mae可以更加真实的反应真实值和预测值之间的diff.
     不会像mse那样,因为平方的关系,而导致error>1的时候,进行平方之后会被放大
     
缺点:从上面第二张图中也可以看出来,它的梯度每次更新的时候都是一样的,及不会因为误差的减小而减小。
     这样不利于模型的训练。

总结:所以不能仅仅根据mae的大小来说明模型预测能力的好坏,因为mae的大小和数据的量级有关系。
     我们可以把降低mae作为我们迭代模型的目标。
     
mae是另一种用于`回归`模型的损失函数
mae是真实值与预测值之差的绝对值之和。
mae只是衡量了预测值与真实值之间误差的平均模长,而没有考虑方向,取值范围是0到正无穷。
如果考虑方向的话,则是误差的总和,称为平均偏差mbe (mean bias error)

2/mbe

mean bias error 
平均偏差
就是:真实值与预测值之间的diff,不能只考虑大小,也需要考虑方向。
比如,真实值是[10,8,12,6,8]
     预测值是[12,6,11,7,8]

那么mbe = ((-2)+ 2 + 1 + (-1)+0 ) / 5 

计算mbe的代码

import numpy as np

def mbe(y_true, y_pred):
    '''
    Parameters:
        y_true (array): Array of observed values
        y_pred (array): Array of prediction values

    Returns:
        mbe (float): Biais score
    '''
    # 转化为数组
    y_true = np.array(y_true)
    y_pred = np.array(y_pred)
    
    #更改数组的形状shape
    y_true = y_true.reshape( len(y_true),1 )
    y_pred = y_pred.reshape( len(y_pred),1 )
   
    diff = ( y_true - y_pred )
    mbe = diff.mean()
    print('MBE = ', mbe)

y_true = [10,8,9,12,8]
y_pred = [9,10,7,10,8]

mbe(y_true,y_pred)

3/mse(又称为L2损失函数)

image.pngimage.png

mean square error (平均平方误差),也称为均方差
和mae不同的地方是:
把所有真实值与预测值的diff,先计算平方,然后累加求和。最后除以m(计算均值)

反映预测值与真实值之间差异程度的一种度量,
换句话说,预测值与真实值差的平方的期望值。
MSE可以评价数据的变化程度。
MSE的值越小,说明预测模型的预测能力越好。

mse是最常用的回归损失函数

4/mae(L1损失函数)和 mse(L2损失函数)的比较

简单来说,MSE计算简便,但MAE对异常点有更好的鲁棒性。下面就来介绍导致二者差异的原因。
训练一个机器学习模型时,我们的目标就是找到损失函数达到极小值的点。
当预测值等于真实值时,这两种函数都能达到最小。
下面是这两种损失函数的python代码。你可以自己编写函数,也可以使用sklearn内置的函数。
   
# true: Array of true target variable
# pred: Array of predictions
# true是真实值,pred是预测值
def mse(true, pred):
    return np.sum((true - pred)**2)/len(true)
    
def mae(true, pred):
    return np.sum(np.abs(true - pred))/len(true)
    
# also available in sklearn
# from sklearn.metrics import mean_squared_errorfrom 
# sklearn.metrics import mean_absolute_error

下面让我们观察MAE和RMSE(即MSE的平方根,同MAE在同一量级中)在两个例子中的计算结果。
第一个例子中,预测值和真实值很接近(通过error就可以知道),而且误差的方差也较小。
第二个例子中,因为存在一个异常点,而导致误差非常大。

image.png

MSE对误差取了平方(令e=真实值-预测值),因此若e>1,则MSE会进一步增大误差。
如果数据中存在异常点,那么e值就会很大,那么平方之后就会更大,远大于|e|。
因此,相对于使用MAE计算损失,使用MSE的模型会赋予异常点更大的权重,
这里说的权重指的是异常点的误差在平方之后变得很大,然后在求和之间占的比例很大。

在第二个例子中,用RMSE计算损失的模型会以牺牲其他样本的误差为代价,朝着减小异常点误差的方向更新。然而这就会降低模型的整体性能。

如果训练数据被异常点所污染,那么MAE损失就更好用(比如,在训练数据中存在大量错误的反例和正例标记,但是在测试集中没有这个问题)。
直观上可以这样理解:如果我们最小化MSE来对所有的样本点只给出一个预测值,那么这个值一定是所有目标值的平均值。但如果是最小化MAE,那么这个值,则会是所有样本点目标值的中位数。众所周知,对异常值而言,中位数比均值更加鲁棒,因此MAE对于异常值也比MSE更稳定。

然而MAE存在一个严重的问题(特别是对于神经网络):更新的梯度始终相同,也就是说,即使对于很小的损失值,梯度也很大。这样不利于模型的学习。为了解决这个缺陷,我们可以使用变化的学习率,在损失接近最小值时降低学习率。
而MSE在这种情况下的表现就很好,即便使用固定的学习率也可以有效收敛。
MSE损失的梯度随损失增大而增大,而损失趋于0时则会减小。
这使得在训练结束时,使用MSE模型的结果会更精确。

image.png

5/根据不同情况选择损失函数

如果异常点代表在商业中很重要的异常情况,并且需要被检测出来,则应选用MSE损失函数。
相反,如果只把异常值当作受损数据,则应选用MAE损失函数,因为异常点对于mae影响比较小。

总而言之,处理异常点时,L1损失函数(mae)更稳定,但它的导数不连续,因此求解效率较低。
L2损失函数(mse)对异常点更敏感,但通过令其导数为0,可以得到更稳定的封闭解。
二者兼有的问题是:在某些情况下,上述两种损失函数都不能满足需求。例如,若数据中90%的样本对应的目标值为150,剩下10%030之间。那么使用MAE作为损失函数的模型可能会忽视10%的异常点,而对所有样本的预测值都为150。这是因为模型会按中位数来预测。
而使用MSE的模型则会给出很多介于030的预测值,因为模型会向异常点偏移。
上述两种结果在许多商业场景中都是不可取的。
这些情况下应该怎么办呢?最简单的办法是对目标变量进行变换。而另一种办法则是换一个损失函数。如Huber损失,Log-Cosh损失,分位数损失。
也有些时候可以将利用MAE与MSE训练出的模型进行融合。

6/总结

mae mean absolute error :
    绝对值误差,对异常点不敏感,鲁棒性更好。
    但是有个问题:梯度始终相同,即使是对于很小的损失值,梯度也会很大,这样不利于模型的迭代。
    对于这个问题,我们可以使用变化的学习率,及当接近最小的损失值的时候,减小学习率。
    
mse:
    对异常点敏感,会放大误差。
    好的地方是:
       梯度是可以变化的,随着损失增大而增大,随着损失区域0时则会减小。
       这样mse在模型训练结束的时候,模型的效果会更好。

上一篇: 什么是 ESNext?

下一篇: git push