Около восьми недель назад я сел на борт поезда программы Data Science Intensive (DSI). Я был полон надежд, наивен и стремился узнать больше о темных искусствах машинного обучения. До этого момента я просто опускал большой палец ноги в океан науки о данных. Я и не подозревал, что меня вот-вот бросят вниз головой в пучину этих мутных вод.

За последние два месяца мы прошли путь от нескольких разминочных кругов в воде с заданием Kaggle House Prediction Prediction до погружения головы под воду до тех пор, пока наши легкие не начали гореть, с не очень мягким введением в глубокие погружения. обучение и сверточные нейронные сети (CNN) с помощью задачи обнаружения и локализации пневмонии RSNA на Kaggle. Затем нам вручили водолазное снаряжение и велели исследовать более глубокие слои океана, где, по слухам, находятся проблемы с обработкой естественного языка (NLP) и где откладывала свои яйца задача классификатора токсичных комментариев.

После всего этого нас вернули на землю и дали возможность выбрать наш следующий инструмент обучения (и, возможно, агонии). Будучи начинающим специалистом по данным из Маврикия/Южной Африки, меня привлекла Zindi — первая африканская платформа для решения задач машинного обучения.

Что такое Zindi Bus Challenge?

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

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

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

Как обычно для задач регрессии, метрика, выбранная Zindi для оценки производительности моделей, представляет собой среднеквадратичную ошибку (MSE):

Изучение данных

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

  • Данные не содержат целевой переменной (то, что мы пытаемся предсказать). Однако взмах палочки «группировать/трансформировать» сразу решает проблему.
  • Два города в тренировочных данных отсутствуют в тестовых данных. Они были немедленно удалены из моих тренировочных данных.
  • Переменные типа автомобиля и максимальной вместимости на самом деле предоставляют одну и ту же информацию — в автобусе 49 мест, а в маршрутке — 11. Поэтому я удалил одну из них.
  • Данные обучения охватывают только 7 месяцев в году. Данных за май-сентябрь нет. В тестовых данных, к сожалению, присутствует месяц май.
  • Как и следовало ожидать, на автобусы было продано больше билетов, чем на шаттлы.

Делаем данные удобоваримыми для алгоритмов машинного обучения

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

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

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

Наша окончательная модель

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

Обнаружив ошибку регрессии, я попробовал несколько типов регрессии и даже объединил их. Ни один из этих подходов не работал хорошо.

Отчаявшись в возможностях линейной регрессии, я решил попробовать методы бустинга. Используя их, я достиг среднеквадратичной ошибки xx, что поставило меня на 6-е место из 46 команд в таблице лидеров Zindi!

Поэтому я не стремлюсь вдаваться в подробности относительно моего подхода. Я приношу свои неискренние извинения.

Как только конкурс завершится, я намерен полностью раскрыть информацию. До тех пор, adiós mis amigos!