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.
- Скорректировал мой SQL-запрос, чтобы он возвращал соответствующие заголовки, и вызвал
ML.PREDICT
в таблицеtest
. Запрос занял ‹1 секунду для 9k строк. - Нажал
Save AS > Download as CSV
в интерфейсе BigQuery. - Перетащите CSV-файл в пользовательский интерфейс Kaggle.
Вот и все. Модель набрала 5.59009
. Это означает, что в среднем модель ошибалась на 5–6 долларов при оценке поездки. Еще предстоит пройти долгий путь, но он может стать хорошей отправной точкой. В конце концов, это простая линейная регрессия.
Последние мысли
С BigQuery ML даже люди, которые знают только SQL, могут быстро построить простые объяснимые модели. Если у вас есть хранилище данных, которое уже есть в BigQuery, больше не будет оправдания «машинное обучение - это так сложно»!
Найдите гипотезу, подготовьте данные, выполните простой запрос. Учитесь и повторяйте!
Последний вопрос: Google Cloud, когда вы добавите XGBoost 😄?
Примечания и благодарности:
- Хочу сказать спасибо всем лекторам, участникам и организаторам Lviv Data Science Summer School # lvds2018. Многому научился в школе и познакомился с замечательными людьми!
- Мы с друзьями организовываем необычную техническую конференцию GDG DevFest Ukraine - более 1000 разработчиков, 40+ спикеров со всего мира, мобильные / веб / облачные стримы + воркшопы. Если вы занимаетесь облачными технологиями или аналитикой, у нас есть много сеансов BigQuery, K8S и других. Проверьте это 🎉
Спасибо, что дочитали до этого места! Пожалуйста, 👏, если вам это понравилось, и напишите мне в твиттер (@ p1f), если у вас есть вопросы.