【问题标题】:How to optimize MAPE code in Python?如何在 Python 中优化 MAPE 代码?
【发布时间】: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 的方式并提高速度?

【问题讨论】:

    标签: python numpy machine-learning statistics data-science


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 2017-09-03
      • 1970-01-01
      • 2013-02-15
      相关资源
      最近更新 更多