Независимо от того, являетесь ли вы новичком или профессионалом в области науки о данных, сделайте себе одолжение и время от времени принимайте участие в конкурсах, которые соответствуют вашим интересам. Если вас интересуют машинное обучение, текстовый анализ, исследовательский анализ и многое другое, рассмотрите возможность демонстрации своих навыков и идей. Это принесет пользу не только вам, но и другим членам сообщества Data Science. Я настоятельно рекомендую конкурсы проектов, поскольку считаю, что они дают ценные преимущества по следующим причинам:

  1. сеть
  2. Возможность обучения
  3. Практика делает совершенным

Введение в проект

Этот конкурс Kaggle посвящен Прогнозированию временных рядов, включающему прогнозирование продаж в магазине с использованием исторических данных Corporación Favorita, крупного эквадорского продуктового ритейлера. Участники стремятся создать точные прогнозные модели для продаж различных товаров в магазинах Favorita, используя предоставленные данные, такие как даты, сведения о магазине, рекламные акции и фактические продажи. Успешные модели будут оцениваться на основе среднеквадратической логарифмической ошибки (RMSLE), что даст возможность решать проблемы розничной торговли и совершенствовать методы прогнозирования.

Загрузка данных

Каждый проект начинается с просмотра данных и создания папок для хранения файлов на вашем ПК или вызова API Kaggle для прямого извлечения данных.

Единственным фреймом данных с отсутствующими значениями оказался `oil_df`. Как показано красной точкой на изображении ниже, недостающие данные были весьма незначительными, поэтому я отбросил нулевые значения.

Обработка данных

При работе с данными временных рядов за различные временные интервалы (например, ежедневно, ежемесячно или ежегодно) эффективная обработка данных становится решающей для выявления зависимостей, корреляций и понимания, которые могут улучшить результаты вашего моделирования. Мы получили пять наборов данных: поезд, тест, нефть, транзакции, праздники и магазины. Эти наборы содержали дополнительную информацию, такую ​​​​как цены на нефть, праздники, типы магазинов и частоту транзакций. Следующим логическим шагом было объединить эти наборы данных с нашими наборами для обучения и тестирования, используя общие переменные, такие как идентификатор, дата или типология магазина. После процесса слияния следующим шагом была обработка данных. Ниже вы можете найти фрагмент кода, который иллюстрирует действия предварительной обработки, выполняемые для настройки набора обучающих и тестовых данных. Целью было выявить существенные взаимосвязи в данных путем расширения или создания этих новых переменных, которые могли бы повысить значимость прогнозов модели.

final_df_train = final_df_train.sort_values(by="date", ascending=True)
final_df_train.head()

Функция обработки данных извлекает ценную информацию, такую ​​как день недели, месяц, день месяца, год, наличие праздников, дни до следующего праздника и прошлые тенденции продаж. Кроме того, он классифицирует времена года по месяцам. Это преобразование позволяет набору данных выявить закономерности, тенденции и зависимости, связанные со временем. В конечном итоге функция была создана для того, чтобы мы могли лучше понять, какие данные у нас есть, что мы можем с ними делать и как мы можем принимать обоснованные решения для прогнозирования будущих продаж.

Не будем забывать о типах данных каждого столбца, с которым мы имеем дело. Также крайне важно обрабатывать пропущенные значения, скрывать нумерацию столбцов, которые не являются числовыми, поскольку модели ML понимают только числовые столбцы, а не категориальные. После преобразования нашего набора обучающих данных имейте в виду, что нам также необходимо выполнить те же шаги обработки для тестового набора данных, чтобы оба набора данных могли иметь одинаковую форму, когда мы обучаем, а затем прогнозируем результаты. Следующим шагом, я бы сказал, будет небольшое исследование визуальных эффектов и поиск интересных закономерностей или корреляций между переменными.

Вот краткий обзор шагов, которые мы предприняли на данный момент:

1️. Импортированы все наборы данных.

2️. Объединение дополнительных наборов данных с набором обучающих данных › final_df_train

3️. Созданы новые функции для Final_df_train путем извлечения информации из дат с использованием библиотеки datetime.

Исследовательский анализ данных (EDA)

Помните, что цель визуализации данных — не просто визуализировать данные, но и извлечь историю, лежащую в их основе.

В результате проведенного анализа мы извлекли некоторые первоначальные результаты, которые помогут нам соединить все точки зрения позже, когда будет реализована модель. Обычно это причина, по которой мы проводим исследовательский анализ данных, помимо того факта, что мы обрабатываем большой объем данных.

Одним из выводов является то, что продажи имеют тенденцию увеличиваться, когда сотрудники повышаются по службе, и это логично. Между этими двумя факторами существует четкая корреляция, поскольку, как правило, люди, получившие повышение по службе, с большей вероятностью будут мотивированы преуспеть в своей работе.

Изучая тенденции экономики и продаж в Эквадоре, мы изучаем два ключевых компонента его экономики: цены на нефть и розничные продажи. Первая визуализация фокусируется на ценах на нефть в Эквадоре, которые колеблются из-за глобальных экономических сил, геополитических событий и региональных факторов, влияющих на нефтяные рынки. На графике представлена ​​временная шкала из прошлого в настоящее, что позволяет нам наблюдать за годами изменений на рынке нефти. Ось Y представляет цену на нефть, обеспечивая четкое представление о тенденциях цен на нефть в Эквадоре и денежной стоимости этого важнейшего товара.

После того, как была заложена основа, последующий анализ был сосредоточен на выявлении категорий семейных продуктов с самыми высокими продажами. Результаты этой визуализации подчеркивают наиболее эффективные категории семейных продуктов с точки зрения среднего объема продаж. Примечательно, что такие категории, как «Бакалея», «Напитки», «Продукты», «Уборка», «Ежедневно», «Молочные продукты» и «Хлебобулочные изделия», стабильно достигают более высоких средних продаж по сравнению с другими. Эти категории играют ключевую роль в формировании общего дохода от продаж магазина.

Кроме того, когда сопоставимые продажи генерируются в каждый будний день, по воскресеньям, четвергам, средам и понедельникам наблюдаются более высокие показатели продаж, что указывает на дни пиковых продаж. Напротив, в остальные дни недели продажи демонстрируют сравнительно низкие продажи. Эта визуализация эффективно отражает различные тенденции продаж в течение недели, помогая определить дни с заметными всплесками и затишьями продаж.

Продолжая в том же духе, анализ расширил фокус внимания на месяцы, раскрывая интригующие тенденции продаж, соответствующие различным сезонам и событиям. Июль, август, октябрь, ноябрь и декабрь стали периодами пиковой активности продаж. Этот всплеск можно отнести к сезону отпусков, когда зимние месяцы связаны с Рождеством, когда покупатели, как правило, более активны. И наоборот, первые месяцы года, с января по май, ознаменовались периодом сравнительно низких продаж. Возможно, по мере того, как импульс праздничного сезона спадает, клиенты склонны сокращать свои расходы после праздничного ажиотажа. Эти идеи проливают свет на динамику сезона, праздники и поведение потребителей.

Сезонность данных и Расширенный тест Дики Фуллера (ADF)

Понимание сезонности и использование таких инструментов, как Augmented Dickey-Fuller (ADF), имеет большое значение при работе с данными временных рядов, поскольку эти элементы дают жизненно важное представление об основных закономерностях и тенденциях, которые определяют поведение данных с течением времени. В конце концов, мы проводим весь этот анализ для этой цели, понимая поведение данных с течением времени.

Чтобы выявить отдельные элементы данных временных рядов, мы провели сезонную декомпозицию с использованием функции Seasonal_decompose из statsmodels.tsa. Этот метод помогает разбить данные на три фундаментальных компонента: тренд, сезонность и остаток. Была выбрана аддитивная модель, подразумевающая, что наблюдаемые данные представляют собой сумму этих компонентов. Если вы хотите углубиться в теорию, я бы порекомендовал только статью Сделай сам: временные ряды: сезонная декомпозиция, поскольку она послужила мне отправной точкой при проведении анализа.

Важным аспектом этого анализа было визуальное представление сезонности тенденций компонентов. Мы разработали визуализацию с несколькими подграфиками, чтобы представить исходные данные о продажах, предполагаемую тенденцию, сезонные колебания и остатки. Эта визуализация дала ценную информацию о том, как каждый компонент влияет на общую структуру продаж.

Компонент тренда иллюстрировал общее направление продаж, сезонный компонент привлек внимание к повторяющимся закономерностям, а остаточный компонент отображал отклонения как от тренда, так и от сезонных закономерностей. Примечательно, что остаточный компонент демонстрировал относительно однородное и стационарное поведение, что указывает на то, что значительная часть изменчивости и неравномерностей объяснялась трендовыми и сезонными компонентами.

Расширенный тест Дикки-Фуллера — это разновидность статистического теста, называемого тестом единичного корня. Нулевая гипотеза теста состоит в том, что временной ряд может быть представлен единичным корнем, что он не является стационарным (имеет некоторую зависящую от времени структуру). Альтернативная гипотеза (отклоняющая нулевую гипотезу) состоит в том, что временной ряд стационарен. Мы интерпретируем этот результат, используя значение p из теста.

Средняя статистика АПД: -7,093

Более отрицательное значение статистики ADF указывает на более сильный признак того, что данные являются стационарными. В этом случае относительно большое отрицательное значение указывает на высокую вероятность стационарности оцениваемого временного ряда.

Среднее значение p: 1,187

И отрицательная статистика ADF, и низкое значение p предоставляют убедительные доказательства того, что данные демонстрируют стационарные характеристики.

Разделение данных на обучающий и проверочный наборы

Теперь, когда мы успешно получили очищенный и структурированный набор обучающих данных, мы разделили его на обучающий и проверочный наборы. Этот шаг закладывает основу для последующего моделирования данных. В дальнейшем наше внимание будет сосредоточено на построении оценки модели, настройке параметров и, в конечном итоге, на прогнозировании набора тестовых данных.

Выбранный алгоритм — Случайный лесной регрессор по нескольким причинам. При анализе временных рядов регрессор случайного леса имеет преимущество благодаря своей способности обрабатывать сложные нелинейные отношения, устойчивости к выбросам и эффективному захвату взаимодействия функций. Его ансамблевая природа «борется» с переоснащением, а понимание важности функций используется для понимания динамики данных. Для точных и надежных прогнозов в сложных данных временных рядов регрессор случайного леса часто превосходит традиционные модели линейной регрессии.

Для большей ясности следующий фрагмент кода разбивает предстоящие задачи на отдельные этапы.

Model's results:

{'Training MAE': 14.39046043718243,
 'Valid MAE': 14.879747614036036,
 'Training RMSLE': 0.18859544180669333,
 'Valid RMSLE': 0.18262125548909805,
 'Training R^2': 0.9939454680376552,
 'Valid R^2': 0.9960633903777455}

Как мы видим из приведенных выше результатов модели, мы получаем обучающую RMSLE (среднеквадратическую логарифмическую ошибку) всего 0,18, что отлично для начала. Проще говоря, RMSLE измеряет соотношение прогнозируемого и фактического. Значение RSMLE 0,18 указывает на величину ошибки между прогнозируемыми значениями и фактическими значениями в вашем наборе данных. Чем ниже Среднеквадратическая логарифмическая ошибка, тем лучше прогнозы модели совпадают с фактическими данными. Следовательно, мы хотим попробовать гипернастройку, чтобы посмотреть, сможем ли мы еще снизить ее.

Параметры гипернастройки

Три наиболее распространенных подхода к настройке гиперпараметров: (1) вручную, (2) GridSearchCV и (3) RandomizedSearchCV. В нашей модели ML мы использовали RandomizedSearchCV. Мы можем просто просмотреть param_grid adjustments в документации Scikit-Learn.

Код ниже демонстрирует шаги, описанные выше:

Выход:

Best parameters:
{'n_estimators': 50,
 'min_samples_split': 4,
 'min_samples_leaf': 1,
 'max_samples': 10000,
 'max_features': 'auto',
 'max_depth': None}

Model scores:
{'Training MAE': 98.2941794720012,
 'Valid MAE': 145.11301961984705,
 'Training RMSLE': 0.9524408303957568,
 'Valid RMSLE': 1.3648513324998786,
 'Training R^2': 0.8640611814731654,
 'Valid R^2': 0.7790716598322265}

Как показано выше (Обучение RMSLE = 1,365), применение параметров настройки с помощью RandomizedSearchCV увеличило наш RMSLE с 0,18 до 1,36. Мы стремимся еще больше уменьшить его, применив best_parameters и оценив RMSLE модели.

Ideal model's scores:
{'Training MAE': 97.14264651620881,
 'Valid MAE': 152.1843386349387,
 'Training RMSLE': 0.9728631060999784,
 'Valid RMSLE': 1.3934895160779928,
 'Training R^2': 0.8695385092910064,
 'Valid R^2': 0.770700236975968}

Несмотря на применение best_parameters к новой модели под названием «идеальная_модель», RMSLE не улучшился. Поэтому мы решили продолжить использовать нашу первоначальную модель, которая достигла самого низкого RMSLE. Дальнейшие эксперименты с настройкой параметров или изучение альтернативных алгоритмов остаются вариантом анализа данных временных рядов.

Делаем прогнозы

После обучения нашей модели и принятия решения о ее использовании пришло время сделать прогнозы на тестовом наборе (невидимые данные). Наша модель обучена на данных до 2015 года. Однако тестовые данные относятся к периоду с 16 августа 2016 года по 31 августа 2016 года. Итак, мы пытаемся использовать шаблоны, которые наша модель изучила в обучающих данных, для прогнозирования цена продажи «Корпорации Фаворита» с характеристиками, которых она никогда раньше не встречала, но предполагается, что она аналогична характеристикам, указанным в данных обучения.

Результаты test_preds:

array([2.87, 0.76, 3.05, ..., 743.1437014,
       226.6923798, 14.69490199])

Последнее, что нам осталось сделать, — это преобразовать результаты test_preds в требования к отправке Kaggle в соответствии с правилами Kaggle. Для каждого id в тестовом наборе мы должны спрогнозировать значение переменной sales.

# Format predictions into the same format Kaggle is after
df_preds = pd.DataFrame()
df_preds["id"] = df_test["id"]
df_preds["sales"] = test_preds
df_preds

==============================

Output:

id      sales
3000888 2.87
3000889 0.76
3000890 3.05
3000891 666.43
3000892 0.71
...     ...
3029395 123.3779101
3029396 27.75675
3029397 743.1437014
3029398 226.6923798
3029399 14.69490199

Важность функции

После всего этого анализа нам должно быть интересно узнать, какие особенности повлияли на наши результаты. Именно здесь в игру вступает концепция важности функции. Его цель — выявить конкретные переменные в данных, которые сыграли решающую роль в прогнозировании целевого результата (продаж). В нашем контексте, как только наша модель впитала в себя закономерности данных, мы стремимся понять, какие характеристики продаж в магазине определяют прогноз продаж конечного продукта.

Тем не менее, вот фрагмент кода для определения и последующей визуализации наиболее важных функций:

Заключение

Анализ временных рядов можно считать одним из наиболее развитых, используемых и потенциально предпочтительных методов работы с данными. Причиной этого является присущая самому анализу осязаемость. Это оказывает прямое влияние на повседневную деятельность не только предприятий, но и различных областей, которые полагаются на искусственный интеллект для улучшения своих функциональных возможностей. Этот аналитический подход имеет важное практическое значение. Следовательно, анализ временных рядов по праву привлекает внимание и высокую оценку за его способность давать действенные идеи, которые резонируют с динамикой реального мира.

Спасибо за чтение!