回归评估指标MAPE(平均绝对百分比误差)结果为inf的原因及解决办法
小小筱筱_
2022年08月05日 21:25

        当我们需要评估一个回归或预测模型的优劣时,可能会用到MAPE这一指标来衡量真实值与预测值之间的误差大小。如果你按照MAPE的计算方法得到的结果是inf,那么说明在真实数据中,存在取值为0的样本。

        我们从平均绝对百分比误差(Mean Absolute Percentage Error)的定义出发,来分析原因:

MAPE%3D%5Cfrac%7B1%7D%7Bn%7D%20%5Csum_%7Bi%3D1%7D%5En%5Cvert%20%5Cfrac%7B%5Chat%7By%7D_%7Bi%7D-y_%7Bi%7D%7D%7By_%7Bi%7D%20%7D%20%20%5Cvert%20%20%5Ctimes%20100%5C%25

显然,若%5Cexists%20i%5Cin%20%5C%7B1%2C2%2C...%2Cn%5C%7D%2Cs.t.y_%7Bi%7D%20%3D0%2C则%5Cvert%20%5Cfrac%7B%5Chat%7By%7D_%7Bi%7D-y_%7Bi%7D%7D%7By_%7Bi%7D%20%7D%20%20%5Cvert%20为无穷,所以MAPE为inf.

        因此想要得到一个理想的MAPE值,就需要剔除真实值为0的样本数据。首先可以观察一下,在n个数据当中,取值为0的数据是不是只占极少数的比例,如果是,那么我们可以用下面的代码(python)将其剔除,从而得到大致的MAPE估计值。

代码块
Python
自动换行
复制代码
#计算MAPE前的数据预处理
test_new=[]
predict_new=[]
for k in range(len(testdata)):
    if testdata[k]!=0:
        test_new.append(testdata[i])
        predict_new.append(predictdata[i])
复制成功

        不能用remove() 方法直接剔除,因为计算mape的输入是两组数据,相当于真实值为0所对应的成对数据我们不再考虑,若仅使用remove方法则无法把相对应的预测值数据剔除,会导致两组数据长度不等,无法计算MAPE指标值。

        对数据进行预处理后,就可以计算mape指标了:

代码块
Python
自动换行
复制代码
def MAPE(y_true, y_pred):
    y_true, y_pred = np.array(y_true), np.array(y_pred)
    return np.mean(np.fabs((y_true - y_pred) / y_true))
mape = format(MAPE(test_new, predict_new), '.4f')
复制成功


祝模型评估顺利。