Во-первых, с Новым годом 🎉 Поскольку лето в Австралии набирает обороты, мы начали 2020 год с небольшого веселья, пытаясь ответить на вопрос, который все думают в Австралии в это время года (особенно моя жена и дети!), а именно — когда будут баги?! Это предсказывает вспышки тараканов и комаров (также известных как москиты).
Проект по прогнозированию ошибок фактически собрался еще в октябре. У нас было достаточно времени для исследования, итерации и тестирования, прежде чем летний сезон — и, соответственно, ошибки — вступили в силу. В этом сообщении блога мы поделимся техническим решением, которое мы использовали, и тем, как могло бы выглядеть решение высокого уровня.
Все они используют Google Cloud BigQuery, пользуясь преимуществами BigQuery Geography, Analytic и ML Functions.
Краткое введение для тех, кто нас не знает
Я Дрю. Я работаю в Google некоторое время. В настоящее время я работаю инженером по работе с клиентами, помогая нашим рекламодателям максимально эффективно использовать свои веб-сайты, приложения и данные. Все с моего стола в прекрасном Сиднее.
Я Денис. Я был аналитиком и консультантом в Google в Сиднее в течение последних 6 лет, работая над идеями, стратегией и решениями для рекламы проблем клиентов с использованием данных, и в этой роли у меня появилась настоящая страсть к машинному обучению.
Погода, говоришь?
Ага, погода! Погодные условия стали нашей главной особенностью в этой модели, поскольку было показано, что они влияют на популяцию насекомых. Используя исторические данные о погоде, мы можем искать корреляции между закономерностями во времени и вспышками ошибок. Учитывая температуру, осадки/дождь, влажность… (и многое другое).
Исторические данные о погоде
Поскольку это забавный эксперимент, мы поиграем с общедоступным набором данных BigQuery Глобальная историческая климатическая сеть (GHCN). Данные о погоде NCAR содержат отчеты с более чем 80 000 станций в 180 странах за последние десять лет. Его даже проверили на качество. Доступно в BigQuery, готово к работе. Идеально.
Кроме того, поскольку нас интересуют только погодные тенденции в Австралии, мы значительно сократим этот набор, перечислив только местные метеостанции (хотя было бы забавно когда-нибудь взглянуть на это глобально).
…и вуаля, таблица данных australia_historical_weather размером примерно 1,36 МБ / 17 088 строк готова к работе.
Границы штата Австралия
Обычно данные о погоде связаны с широтой/долготой местоположения метеостанции. Что касается данных NCAR. Таким образом, первая реальная задача — отобразить и преобразовать эти географические координаты широты и долготы в более значимые географические местоположения, например, город, город или штат.
В этом посте мы выберем уровень состояния (учитывая информацию о тенденциях, которую мы скоро обсудим), чтобы делать прогнозы появления ошибок.
Веб-сайт Австралийского статистического бюро (abs.gov.au) поддерживает местоположения статистической области. Используя ABS Maps, мы можем загрузить файл Цифровые границы штата и территории (STE) ASGS Ed 2016 в формате шейп-файла ESRI .shp, в котором подробно описаны границы всех австралийских штатов (аналогично этому скриншоту границы штата в Карты Гугл).
Эти данные также включают размер площади (км2) каждого штата. Хороший! Обязательно сохраним и это, это пригодится позже 👍.
После загрузки мы можем преобразовать шейп-файл (.shp) в .csv, который может использовать BigQuery. Примером такого инструмента может быть ogr2ogr, например…
ogr2ogr -f csv -dialect sqlite -sql “select AsGeoJSON(geometry) AS geom, * from SA4_2016_AUST” SA4_2016_AUST.csv SA4_2016_AUST.shp
Об этом хорошо рассказывает замечательный пост Лака Лакшманана на тему Как загружать географические данные, такие как шейп-файлы, в BigQuery.
Когда CSV-файл будет доступен, его можно будет загрузить в BigQuery, создав для использования таблицу australia_state_boundaries размером 87,9 МБ / 107 строк.
Совет: когда вы загружаете данные в CSV, не используйте автоопределение. Вместо этого укажите схему, чтобы столбец геометрии мог иметь тип GEOGRAPHY. Это избавит нас от необходимости использовать ST_GeogFromGeoJson в приведенном ниже запросе.
Сопоставление данных о погоде с состоянием
Теперь у нас есть таблица australia_state_boundaries, с которой можно поиграться, это самое простое. Географические функции BigQuery упрощают работу, позволяя нам агрегировать данные о погоде, которые являются ST_WITHIN государственной границей.
WITH australia_state_boundaries AS ( SELECT geom AS polygon, STATE_NAME_2016 AS stateLocation FROM `[project].[dataset].australia_state_boundaries` ) SELECT australia_state_boundaries.stateLocation, day, AVG(avgTemperature) AS avgTemperature, AVG(avgTd) AS avgTd, MAX(maxTemperature) AS maxTemperature, MIN(minTemperature) AS minTemperature, AVG(precipitation) AS precipitation FROM `[project].[dataset].australia_historical_weather`, australia_state_boundaries WHERE ST_WITHIN( ST_GEOGPOINT(longitude, latitude), australia_state_boundaries.polygon) GROUP BY sa4Location, day
При этом создавая значения max, min и avg в SQL. Назовем эту новую таблицу australia_state_historical_weather.
Google Trends для вспышек ошибок
Google Trends — это инструмент для анализа поисковых запросов Google с течением времени. Глядя на термин таракан, становится ясно, что данные о тенденциях являются полезным индикатором вспышек, вы можете видеть (на этом снимке экрана, взятом из Google Tends), поиски по этой теме нарастают по мере приближения лета в Австралии.
Соответственно, это значение, которое мы попытаемся предсказать, то есть метка, используемая в нашей модели ML. Инструмент тенденций позволяет фильтровать данные по состоянию и загружать информацию в формате CSV.
Соедините это с таблицей australia_state_historical_weather, и теперь у нас есть набор данных, содержащий данные о погоде за последние несколько лет и тенденциях ошибок.
На заметку. В инструменте трендов также есть раздел «Похожие запросы», показывающий, что также искали пользователи (пример скриншота)…
но что бы вы ни делали, не смотрите в этом разделе, когда находитесь на странице трендов тараканов… и когда вы не смотрите на нее, определенно не видите связанный запрос для молока тараканов! и что бы вы ни делали, не позволяйте любопытству взять верх над вами и ищите, чтобы узнать, что это новое увлечение здоровьем 🙈 ! Я никогда не буду смотреть на мир так же, как 🤮.
Обучение нашей «глючной» модели машинного обучения
Это глючная, а не глючная модель ML.
Мы разобьем набор данных на ряд оконных функций, агрегируя модели поведения с течением времени. Чтобы лучше понять эту концепцию, ознакомьтесь с моим постом структурирование данных для прогнозирования будущего.
Поскольку данные достаточно просты, мы можем сделать все это в BigQuery. Для этого мы будем использовать аналитическую функцию BigQuery PARTITION BY для агрегирования данных.
В качестве примера приведенный ниже SQL создает набор данных для комаров.
- Он собирает данные за 1 неделю каждый день, создавая черты прошлых моделей. РАЗДЕЛЕНИЕ ПО sa4Location В ПОРЯДКЕ ПО ДНЯМ МЕЖДУ 7 ПРЕДЫДУЩИМИ И 0 ПОСЛЕДУЮЩИМИ.
- Он также смотрит на 4 недели вперед, чтобы создать этикетку, которая научит модель смотреть в будущее. РАЗБИВКА ПО sa4Location ПО ДНЯМ СТРОК МЕЖДУ 29 СЛЕДУЮЩИМИ И 29 СЛЕДУЮЩИМИ.
SELECT state, EXTRACT(MONTH FROM day) AS month, EXTRACT(DAYOFYEAR FROM day) AS dayOfYear, EXTRACT(WEEK FROM day) AS weekOfYear, — Label SUM(mosquitoSearchVolume) OVER (PARTITION BY sa4Location ORDER BY day ROWS BETWEEN 29 FOLLOWING AND 29 FOLLOWING) AS mosquitoSearchVolume4WeekLabel, — 1 Week Volume Features mosquitoSearchVolume / AVG(mosquitoSearchVolume) OVER (PARTITION BY sa4Location ORDER BY day ROWS BETWEEN 7 PRECEDING AND 0 FOLLOWING) AS percentageChangeFromAvgMosquitoSearchVolume1Week, SUM(mosquitoSearchVolume) OVER (PARTITION BY sa4Location ORDER BY day ROWS BETWEEN 7 PRECEDING AND 0 FOLLOWING) / areaSize AS mosquitoSearchVolumePerAreaSize1Week, — 1 Week Weather Features AVG(avgTemperature) OVER (PARTITION BY sa4Location ORDER BY day ROWS BETWEEN 7 PRECEDING AND 0 FOLLOWING) AS avgTemperature1Week, AVG(avgTd) OVER (PARTITION BY sa4Location ORDER BY day ROWS BETWEEN 7 PRECEDING AND 0 FOLLOWING) AS avgTd1Week, MAX(maxTemperature) OVER (PARTITION BY sa4Location ORDER BY day ROWS BETWEEN 7 PRECEDING AND 0 FOLLOWING) AS maxTemperature1Week, MIN(minTemperature) OVER (PARTITION BY sa4Location ORDER BY day ROWS BETWEEN 7 PRECEDING AND 0 FOLLOWING) AS minTemperature1Week, AVG(precipitation) OVER (PARTITION BY sa4Location ORDER BY day ROWS BETWEEN 7 PRECEDING AND 0 FOLLOWING) AS avgPrecipitation1Week, — 1 Week Area Size Features (remember earlier we decided to keep this!) AVG(avgTemperature) OVER (PARTITION BY sa4Location ORDER BY day ROWS BETWEEN 7 PRECEDING AND 0 FOLLOWING) / areaSize AS avgTemperaturePerAreaSize1Week, AVG(avgTd) OVER (PARTITION BY sa4Location ORDER BY day ROWS BETWEEN 7 PRECEDING AND 0 FOLLOWING) / areaSize AS avgTdPerAreaSize1Week, AVG(precipitation) OVER (PARTITION BY sa4Location ORDER BY day ROWS BETWEEN 7 PRECEDING AND 0 FOLLOWING) / areaSize AS avgPrecipitationPerAreaSize1Week FROM…
Несколько советов…
- В зависимости от того, как выглядят данные Google Trends, может быть полезно удалить квантиль 99%, чтобы избежать каких-либо сумасшедших всплесков, которые могут запутать модель машинного обучения (APPROX_QUANTILES отлично подходит для этого).
- Не останавливайтесь на агрегировании по одной неделе за раз (в соответствии с SQL). Модель ML может находить закономерности в агрегатах погоды за другие периоды времени, например, за 12 недель.
- В SQL вы увидите возможность создавать и использовать новые функции, например, MAX и MIN Precipitation. Посмотрите, что вы можете найти, чтобы повысить точность модели машинного обучения.
- Помните, что вы агрегируете прошлые данные и должны убедиться, что самая старая рассматриваемая дата имеет данные до того, как она будет агрегирована, например, для 1-недельных окон в предложении WHERE обеспечить день › (SELECT DATE_ADD(MIN(day), INTERVAL 7 DAY).
Это готовый набор данных ML. Новая таблица australia_state_historical_weather_dataset готова для обучения модели машинного обучения. Ура.
Машинное обучение BigQuery
На нем можно использовать BigQuery ML, чтобы построить модель и начать делать прогнозы. С помощью нескольких строк SQL (начиная с CREATE MODEL) у вас будет модель для экспериментов.
CREATE OR REPLACE MODEL `[project].when_are_the_bugs_coming` OPTIONS(model_type=’linear_reg’, input_label_cols=[‘mosquitoSearchVolume4WeekLabel’]) AS SELECT * FROM australia_state_historical_weather_dataset
Это созданная модель. Теперь вы можете создать снимок australia_state_historical_weather_dataset, содержащий свежие данные за неделю, и начать делать прогнозы.
SELECT month, state, mosquitoSearchVolume4WeekLabel AS prediction FROM ML.PREDICT( MODEL `[project].when_are_the_bugs_coming` (SELECT * EXCEPT mosquitoSearchVolume4WeekLabel FROM australia_state_snapshot_weather_dataset))
Дайте нам знать, как вы поживаете.
Спасибо за чтение.