Моя функция MAPE (средняя абсолютная ошибка в процентах) возвращает число больше 100, когда я хочу получить процентное значение - PullRequest
1 голос
/ 05 мая 2019

У меня есть набор данных о том, сколько доллар стоит в лирах с 2002 года.

Моя задача - запустить простое экспоненциальное сглаживание этих данных и вычислить MAPE, но мой MAPE возвращает значение около 250 (это меняется, если я изменяю уровень сглаживания).

Мне нужно процентное число, которое должно быть 0-100.

Вот мой код Python

from statsmodels.tsa.api import ExponentialSmoothing, SimpleExpSmoothing, Holt
import numpy as np
import pandas as pd


def mean_absolute_percentage_error(y_true, y_pred):
    y_true, y_pred = np.array(y_true), np.array(y_pred)
    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100


raw_data = pd.read_excel("arda.xlsx", sheet_name=0, parse_dates=['DATE'], index_col='ID')

data_open = raw_data['OPEN']
time_log = np.log(data_open)

ses = SimpleExpSmoothing(time_log).fit(smoothing_level=0.1)
ses1 = ses.forecast(len(time_log))

mape = mean_absolute_percentage_error(time_log, ses1)
print(mape)

А вот и мой вывод

249.08272600004295

Большое спасибо за любую помощь!

1 Ответ

0 голосов
/ 06 мая 2019

«Мне нужно процентное число, которое должно быть 0-100.»

Это не обязательно правда. Я проверил вашу функцию MAPE, и она работает, как ожидалось. Если ваш прогноз в 3,5 раза больше вашего фактического значения, вы получите ошибку 250%. Составьте свои прогнозы против вашей правды, и я уверен, вы обнаружите, что они сильно отличаются.

import numpy as np

def mean_absolute_percentage_error(y_true, y_pred):
    y_true, y_pred = np.array(y_true), np.array(y_pred)
    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100


y_true = np.random.randn(100)
y_pred = y_true * 3.5

print(mean_absolute_percentage_error(y_true, y_pred))

Вы должны:

from matplotlib import pyplot as plt

plt.plot(y_true)
plt.plot(y_pred)
plt.legend(["true", "pred"])
plt.show()
...