如何在 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
【讨论】:
<>
操作是什么?
@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 代码?的主要内容,如果未能解决你的问题,请参考以下文章
回归模型和时间序列模型中的MAPE指标是什么?MAPE指标解读MAPE越大越好还是越小越好使用MAPE指标的注意事项