Kaggle - социальная сеть специалистов по обработке данных и машинному обучению. Принадлежит корпорации Google. В частности она предлагает пройти ряд коротких курсов по программированию, анализу данных и машинному обучению. Меня заинтересовал курс по прогнозированию временных рядов. Попробую применить его для своих задач, связанных с прогнозированием продаж в розничной торговле одеждой. Первая часть курса называется "Линейная регрессия с временными рядами". Для примеров буду использовать свой набор данных.
Работаем в IPython notebook, начальные установки и пакеты
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
simplefilter("ignore") # Игнорировать предупреждения о очистке выходных ячеек
#Установки параметров для Matplotlib
plt.style.use("seaborn-whitegrid")
plt.rc("figure", autolayout=True, figsize=(11, 4))
plt.rc(
"axes",
labelweight="bold",
labelsize="large",
titleweight="bold",
titlesize=14,
titlepad=10,
)
plot_params = dict(
color="0.75",
style=".-",
markeredgecolor="0.25",
markerfacecolor="0.25",
legend=False,
)
from statsmodels.graphics.tsaplots import plot_acf
from sklearn import metrics
import math
Загружаем данные и выводим первые и последние пять строк Параметр parse_dates указывает pandas, как нужно преобразовать данные в объект pandas, предназначенный для хранения дат.
"shop_rev.xlsx",
parse_dates=['month'],
index_col='month')
pd.concat([df.head(), df.tail()])
pants | jacket | total | |
---|---|---|---|
month | |||
2015-01-01 | 28325 | 11778 | 40103 |
2015-02-01 | 21066 | 10811 | 31877 |
2015-03-01 | 21317 | 13883 | 35200 |
2015-04-01 | 28916 | 13133 | 42049 |
2015-05-01 | 35306 | 10577 | 45883 |
2021-08-01 | 24227 | 16871 | 41098 |
2021-09-01 | 15710 | 27528 | 43238 |
2021-10-01 | 18066 | 37273 | 55339 |
2021-11-01 | 18472 | 51906 | 70378 |
2021-12-01 | 22177 | 39621 | 61798 |
Данные представляют собой месячные продажи в некоторых условных единицах магазина одежды по двум позициям : брюки, куртки и суммарные продажи. Так как в дальнейшем будем работать только с общими продажами, две ненужные колонки удалим
df.head()
total | |
---|---|
month | |
2015-01-01 | 40103 |
2015-02-01 | 31877 |
2015-03-01 | 35200 |
2015-04-01 | 42049 |
2015-05-01 | 45883 |
Добавим фиктивную ось времени или по другому функцию временных шагов
df.head()
total | time | |
---|---|---|
month | ||
2015-01-01 | 40103 | 0 |
2015-02-01 | 31877 | 1 |
2015-03-01 | 35200 | 2 |
2015-04-01 | 42049 | 3 |
2015-05-01 | 45883 | 4 |
Выведем график временного ряда с линейным трендом
month | total | Lag_12 |
---|---|---|
2015-01-01 | 39352 | NaN |
2015-02-01 | 31923 | NaN |
2015-03-01 | 35037 | NaN |
2015-04-01 | 41981 | NaN |
2015-05-01 | 46049 | NaN |
fig, ax = plt.subplots()
ax = sns.regplot(x='Lag_12', y='total', data=df, ci=None, scatter_kws=dict(color='0.25'))
ax.set_aspect('equal')
ax.set_title('Lag 12 Plot of Total Sales');
Видим совершенно четкую линейную зависимость. Это дает возможность моделировать временной ряд и будущее значение можно будет предсказать по предыдущим значениям. Отбросим отсутствующие значения вместе с соответствующими датами и используем модель линейной регрессии
from sklearn.linear_model import LinearRegression
X = df.loc[:, ['Lag_12']]
# удаляем отсутствующие значения
X.dropna(inplace=True)
# создаем целевой вектор
y = df.loc[:, 'total']
# отбросить соответствующие значения целевого показателя
y, X = y.align(X, join='inner')
model = LinearRegression()
model.fit(X, y)
y_pred = pd.Series(model.predict(X), index=X.index)
Используем модель линейной регрессии для предсказания выручки. Делим наши данные на обучающий и тестовый набор. Обучаем модель на обучающей части и после этого делаем прогноз на тестовой.
X_train, X_test=X[0:66],X[66:]
y_train, y_test=y[0:66],y[66:]
Decision Linear Regression Metrics:
R^2 Score = 0.868
Mean Absolute Percentage Error = 9.16
Mean Absolute Error = 4971.57
Mean Squared Error = 31732803.97
Root Mean Squared Error = 5633.19
Выведем график
Повторим все для тестовой части
mae = metrics.mean_absolute_error(y_test, test_fcst)
mse = metrics.mean_squared_error(y_test, test_fcst)
mape = MAPE(y_test, pred)
rmse = math.sqrt(mse)
r2 = metrics.r2_score(y_test, test_fcst)
# Выводим метрики для тестовой выборки print('Decision Linear Regression Metrics:') print(f'R^2 Score = {r2:.3f}') print(f'Mean Absolute Percentage Error = {mape:.2f}') print(f'Mean Absolute Error = {mae:.2f}') print(f'Mean Squared Error = {mse:.2f}') print(f'Root Mean Squared Error = {rmse:.2f}')
Decision Linear Regression Metrics: R^2 Score = 0.615 Mean Absolute Percentage Error = 14.25 Mean Absolute Error = 6973.32 Mean Squared Error = 48953396.23 Root Mean Squared Error = 6996.67Выведем график
plt.plot(list(test_fcst)) plt.plot(list(y_test)) plt.xlabel('Steps into the test set') plt.ylabel('Test Total Sales') plt.legend(['Total test', 'Predict test'])
Комментариев нет:
Отправить комментарий