我需要一个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)
我不喜欢这个实现,它在速度方面非常不优化。如何重写代码,使其更加符合Python风格并提升速度?
回答:
这里有一个使用掩码
的向量化方法 –
def mape_vectorized(a, b): mask = a <> 0 return (np.fabs(a[mask] - b[mask])/a[mask]).mean()
可能更快的一个是先进行除法
计算后再使用掩码
–
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 loopIn [219]: %timeit mape_vectorized(a,b)1000 loops, best of 3: 273 µs per loopIn [220]: %timeit mape_vectorized_v2(a,b)1000 loops, best of 3: 220 µs per loop