平均绝对误差(MAE)、对数平均绝对误差(LMAE)、指数平均绝对误差(EMAE)用法的不同与相似之处

  • 1.概述
    平均绝对误差(MAE)、对数平均绝对误差(LMAE)、指数平均绝对误差(EMAE)都是用来描述两条序列间各点的平均偏差程度的,区别在于他们受残差(特别是残差的离群值)的影响程度不同,按影响程度由小到大依次是:LMAE<MAE<EMAE。因为做对数变换会压缩残差,而做指数变换会拉伸残差。将它们用作目标函数时的差别,类似于做最小二乘OLS时,对目标函数SSE的各点做加权操作,使某些偏差点占大权重,某些偏差点占小权重;参见statsmodels.api.WLS(Weighted Least Squares)

  • 2.下面给出测试代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import pearsonr


freq = 'D'
t0 = '2020-01-01'
data_length = 7*10
num_ts = 3
period = 7
fit_series, origin_series = [], []
time_ticks = np.array(range(data_length))
index = pd.date_range(t0, periods=data_length, freq='D')
np.random.seed(0)
level = 10 * np.random.rand()


for k in range(num_ts):
    # generate fitting data
    np.random.seed(k+10)
    seas_amplitude_fit = (0.1 + 0.3*np.random.rand()) * level
    sig_fit = 0.05 * level  # noise parameter (constant in time)
    source_fit = level + seas_amplitude_fit * np.sin(time_ticks * (2 * np.pi) / period)
    noise_fit = 0.1 * sig_fit * np.random.randn(data_length)
    data_fit = source_fit + noise_fit
    fit_series.append(pd.Series(data=data_fit, index=index))
    # generate origin data
    np.random.seed(k+10)
    seas_amplitude_origin = (0.2 + 0.3 * np.random.rand()) * level
    sig_origin = 0.5 * level  # noise parameter (constant in time)
    source_origin = level + seas_amplitude_origin * np.sin(time_ticks * (2 * np.pi) / period)
    noise_origin = 0.5 * sig_origin * np.random.randn(data_length)
    data_origin = source_origin + noise_origin
    origin_series.append(pd.Series(data=data_origin, index=index))
    # plot the two contrast series
    plt.figure()
    fit_series[k].plot()
    origin_series[k].plot()
    plt.title('contrast fit_series and origin series')
    plt.show()


def MAE(Y, y):
    """
    param:
        Y: 原始序列(假定波动较大)
        y: 拟合序列(假定波动较小)
    return:
        MAE值,该值的大小与两条序列间平均偏差程度成正比,该值越大,平均偏差程度越大;
        两序列间的残差(特别是残差的离群值)对MAE的影响比LMAE大,比EMAE小。
    """

    Y, y = np.array(Y), np.array(y)
    mae = sum(abs(Y - y)) / len(Y)

    return mae


def LMAE(Y, y, a=np.exp(1)):
    """
    param:
        Y: 原始序列(假定波动较大)
        y: 拟合序列(假定波动较小)
        a: 对数的底数,大于1,作用于换底公式,使所有对数函数为单调递增函数;
        该值越大,则两序列间的残差(特别是残差的离群值)对LMAE返回值影响的弱化作用越明显。
    return:
        对数MAE值,该值的大小与两条序列间平均偏差程度成正比,该值越大,平均偏差程度越大;
        但两序列间的残差(特别是残差的离群值)对LMAE的影响比MAE小。
    """

    Y, y = np.array(Y), np.array(y)
    Y[Y < 0] = 0  # 使对数的真数≥1,从而使所有对数值非负,便于统一比较。
    y[y < 0] = 0
    lmae = sum(abs(np.log(abs(Y+1)) / np.log(a) - np.log(abs(y+1)) / np.log(a))) / len(Y)

    return lmae


def EMAE(Y, y, a=1.2):
    """
    param:
        Y: 原始序列(假定波动较大)
        y: 拟合序列(假定波动较小)
        a: 指数的自变量,≥1,该值越大,则两序列间的残差(特别是残差的离群值)对EMAE返回值影响的强化作用越明显;
        当a=1时,EMAE化简为MAE。
    return:
        指数MAE值,该值的大小与两条序列间平均偏差程度成正比,该值越大,平均偏差程度越大;
        且两序列间的残差(特别是残差的离群值)对EMAE的影响比MAE大。
    """

    Y, y = np.array(Y), np.array(y)
    Y[Y < 0] = 0  # 使指数的底数≥1,则所有指数均为递增函数
    y[y < 0] = 0
    emae = sum(abs((Y+1)**a - (y+1)**a)) / len(Y)

    return emae


a, b, c = [], [], []
for k in range(num_ts):
    a.append(MAE(origin_series[k], fit_series[k]))
    b.append(LMAE(origin_series[k], fit_series[k]))
    c.append(EMAE(origin_series[k], fit_series[k]))
print(' 每对序列的MAE:', '\n', a, '\n', '每对序列的LMAE:', '\n', b, '\n', '每对序列的EMAE:', '\n', c, '\n')
print(' EMAE - MAE', '\n', np.array(c)-np.array(a), '\n', 'MAE - LMAE', '\n', np.array(a)-np.array(b), '\n')
print(' MAE与LMAE间的相关程度:', '\n', pearsonr(a, b), '\n', 'MAE与EMAE间的相关程度:', '\n', pearsonr(a, c), '\n',
      'LMAE与EMAE间的相关程度:', '\n', pearsonr(c, b), '\n')

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 3.结果分析
    3.1. 从以上三图可以看到,Figure2的平均偏差最小,Figure3的平均偏差最大。
    3.2. 从数值结果也可以看到,每对序列的MAE、LMAE、EMAE,都是第二列数值最小(对应Figure2),第三列数值最大(对应Figure3),与三张图的偏差程度相符。
    3.3. 三对序列的EMAE-MAE均为正,说明EMAE放大了残差;MAE-LMAE均为正,说明LMAE缩小了残差,与公式的作用是相符的。
    3.4. 三对序列的MAE、LMAE、EMAE的相关系数都很高,P值都很小,说明MAE、LMAE、EMAE几乎完全正相关,则三种指标对序列间平均偏差程度的判断结果几乎是完全等效的,采用任何一种均可。
    3.5. 对于r和P值的解释:例如三对序列的MAE与LMAE的r≈99.95%,P-value≈1.97%,说明对于[1.1384901846078306, 1.0264781458259842, 1.3147042766176245] 与[0.19016978075266716, 0.16388341516116947, 0.22711381950612006]这两条序列,从不相关系统中产生线性相关程度为99.95%的这样两条序列的概率为1.97%,而在一次试验中这样小概率的事件是不可能发生的,所以我们拒绝这两条序列是从不相关系统中产生的这一原假设,转而接受这两条序列是线性相关的这一备择假设。
### 平均绝对误差MAE)的概念 平均绝对误差(Mean Absolute Error, MAE)是一种用于评估回归模型性能的常见误差度量方式。它表示预测值真实值之间的平均绝对差值,能够反映模型预测结果实际数据之间的偏差程度[^2]。 具体来说,MAE通过计算每个样本的真实值预测值之差的绝对值,并取这些绝对差值的平均值得到最终的结果。由于其基于绝对值运算,因此不会受到正负误差相互抵消的影响,从而提供了一个更直观的误差描述。 --- ### 平均绝对误差MAE)的计算方法 假设有一个包含 \( n \) 个样本的数据集,其中每个样本的真实值为 \( y_i \),对应的预测值为 \( \hat{y}_i \) (\( i=1,2,\dots,n \)),那么平均绝对误差可以按照如下公式进行计算: \[ \text{MAE} = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| \] #### 计算过程说明: - 对于每一个样本,计算其真实值 \( y_i \) 和预测值 \( \hat{y}_i \) 的差值。 - 取该差值的绝对值 \(|y_i - \hat{y}_i|\) 来消除正负号影响。 - 将所有样本的绝对差值求和并除以总样本数 \( n \),得到最终的平均绝对误差。 以下是 Python 中实现 MAE 的代码示例: ```python import numpy as np def mean_absolute_error(y_true, y_pred): """ 计算平均绝对误差 (MAE) 参数: y_true: 实际值数组 y_pred: 预测值数组 返回: mae: 平均绝对误差 """ errors = np.abs(np.array(y_true) - np.array(y_pred)) mae = np.mean(errors) return mae # 示例数据 true_values = [3.0, -0.5, 2.0, 7.0] predicted_values = [2.5, 0.0, 2.0, 8.0] mae_result = mean_absolute_error(true_values, predicted_values) print(f"MAE: {mae_result}") ``` 上述代码定义了一个函数 `mean_absolute_error`,接受两个参数:一个是真实的标签值列表 `y_true`,另一个是模型预测的值列表 `y_pred`。通过调用此函数即可获得给定数据集上的 MAE 值。 --- ### 总结 平均绝对误差MAE)作为一项重要的评价指标,在回归分析领域具有广泛的应用价值。相比其他误差度量标准如 MSE 或 RMSE,它的优势在于物理意义清晰以及对异常点相对不敏感的特点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山高月小 水落石出

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值