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

Недавно у меня была возможность поиграть с общедоступным набором данных о такси Нью-Йорка, размещенным на платформе Big Query в облаке Google. Я решил применить методы машинного обучения к набору данных, чтобы попытаться построить некоторые прогностические модели с использованием Python. В этом посте я попытаюсь предсказать стоимость проезда на такси. Давайте прямо в это дело! Весь код для этой статьи можно найти на Github по ссылке Ссылка.

Во-первых, при просмотре таблиц Google Big Query мы замечаем, что существует одна таблица в год. Это дает мне представление. Я мог бы использовать данные за 2015 год для обучения своих моделей машинного обучения, а затем использовать данные за 2016 год для проверки предсказательной силы модели.

Затем давайте запросим 100 000 случайных строк из данных за 2015 год и случайные 100 000 строк из данных за 2016 год, используя платформу лаборатории данных Google.

Теперь давайте начнем прогнозировать стоимость проезда в такси. Во-первых, давайте импортируем необходимые пакеты и загрузим данные во фрейм данных pandas. Я использую встроенный% matplotlib, поскольку для анализа использую блокнот jupyter.

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

Интуиция:

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

Для любой модели прогнозирования нам необходимо рассмотреть, какую переменную отклика мы пытаемся предсказать, и какие переменные характеристик могут повлиять на указанный отклик. В этом упражнении ответом, который мы хотим предсказать, будет fare_amount. Чисто интуитивно мы знаем, что такси обычно взимают фиксированную начальную плату + за км (общее расстояние) + за минуту (общая продолжительность). Оглядываясь назад на наши столбцы фрейма данных, у нас уже есть столбец trip_distance, но нам не хватает столбца trip_duration. Однако нам предоставлены даты получения и возврата, поэтому мы можем легко рассчитать trip_duration, используя эти столбцы, как показано ниже.

Теперь давайте визуализируем интересующие нас столбцы для нашей простой интуитивно понятной модели (fare_amount, trip_distance, и trip_duration).

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

Намного лучше! Кроме того, мы ясно видим, что существует сильная корреляция между fare_amount как с trip_distance, так и с trip_duration, и поэтому мы на правильном пути. .

Прежде чем мы продолжим, давайте создадим несколько вспомогательных функций. Первая функция - разделить данные так, чтобы в наборе обучающих данных были данные только за 2015 год, а в тестовом наборе данных - только за 2016 год, как упоминалось ранее. Вторая функция - вычислить некоторую статистику, которую можно использовать для оценки предсказательной силы наших моделей. В этом упражнении я выбираю статистику, которая является среднеквадратической ошибкой (RMSE), которая дает стандартное отклонение разницы между фактическим fare_amount и прогнозируемым fare_amount в долларах и может быть вычислена. как квадратный корень из функции sklearn mean_squared_error (). R-квадрат показывает, какой процент фактического отклонения fare_amount предсказывается моделью и может быть непосредственно получен из r2_score () sklearn.

Большой! Теперь мы готовы построить нашу первую модель исключительно на основе интуиции. Давайте сначала разделим данные на ответ (y) и функции (X), затем создадим наборы для обучения и тестирования, используя указанную выше вспомогательную функцию, затем подгоним простую модель линейной регрессии к набору обучающих данных и, наконец, проверим результаты модели с помощью над вспомогательной функцией.

----Training Data results (2015 data set)----
RMSE: $5.6
R2: 0.79

----Test Data results (2016 data set)----
RMSE: $5.5
R2: 0.81

Неплохо для нашей первой попытки! Набор данных тестирования имеет среднеквадратичную ошибку в размере 5,5 долларов США, и мы будем использовать ее в качестве базовой оценки. А теперь давайте попробуем улучшить этот результат.

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

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

  • День недели и час посадки могут сыграть важную роль в спросе и условиях движения, что повлияет на стоимость проезда.
  • Разница в широте и долготе может быть дополнительными данными, чтобы увеличить влияние trip_distance на стоимость проезда.
  • Районы посадки и высадки могут повлиять на стоимость проезда из-за дополнительных сборов в определенных местах?

Итак, давайте добавим несколько дополнительных функций, как показано ниже. Геохеширование - это метод создания дискретных географических местоположений на основе абсолютной широты и долготы. Вы можете думать об этом как о создании общего названия для местоположений, принадлежащих к одному и тому же району. Я использую пакет pygeohash python, который можно установить с помощью pip install pygeohash. Поскольку в столбцах широты и долготы много пропущенных данных, давайте их тоже удалим. Добавлены новые функции:

  1. Месяц самовывоза
  2. День самовывоза недели
  3. Время приема в день
  4. Разница в широте
  5. Разница долготы
  6. Место получения с геохешированием
  7. Место высадки с геохашедом

Похоже, есть некоторые выбросы в lat_dif и lon_dif, поэтому давайте удалим их. Кроме того, поскольку такие столбцы, как month, day_of_week, hour_of_day, pickup_geohash и dropoff_geohash, являются категориальными, давайте закодируем их с помощью метода pandas get_dummies.

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

----Training Data results (2015 data set)----
RMSE: $3.5
R2: 0.92

----Test Data results (2016 data set)----
RMSE: $7139352.0
R2: -338832003532.88

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

----Training Data results (2015 data set)----
RMSE: $5.6
R2: 0.79

----Test Data results (2016 data set)----
RMSE: $5.3
R2: 0.82

Хорошо, это лучше с точки зрения переоснащения, но RMSE модели не сильно улучшилась. Давайте теперь попробуем настроить гиперпараметры, чтобы улучшить RMSE модели. Параметр, который мы можем настроить для регрессии лассо, называется альфа, который является константой, умножающей штрафной член L1. Значение альфа по умолчанию - 1. Меньшая альфа сделает регрессию Лассо похожей на линейную регрессию за счет уменьшения штрафного члена.

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

Сначала запустим метод GridSearchCV:

GridSearchCV execution time: 3124.58699989
Lasso best params: {'alpha': 0.0004012807031942776}

----Training Data results (2015 data set)----
RMSE: $3.7
R2: 0.91

----Test Data results (2016 data set)----
RMSE: $3.8
R2: 0.90

Ух ты! с альфа, равным 0,0004, мы смогли получить тестовую RMSE всего в 3,8 доллара! Однако для запуска метода GridSearchCV потребовалось колоссальные 3124 секунды. Это почти час! Давайте посмотрим, сможет ли LassoCV работать быстрее, но даст ли нам сопоставимые результаты. Обратите внимание, что мы будем использовать то же пространство альфа-поиска для LassoCV, чтобы сделать это сравнение лицом к лицу.

LassoCV execution time: 42.0979998112
LassoCV best params: 0.000401280703194

----Training Data results (2015 data set)----
RMSE: $3.7
R2: 0.91

----Test Data results (2016 data set)----
RMSE: $3.8
R2: 0.90

Фантастика! LassoCV не только дает нам ту же самую лучшую альфа 0,0004 для получения тестовой RMSE всего за 3,8 доллара, но также работает намного быстрее и может завершиться всего за 42 секунды! Должен признаться, я сам удивлен результатами, и мне придется копнуть глубже, чтобы понять, почему LassoCV работает намного быстрее, чем GridSearchCV. На данный момент похоже, что лучший результат теста RMSE, который мы можем получить с помощью линейной модели, составляет 3,8 доллара. Это на 1,7 доллара меньше, чем RMSE нашей простой интуитивно понятной модели! Наконец, давайте построим график фактической платы за проезд против прогнозируемой платы за проезд из модели LassoCV, чтобы визуально проверить корреляцию.

Большой! это выглядит многообещающе.

Мы могли бы попытаться улучшить RMSE модели, попробовав более сложную модель, такую ​​как Gradient Boosting, или даже нейронную сеть. Мы также могли бы добавить больше данных в обучающий набор, запросив 1 миллион строк вместо 100 тысяч строк. Что вы думаете? Пожалуйста, оставьте комментарий о том, как мы можем улучшить модель дальше.

Спасибо за чтение! Надеюсь, вам было интересно. Ваше здоровье!