如何在 Python 中优化 MAPE 代码?

Posted

技术标签:

【中文标题】如何在 Python 中优化 MAPE 代码?【英文标题】:How to optimize MAPE code in Python? 【发布时间】:2017-07-04 04:58:14 【问题描述】:

我需要一个 MAPE 函数,但是我无法在标准包中找到它……下面是我对这个函数的实现。

def mape(actual, predict): 
    tmp, n = 0.0, 0
    for i in range(0, len(actual)):
        if actual[i] <> 0:
            tmp += math.fabs(actual[i]-predict[i])/actual[i]
            n += 1
    return (tmp/n)

我不喜欢它,它在速度方面不是最佳的。如何将代码重写为更 Pythonic 的方式并提高速度?

【问题讨论】:

【参考方案1】:

这是masking 的一种矢量化方法-

def mape_vectorized(a, b): 
    mask = a <> 0
    return (np.fabs(a[mask] - b[mask])/a[mask]).mean()

division 计算之后使用masking 可能会更快-

def mape_vectorized_v2(a, b): 
    mask = a <> 0
    return (np.fabs(a - b)/a)[mask].mean() 

运行时测试-

In [217]: a = np.random.randint(-10,10,(10000))
     ...: b = np.random.randint(-10,10,(10000))
     ...: 

In [218]: %timeit mape(a,b)
100 loops, best of 3: 11.7 ms per loop

In [219]: %timeit mape_vectorized(a,b)
1000 loops, best of 3: 273 µs per loop

In [220]: %timeit mape_vectorized_v2(a,b)
1000 loops, best of 3: 220 µs per loop

【讨论】:

&lt;&gt; 操作是什么? @panc 和!=一样,不是真正的Pythonic所以你可以忘记它 @NathanFurnal 暗示它是有效的 python 但我什至无法让它工作(只是出于好奇) @SARose 那是python 2!它在任何 python 3+ 代码中都无效【参考方案2】:

使用masked_Arrays 来屏蔽除以零的另一种类似方法是:

import numpy.ma as ma
masked_actual = ma.masked_array(actual, mask=actual==0)
MAPE = (np.fabs(masked_actual - predict)/masked_actual).mean()

【讨论】:

以上是关于如何在 Python 中优化 MAPE 代码?的主要内容,如果未能解决你的问题,请参考以下文章

python中的MAPE计算

MAPE怎么计算

回归模型和时间序列模型中的MAPE指标是什么?MAPE指标解读MAPE越大越好还是越小越好使用MAPE指标的注意事项

无法绘制MAPE和MSE的训练和测试值吗?

回归任务中的评价指标之MSE,RMSE,MAE,R-Squared,MAPE

由于 SSL 导致的 Python 代码执行瓶颈 - 如何优化?