TL; DR: если вам нравится быстро выполнять итерацию, вы можете создавать простые модели машинного обучения прямо из BigQuery SQL. Здесь я использовал BigQuery ML для построения модели линейной регрессии для прогнозирования стоимости проезда в такси за 30 минут при обучении на всех 55 млн строках данных.

Пару недель назад я получил электронное письмо от Kaggle (веб-сайт соревнований по машинному обучению) об образовательном конкурсе NYC Taxi Fare Prediction. Ваша цель - предсказать стоимость поездки на такси в Нью-Йорке. На следующий день Google анонсировал BigQuery ML, который позволяет обучать модели линейной / логистической регрессии прямо из SQL.

Краткое заявление об отказе от ответственности. Раньше я никогда широко не использовал BigQuery + я в основном увлекаюсь машинным обучением. Поэтому применение базового машинного обучения и опробование новых технологий при решении реальной проблемы звучит для меня как хорошая тренировочная площадка.

Данные

Набор данных о соревнованиях размещен на публичном BigQuery. Если у вас есть учетная запись в Google Cloud Platform (GCP), вы можете просто скопировать таблицы из общедоступного пользовательского интерфейса в свой проект GCP.

Как выглядят данные?

Набор данных для соревнований по тарифам на такси составляет ~ 6 ГБ CSV-файла. В каждой строке есть:

  • широта / долгота пункта отправления
  • широта / долгота места высадки
  • отметка времени получения
  • кол-во пассажиров
  • цена поездки

Всего 55000000 поездок по Нью-Йорку.

Хорошо начинать с визуализации данных и исследовательского анализа данных. Поэтому я извлек 16 тысяч случайных поездок на такси и нанес их на карту. Каждая дуга - это одно путешествие. Как видите, вокруг Манхэттена и трех аэропортов Нью-Йорка большой трафик: Джон Ф. Кеннеди (JFK), Ньюарк (EWR) и Ла-Гуардия (LGA).

Яркость цвета дуги показывает стоимость проезда. 75% поездок до 24 долларов. Красные - выше 24 долларов.

Данные чистые?

Я попытался найти выбросы во всем наборе обучающих данных (55 миллионов строк!). Каждый запрос занял менее 5 секунд.

Оказывается, почти все функции имеют некоторые отклонения. На Земле нет такой широты, как -3492,26. А поездку, которая стоила бы 93 963,36 доллара, я даже представить себе не могу. Если 20-минутная поездка на вертолете в Нью-Йорк стоит ~ 200 долларов, то вы можете летать без остановок в течение недели за эту сумму.

Посмотрев на Карты Google и квантили (с функцией APPROX_QUANTILES), я решил включить расплывчатые границы Нью-Йорка: широты в диапазоне [40, 42], долготы в [-75, -72], суммы проезда в [0, 500].

Как рассчитать расстояние поездки?

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

В реальной жизни вы бы потратили гораздо больше времени на разработку функций.

Почему вы не нормализовали свои данные?

Потому что здесь в этом нет необходимости. BigQuery по умолчанию заботится почти обо всех функциях:

  • one-hot кодирует категориальные признаки;
  • стандартизирует числа.

Он не может обрабатывать временные метки по умолчанию, поэтому, если вам это нужно, вам придется самостоятельно кодировать отдельные части (как в фрагменте кода ниже).

Модель

Как создать модель?

Давайте определимся с нашей моделью и приступим к обучению. Вот что вам нужно:

  • тип модели (линейная или логистическая), название модели
  • некоторые гиперпараметры (количество итераций, скорость обучения, L1 и т. д.)
  • данные для обучения и подписать столбец

Нажмите кнопку Run Query, и BigQuery начнет обучение вашей модели. На полное обучение ушло ~ 20 минут.

Ба-дум-тсс… Ваша первая модель обучена 🎉

Как вы проверяете свою модель?

Есть 3 функции для исследования модели:

  • ML.TRAINING_INFO - показывает длительность итераций обучения, скорость обучения, потери.
  • ML.FEATURE_INFO - статистика по каждой функции: количество категорий, минимальное / среднее / максимальное / стандартное отклонение, нулевое количество.
  • ML.WEIGHTS - веса каждой характеристики или категории.

Если вы хотите оценить эффективность своей модели, вы можете использовать ML.EVALUATE. Выход будет зависеть от вашей модели. Для логистической регрессии он показывает точность / отзыв, точность, F1, logloss, ROC-AUC. Для моделей линейной регрессии вы увидите различные значения ошибок (среднее абсолютное, среднеквадратичное и т. Д.). Вы также можете использовать ML.ROC_CURVE для более глубокого исследования логистической регрессии.

Давайте предскажем некоторые тарифы на такси 🚕!

Представим, что 4 друга едут из Метрополитен-музея на Таймс-сквер в воскресенье днем ​​на такси. 8 минут, 2 мили.

Согласно RideGuru, в августе 2018 года это будет стоить ~ 11 долларов в Lyft или Uber и 15 долларов в 🚕. В августе 2015 года наша модель оценила поездку в 11,59 долларов. Модель ошибочна на ~ 3,50 доллара по сравнению с обычным такси в данном случае.

Давайте предскажем и представим Kaggle

Мне потребовалось 3 шага, чтобы получить результаты и отправить их в Kaggle.

  1. Скорректировал мой SQL-запрос, чтобы он возвращал соответствующие заголовки, и вызвал ML.PREDICT в таблице test. Запрос занял ‹1 секунду для 9k строк.
  2. Нажал Save AS > Download as CSV в интерфейсе BigQuery.
  3. Перетащите CSV-файл в пользовательский интерфейс Kaggle.

Вот и все. Модель набрала 5.59009. Это означает, что в среднем модель ошибалась на 5–6 долларов при оценке поездки. Еще предстоит пройти долгий путь, но он может стать хорошей отправной точкой. В конце концов, это простая линейная регрессия.

Последние мысли

С BigQuery ML даже люди, которые знают только SQL, могут быстро построить простые объяснимые модели. Если у вас есть хранилище данных, которое уже есть в BigQuery, больше не будет оправдания «машинное обучение - это так сложно»!

Найдите гипотезу, подготовьте данные, выполните простой запрос. Учитесь и повторяйте!

Последний вопрос: Google Cloud, когда вы добавите XGBoost 😄?

Примечания и благодарности:

  1. Хочу сказать спасибо всем лекторам, участникам и организаторам Lviv Data Science Summer School # lvds2018. Многому научился в школе и познакомился с замечательными людьми!
  2. Мы с друзьями организовываем необычную техническую конференцию GDG DevFest Ukraine - более 1000 разработчиков, 40+ спикеров со всего мира, мобильные / веб / облачные стримы + воркшопы. Если вы занимаетесь облачными технологиями или аналитикой, у нас есть много сеансов BigQuery, K8S и других. Проверьте это 🎉

Спасибо, что дочитали до этого места! Пожалуйста, 👏, если вам это понравилось, и напишите мне в твиттер (@ p1f), если у вас есть вопросы.