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

  1. Введение и исследовательский анализ данных
  2. Разработка, моделирование и развертывание функций

Таблица содержания-

  1. Постановка задачи
  2. Цель / ограничение реального мира
  3. Источник данных и обзор
  4. Показатели эффективности
  5. Существующее решение
  6. Первый подход
  7. Исследовательский анализ данных
  8. использованная литература

Давайте начнем!

1. Постановка проблемы -

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

В этом тематическом исследовании основное внимание уделяется прогнозированию будущих значений для задачи с несколькими временными рядами. Каждый временной ряд содержит ежедневный трафик на странице Википедии в течение 803 дней с 01.07.2015 по 10.09.2017. У нас есть в общей сложности 145 тысяч временных рядов, что означает, что у нас есть данные для 145 тысяч страниц. Наша цель - проанализировать эти данные, построить на их основе модель и спрогнозировать будущий трафик на каждой странице на 62 дня с 2017–09–13 по 2017 год. –11–13 (ну, на самом деле это не будущее, но когда проводился этот конкурс, оно было!)

2. Цель / ограничение реального мира -

Минимизируйте разницу между фактическими и прогнозируемыми значениями.

Особых требований к задержке нет, но мы должны постараться, чтобы на предсказание конкретной даты не уходило несколько часов. Допустимо время до 20–30 секунд.

3. Обзор данных-

Поскольку это соревнование Kaggle, поэтому источником набора данных является сам Kaggle, нам даны три файла в total- train.csv, key.csv, sample_submission.csv.

Train.csv содержит около 145 тыс. Строк, каждая из которых представляет отдельную страницу Википедии, и имеет 804 столбца, за исключением первого столбца, каждый столбец представляет дату и имеет ежедневный трафик на этой конкретной странице Википедии. Первый столбец содержит название страницы, которая включает язык страницы Википедии (например, для английского en.wilipedia.org, для испанского es.wikipedia.org, zh, wikipedia.org для китайского) + тип доступа (рабочий стол , весь доступ) + агент (паук, реальный трафик). Например, одно имя - AKB48_zh.wikipedia.org_all-access_spider.

Второй файл - «key.csv», в котором количество строк равно количеству прогнозов, которые мы должны сделать. В этом файле есть два столбца - «имя страницы» и «идентификатор». Для каждого имени страницы, которое присутствует в файле «train.csv», у нас есть 62 строки в файле key.csv, эти 62 строки соответствуют 62 дням прогнозов для каждой страницы. Для каждого имени страницы есть соответствующий идентификатор.

Пример точки данных-

4. Показатели производительности-

Мы будем использовать SMAPE (симметричная средняя абсолютная ошибка в процентах) в качестве показателей производительности. Это часто используется при прогнозировании задач. Имеет диапазон [0,200]. Поскольку это не встроенные метрики в Python, мы будем реализовывать их с нуля и будем использовать специальные метрики для оценки наших моделей.

5. Существующие решения-

  1. Решение победителя -

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

Создается новая функция под названием «популярность страницы», это медиана значений временных рядов, эта функция поможет понять масштаб временных рядов. Например, один временной ряд может иметь значения от 5 до 20, а другой - от 50 до 100. В этом решении используется механизм внимания на основе RNN.

Эти два момента являются ключевыми выводами этого решения.

2. Решение на основе статистики -

В этом решении для прогнозов использовалась медиана разных размеров окна. Размер окна определяется рядами Фибоначчи, начиная с 6,12, затем 18,30,48,78 и так далее. Чтобы сделать прогнозы медианы за последние 6 дней, 12 дней, 18 дней, берется ……, а затем берется медиана всех этих значений. Если у нас недостаточно данных, берется медиана всех доступных данных. Это простое решение, но работает неплохо.

3. Решение на основе фильтров Калмана -

Это решение основано на фильтрации Калмана. Данные были сглажены двумя способами, данные, к которым имел доступ паук, были сглажены с использованием медианы медиан Фибоначчи, которая уже обсуждалась в вышеупомянутом решении. Теперь данные без пауков были сглажены с помощью сглаживания Калмана. Прогнозы были сделаны с использованием фильтров Калмана. Это то, на чем мы собираемся сосредоточиться. Когда я впервые прочитал это решение, я понятия не имел о фильтрах Калмана, поэтому я начал читать об этом и обнаружил, что это полный классический подход, который в основном используется в аэрокосмической сфере для определения местоположения, измерения скорости, измерения температуры двигателя. . Его основной метод аналогичен алгоритму градиентного спуска, как и градиентный спуск, он обновляет свой прогноз по итерациям и сходится после некоторых итераций. Мы также можем применить это к нашей проблеме. Подробное рассмотрение этого алгоритма потребует много времени, поэтому вот основная идея того, как этот алгоритм работает:

Xkp = AXk-1 + BUk + Wk Pkp = APk-1AT + Qk

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

W - матрица, которая содержит шум в прогнозируемом выходе.

Q- Ковариационная матрица шума, создаваемого процессом.

A- матрица перехода, B- матрица входных эффектов

Для обновления после каждой итерации используется коэффициент Калмана.

Коэффициент Калмана (K) = Ошибка в расчетном значении / (ошибка в расчетном значении + ошибка в измеренном значении), 0 ‹= K‹ = 1

ESTt = ESTt-1 + K [Измерение - ESTt-1]

Если K высокий, то ESTerror ›MEASerror уравнение даст больший вес разнице между измеренным и оценочным значением и наоборот.

Все вышеперечисленные матрицы также рассчитываются в зависимости от задачи.

6. Первый подход -

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

Функциональная инженерия

У нас есть данные по обучению за 26 месяцев, и мы должны спрогнозировать следующие 62 дня. Сгенерируем фичи за последние 15 дней. Будут созданы элементы скользящего окна. Другие методы разработки функций, которые будут опробованы, следующие:

(i) Медиана за последние 5 дней

(ii) Медиана последних 5 дней недели, эта функция поможет нам зафиксировать недельный тренд.

(iii) Медиана (t-4 месяца, t-8 месяцев, t-12 месяцев, t-16 месяцев), где каждое из этих значений само по себе является медианной величиной 2 дней до и после значений. Эта функция поможет нам зафиксировать квартальный тренд.

(iv) Чтобы уловить годовой тренд, мы возьмем медианное значение для Т-363, Т-364, Т-365, Т-366, Т-367.

(v) Взятие медианы размера окна ряда Фибоначчи может быть хорошим для нашей модели, это также будет проверено.

(vi) Также будет использоваться преобразование Фурье.

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

7. Исследовательский анализ данных-

Сначала заполним все недостающие значения (если есть). Итак, давайте проверим, нет ли в данных какого-либо пропущенного значения.

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

Чтобы заполнить недостающие значения для данных для первой ситуации, мы будем использовать линейную интерполяцию, для ситуации два пропущенных значения мы заполним их 0

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

Эти двухбуквенные слова соответствуют разным языкам:

de-German, en-English, es-Spanish, fr-French, ja-Japanese, ru-Russia, zh-Chinese, nt относится к страницам СМИ (Викимедиа)

Теперь посмотрим, что мы получим

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

Заключение. Существует разница в трафике в зависимости от языка данных.

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

Сюжеты для испанского языка-

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

Заключение-Данные имеют еженедельную сезонность

Этот график показывает высокое значение корреляции для 7-дневного лага, поэтому в данных есть недельный тренд.

Заключение. Мы можем сделать вывод, что использование лага в 7 дней в нашей модели AR может дать хорошие результаты для испанского языка.

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

Заключение. Эти пики означают, что в испанских данных есть квартальная сезонность.

Сюжет для английской Википедии -

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

Это также показывает высокое значение корреляции для лага в 7 дней. После этого значение автокорреляции для 7,14,21,28… .. дней всегда выше, чем корреляция для других дней, что показывает сильный недельный тренд.

Заключение. Высокая недельная сезонность.

У этого также есть пики примерно в то же время, что и у предыдущего. Также можно увидеть регулярные небольшие пики.

Заключение. Как и в испанском языке, здесь также есть квартальная сезонность.

Сюжет для русской Википедии -

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

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

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

Это имеет пик в 120 дней, но не наблюдается большого пика в 230 дней.

Заключение. Русская Википедия не показывает большой сезонности.

Сюжет для страниц СМИ-

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

У этого также лучшая корреляция для лага в 1 или 2 дня, но обратите внимание, что лаг в 7 дней выше по сравнению с лагом в 5,6 или 8,9 дней.

Заключение. Он также показывает некоторую еженедельную сезонность, но не так сильно, как другие.

В данных есть регулярные пики, но нет больших пиков, как на предыдущих графиках.

Заключение - мы видим, что на страницах СМИ нет сезонности.

Сюжет для японской Википедии -

Японская Википедия показывает несколько больших всплесков в январе 2016 года, и мы видим, что трафик сильно упал в течение сентября 2015 года, а также наблюдается тенденция к снижению данных после февраля 2017 года.

Подобно некоторым другим языковым графикам, он также имеет хорошую корреляцию с лагом в 7 дней.

Заключение. Данные имеют еженедельную сезонность.

Это очень похоже на графики, которые мы видели изначально, пики на 120 и 230 днях.

Заключение. Данные имеют сезонность за 120 дней.

Сюжет для немецкой Википедии -

Немецкая Википедия имеет наибольшее количество всплесков среди всех языков. Мы можем видеть, что это делает структуру "М" в форме, которая идет вверх, затем вниз, снова вверх, затем снова вниз.

Этот также следует той же тенденции - более высокая корреляция с лагом в 7 дней.

Заключение. Как и многие другие графики, он также имеет еженедельную сезонность.

Как и ожидалось, есть пики на 120 и 230, но, что удивительно, около 340 дней есть пик.

Заключение. Как и предыдущие графики, здесь также показана 120-дневная сезонность.

Сюжеты для китайской Википедии -

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

Этот сюжет ничем не отличается от других, высокое значение при лаге в 7 дней.

Заключение. В этих данных также присутствует недельная сезонность.

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

Вывод: сезонность также составляет 120 и 230 дней.

Сюжеты для французской Википедии-

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

Как и ожидалось, высокая корреляция за 7 дней.

Заключение. Данные имеют еженедельную сезонность.

Это также очень похоже на предыдущий график, пики на 120 230 и 340 дней.

Заключение. Здесь также показана сезонность для 120 и 230 дней.

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

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

Преобразование Фурье также дало некоторые полезные идеи: пики большинства языков приходились на 120 и 230 дней, а у некоторых также были максимумы на 340 дней. Таким образом, эти 3 пика можно позже использовать во время моделирования.

Поскольку мы уже обсуждали, что у нас также есть тип доступа для каждой страницы, теперь мы будем объединять трафик разных страниц в зависимости от их типа доступа (паук / не-паук).

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

Заключение. Это означает, что масштабы данных о пауках и не пауках сильно различаются.

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

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

Теперь давайте объединим трафик по страницам в зависимости от клиента, который использовался для доступа к этой странице.

Теперь посмотрим на сюжет.

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

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

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

В каком месяце в среднем больше посещений?

С этого момента на каждый вопрос, на который мы попытаемся ответить, их среднее значение будет основываться на Медиане, а не на среднем значении.

Таким образом, индекс 1 относится к февралю, который показывает, что в среднем февраль имеет наибольшее количество посещений. По сравнению с октябрем, который имеет наименьшее количество посетителей в среднем, февраль показывает значительный рост на 25%.

В какой день недели в среднем больше посещений?

Мы видим, что в среднем в воскресенье больше всего посетителей, но все они довольно близки и не имеют большой разницы.

Влияет ли праздничный сезон на количество посетителей в среднем?

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

Мы видим, что здесь есть некоторая разница. На самом деле среднее количество посетителей во время курортного сезона сократилось на 7,3%.

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

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

8. ссылки-

  1. Https://www.kaggle.com/c/web-traffic-time-series-forecasting/discussion/43795

2. https://www.kaggle.com/c/web-traffic-time-series- прогнозирование / обсуждение / 43727

3. https://cs.adelaide.edu.au/~zbyszek/Papers/p51.pdf

4. https://blog.octo.com/en/time-series-features-extraction-using-fourier-and-wavelet-transforms-on-ecg-data/

5. https://www.youtube.com/watch?v=mrExsjcvF4o&t=830s

6. https://www.appliedaicourse.com/course/11/Applied-Machine-learning-course

Если у вас есть какие-либо вопросы, не стесняйтесь комментировать, или вы также можете связаться со мной в Linkedin. Вы можете найти мой полный проект здесь.