How can we calculate the Mean absolute percentage error (MAPE) of our predictions using Python and scikit-learn?

From the docs, we have only these 4 metric functions for Regressions:


metrics.explained_variance_score(y_true, y_pred)
metrics.mean_absolute_error(y_true, y_pred)  
metrics.mean_squared_error(y_true, y_pred)
metrics.r2_score(y_true, y_pred)


As noted (for example, in Wikipedia), MAPE can be problematic. Most pointedly, it can cause division-by-zero errors. My guess is that this is why it is not included in the sklearn metrics. 

However, it is simple to implement. 

from sklearn.utils import check_arrays
def mean_absolute_percentage_error(y_true, y_pred): 
    y_true, y_pred = check_arrays(y_true, y_pred)

    ## Note: does not handle mix 1d representation
    #if _is_1d(y_true): 
    #    y_true, y_pred = _check_1d_array(y_true, y_pred)

    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100


Use like any other metric...: 

> y_true = [3, -0.5, 2, 7]; y_pred = [2.5, -0.3, 2, 8]
> mean_absolute_percentage_error(y_true, y_pred)
Out[19]: 17.738095238095237


(Note that I'm multiplying by 100 and returning a percentage.) 

... but with caution: 

> y_true = [3, 0.0, 2, 7]; y_pred = [2.5, -0.3, 2, 8]
> #Note the zero in y_pred
> mean_absolute_percentage_error(y_true, y_pred)
-c:8: RuntimeWarning: divide by zero encountered in divide
Out[21]: inf

