Демонстрационный анализ прогнозирования спроса на велопрокат

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

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

Подробнее о датасете и конкурсе можно узнать на KAGGLE

Что касается этого блога, весь исследовательский анализ данных выполняется с использованием Python. В Python есть несколько отличных библиотек для науки о данных, таких как pandas, numpy, seaborn и sklearn, которые мы будем использовать в этом блоге. Перейдите по следующей ссылке Github для полной записной книжки Ipython.

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

  • Размеры данных
  • Обзор данных
  • Особенности, которые вносят вклад в данные.
  1. Изучение данных TRIP

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

Поскольку большинство поездок осуществляется между станциями, процент поездок между станциями составляет 96,421%. При использовании метода кластеризации K-средних процент поездок между кластерами станций составляет 0,011%.

Пять почтовых индексов соответствуют: 94107: Сан-Франциско; 94063: Редвуд-Сити; 94301: Пало-Альто; 94041: Маунтин-Вью; 95113: Сан-Хосе. Погодные условия влияют на решение людей кататься на велосипеде или нет, поэтому это очень важно. Пять областей, определенных в данных о погоде, соответствуют группам станций, когда станции сгруппированы в пять групп. Имеет смысл сгруппировать станции по пяти группам вместо трех, чтобы лучше использовать данные о погоде и облегчить технику машинного обучения.

Давайте сгруппируем данные станции по идентификатору группы, а затем отсортируем усредненные значения долготы в порядке возрастания, что предполагает направление с севера на юг.

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

Inter-Group Trips made by customer and subscriber shows below,
Customer      532
Subscriber    510

Проанализировав данные о поездках, мы обнаружили, что у нас 56 6746 подписчиков и 10 3213 клиентов. Теперь давайте углубимся в наш анализ на основе почасового количества поездок для разных типов подписки. Для этого мы выберем дату, а затем проверим, будет ли день рабочим днем ​​применяться к уникальным дням, а затем сопоставлен со всеми строками в данных о поездке. Из записей 733 найдено 503 рабочих дня.

Теперь мы увидим поведение пользователей в рабочие и выходные дни.

На самом деле рейсов в день не так уж и много. Преимущественное использование от абонентов в рабочие дни, т.е. для работы. Для работы есть два основных пика, один в 8 утра и другой в 5 вечера. Точка деления будет установлена ​​на (8 + 17)/2 = 12,5. Подписчики, как правило, используют велосипед для поездок на работу, в то время как неподписчики обычно используют его для обедов и т. д. Интересно, что поведение неподписчиков в выходные и праздничные дни представляет собой почти идеальную гауссовскую форму с пиком между 1–2. вечера.

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

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

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

There are 18167 trips in Mountain View, lasting 29.9 minutes in average.
There are 3433 trips in Redwood City, lasting 40.7 minutes in average.
There are 603708 trips in San Francisco, lasting 17.1 minutes in average.
There are 6773 trips in Palo Alto, lasting 71.3 minutes in average.
There are 37878 trips in San Jose, lasting 23.0 minutes in average.

Средняя продолжительность поездки для абонента составляет 9,8 минут. Средняя продолжительность поездки для неподписчика составляет 65,9 минут. У неподписчика обычно поездка намного дольше, чем у подписчика. Это разумно, так как большинство подписчиков, вероятно, используют велосипеды для поездок на работу, а не подписчики используют их для отдыха.

Исследование использования велосипедов

Мы также увидим количество доков в каждом регионе. В Маунтин-Вью 117 доков. В Редвуд-Сити 115 доков. В Сан-Франциско 665 доков. В Пало-Альто 75 доков. В Сан-Хосе 264 дока. 89,10% подписчиков — местные жители, а 29,28% неподписчиков — местные жители. Как и ожидалось. Большинство подписчиков — местные жители, а большинство неподписчиков — туристы.

Давайте также посмотрим, можно ли найти какие-либо выбросы из приведенного выше графика. Это даты, которые мы нашли: 2013–11–11, 2013–10–14, 2014–11–11, 2014–10–13. Также заметно, что в декабре количество деловых поездок значительно меньше. Декабрь считается курортным сезоном в США. Это означает, что месяц может быть важной характеристикой.

2.Исследование данных STATUS

Как видно из приведенных выше таблиц, только две станции имеют общее количество доков больше, чем изначально рассчитанное количество доков. Около 10000 записей в данных о состоянии имеют 27 док-станций, что довольно подозрительно. Ниже мы подробнее рассмотрим, действительно ли меняется общее количество доков или просто происходит сбой системы.

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

Общее количество событий изменения количества док-станций составляет 0,57% от общего числа изменений состояния.

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

На 73,7% больше поездок с увеличением количества велосипедов в данных о статусе. На 73,7% больше поездок с уменьшением количества велосипедов в данных о статусе. Давайте также узнаем, основываясь на каждый час.

Давайте посмотрим, в какое время станции опустеют по отношению к каждому городу,

Давайте посмотрим, в какое время станции будут заполнены по отношению к каждому городу,

3. Изучение данных WEATHER

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

Оказывается, что:

'mean_temperature_f' может хорошо представлять 'max_temperature_f', 'min_temperature_f', 'max_dew_point_f' и 'mean_dew_point_f', но не 'min_dew_point_f';
'mean_humidity' может хорошо представлять 'max_humidity' и 'min_humidity';
«mean_sea_level_pressure_inches» вполне может представлять «max_sea_level_pressure_inches» и «min_sea_level_pressure_inches».

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

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

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

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

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

Мы добавляем общее количество доков за каждый день. Общее количество подсчетов является важным параметром для прогнозирования подсчета поездок.

Мы генерируем пять наборов данных в виде словаря с почтовым индексом в качестве ключа.
Затем преобразуем дату установки в объект datetime. Наконец, мы объединяем данные о поездке и погоде на основе даты и региона. Слияние имеет смысл: общее количество строк совпадает с данными о поездке. Кроме того, количество столбцов равно сумме данных о поездке и погоде минус один (одинаковое имя столбца для даты, разные имена столбцов для региона).

Прогнозировать количество ежедневных поездок для каждой станции

Я не обращал внимания на количество ежедневных поездок по каждому региону. Этот результат поразителен! За исключением Сан-Франциско, в других регионах так мало поездок в день. Количество поездок в Сан-Франциско намного выше, чем в доках, в то время как в других городах не все велосипеды используются ежедневно! Прогноз с помощью регрессора работает даже хуже, чем случайное предположение (медиана столбца меток в обучающем наборе) для тех станций с очень маленькими средними ежедневными поездками, то есть в Редвуд-Сити и Пало-Альто. Регрессор работает намного лучше, чем эталон для трех других городов.
Теперь мы нормализуем столбцы числовых характеристик, а затем выберем правильные модели, исследуя все регрессоры.

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

Разделение на разные часы. Чтобы предсказать количество поездок в конкретный день, данные о поездках необходимо усреднить по определенным временным отрезкам. Из разведки я решил разделить данные на точку полудня, т.е. одно деление с 0 до 12 часов, а другое с 13 до 23 часов. Агрегирование данных в определенные временные интервалы сделает определенные столбцы функций неактуальными, если только каждый элемент функции не будет исследоваться индивидуально (например, исследовать только поведение подписчика или только поведение не подписчика).

Давайте построим график важности функции из моделей ежедневных, утренних и вечерних поездок.

Важность имеет почти одинаковое распределение среди функций для трех периодов времени (ежедневно, утром, после полудня). Удивительно, но степень ветра и давление являются двумя наиболее важными характеристиками для регрессора с усилением градиента. Это странно. Ниже я рассмотрю две функции.

Картинка по этой ссылке: 240–320 градусов соответствуют ЗЮЗ, З, ЗСЗ, СЗ. Поэтому большую часть времени ветер дует с северо-запада.

Точно так же, как и степень ветра, давление на уровне моря также концентрируется в небольшом диапазоне. Регрессор повышения градиента, по сути, представляет собой метод дерева решений. Таким образом, его важность можно объяснить тем, что для дерева решений.
Важность функции. Чем выше, тем важнее функция. Важность признака вычисляется как (нормализованное) общее снижение критерия, привносимого этим признаком. Он также известен как значение Джини R255.

Степень ветра и давление на уровне моря были объяснены выше. Эти две особенности имеют очень концентрированное распространение на небольшом расстоянии.

Рабочий день занимает третье место и является первой характеристикой, не связанной с погодой. Вторым непогодным признаком является день недели, занимающий 9 место. Влажность, температура и скорость ветра, несомненно, важны. Удивительно, но свойства облачности, осадков, дождя, тумана не столь важны, что противоречит здравому смыслу. Я могу только объяснить это тем, что эта информация о погоде может не относиться и иметь очень ограниченное влияние на весь день. Например, рано утром или ночью, когда поездки на велосипеде редки, может быть туман или дождь.
На самом деле приведенная выше интерпретация может быть неверной, просто потому, что узел находится ниже в дереве, не обязательно означает, что он менее важен. Важность функции в научном обучении рассчитывается по тому, насколько чисто узел разделяет классы (индекс Джини).

Мы проверим производительность данных, взяв 80% обучающих данных. Мы применяем поиск по сетке на Gradient boost Regressor.
Теперь мы посмотрим, как выглядит дерево решений,

Одно дерево решений из 50 оценок в bestRegressor_time (регрессор с усилением градиента) отображается выше с тремя уровнями глубины, чтобы показать наиболее важные функции. Чем выше ценность информации, тем темнее цвет. Обратите внимание, что важность функции регрессора ранжируется на основе голосов всех 50 деревьев решений. Не каждое дерево обязательно подчиняется порядку важности.

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

Мы применим логарифм к функции продолжительности. Затем масштабируйте все функции в диапазоне (0, 1). Затем мы отобразим график коробки и усов для масштабированных данных. Теперь данные выглядят более разумно.

Сгенерируем набор для обучения и тестирования. Затем мы разделим данные «features_cls» и «subType» на наборы для обучения и тестирования. Установите f0.5 в качестве счетчика, уделив больше внимания точности, чтобы предсказать отсутствие подписки. Цель этого исследования — выяснить особый шаблон для неподписчиков.
мы определяем набор перекрестной проверки с меньшим числом разбиений, чем для классификатора, поскольку даже данные с пониженной выборкой по-прежнему на один порядок больше, чем регрессия. data. Это также будет использоваться для обучения полному набору данных. StratifiedKFold используется вместо обычного KFold, чтобы сохранить процент выборок для каждого класса. Это важно для несбалансированных наборов данных. Затем определите функцию для понижения дискретизации данных путем удаления соседних похожих выборок. Вычисляется квадрат суммы поэлементной разницы между соседними выборками. Будут сохранены только те данные, сумма квадратов которых превышает пороговое значение. Повторяйте процесс до тех пор, пока размер данных не изменится более чем на min_diff по сравнению с предыдущим запуском.

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

Установите допустимое отклонение от каждой функции на 0,03. Это говорит о том, что два значения в столбце будут считаться оказывающими одинаковое влияние на предсказание метки, если разница значений составляет менее 3% от общего диапазона. Этот метод не идеален: если изменяется только один признак, а остальные остаются прежними, отклонение этого конкретного признака может достигать 0,51, прежде чем он будет считаться другим. Скорее всего, влияние длительности будет ослаблено, так как она изменяется в наименьшем временном масштабе (минута). Чем больше шкала времени, тем реже функция будет менять значение. Обратите внимание, что учитываются только столбцы с числовыми значениями. Отклонение от функций только со значениями 0 и 1 слишком велико, чтобы его можно было даже учитывать. Это означает, что все различные комбинации этих функций будут сохранены.

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

Будут выбраны три классификатора. Я буду следовать этим стратегиям:

  1. Во-первых, будут выбраны классификаторы, работающие лучше среднего.
    2) Нормализуйте показатель F0,5 в группе хороших классификаторов.
    3) Создайте формулу, чтобы сбалансировать производительность и затраты времени.< br /> 4) Уделите больше внимания производительности. Убедитесь, что два из трех лучших классификаторов также входят в тройку лучших по новому критерию.

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

Прогноз на тестовом наборе

Конец примечаний

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