Модели машинного обучения могут быть очень полезны для принятия бизнес-решений на основе фактических данных. В зависимости от вашего бизнеса его можно использовать для сегментации клиентов, прогнозирования спроса и многого другого. Однако одним из самых больших препятствий для начала работы с ML является отсутствие знаний о python, фреймворках ML и сложности с поддержкой сложных конвейеров. В то же время постоянно появляются новые инструменты машинного обучения для современного стека данных, что затрудняет навигацию и понимание того, что стоит принять. В этой записи блога я покажу вам, как создать полноценный конвейер машинного обучения с автоматическим переобучением модели и создать на его основе информационные панели, просто объединив BigQuery ML с dbt.
Предполагая, что ваш стек данных построен с помощью BigQuery и dbt, вы, возможно, еще не знакомы с BigQuery ML. Как описывает это Google, «BigQuery ML позволяет создавать и выполнять модели машинного обучения в BigQuery с использованием стандартных запросов SQL» [1]. Это не тот путь, когда вам нужны модели с широкими возможностями настройки, но это отличный выбор, если вы хотите внедрить стандартную модель машинного обучения в свои информационные панели BI, написав всего несколько строк кода. Давайте продемонстрируем это на примере!
Мы будем использовать пакет dbt dbt_ml для построения модели BigQuery ML K-means, которая по существу объединяет похожих участников (клиентов/пользователей) на основе функций, которые мы включили в обучающие данные. В конечном итоге отображая кластеры на панели инструментов Looker (или используя какой-либо другой инструмент BI), маркетинговая команда может адаптировать свои кампании и отслеживать изменения в пользовательской базе.
Следуя инструкциям по установке dbt_ml здесь, обучающие данные можно сначала создать как обычную модель dbt (member_cluster_training_data.sql). Код, лежащий в основе этого, здесь опущен, поскольку он зависит от бизнеса, но несколько примеров строк в моем случае выглядят так:
В файле с именем member_cluster_model.sql модель K-средних можно легко настроить следующим образом:
{{ config( materialized='model', ml_config={ 'model_type': 'kmeans', 'num_clusters': dbt_ml.hparam_candidates([3, 4, 5, 6]), 'num_trials': 100, 'max_iterations': 20, } ) }} SELECT * EXCEPT(holder_member_id) FROM {{ref('member_cluster_training_data')}}
Мы не будем сейчас погружаться в мельчайшие детали теории машинного обучения или разработки функций, поскольку это выходит за рамки темы. Однако я хотел бы выделить dbt_ml.hparam_candidates()
, который пробует все указанное количество кластеров[3, 4, 5, 6]
, чтобы найти оптимальный. Это отличный способ избежать необходимости вручную выбирать число самостоятельно. Вы можете прочитать больше о модели K-средних в документации Google, а более подробную информацию о настройке гиперпараметров в BigQuery ML можно найти здесь. Результат нашей собственной настройки гиперпараметров вместе со сводкой обучения модели отображается в графическом интерфейсе BigQuery после обучения следующим образом:
После обучения модели с помощью dbt run
, как и любой другой модели dbt, на нее можно ссылаться в последующих моделях dbt с помощью макроса predict
. В этом случае последующая модель dbt (member_cluster_allocations.sql), содержащая назначения кластера, создается следующим образом:
{{config(materialized='table')}} with eval_data as ( SELECT * FROM {{ref('member_cluster_training_data')}} ), clusters_added AS ( SELECT * FROM {{ dbt_ml.predict(ref('member_cluster_model'), 'eval_data') }} ), -- optional CTE to get the distance to nearest cluster center get_min_dist AS ( SELECT c.holder_member_id, MIN(dist.DISTANCE) AS distance_to_center FROM clusters_added c CROSS JOIN UNNEST(c.NEAREST_CENTROIDS_DISTANCE) dist GROUP BY 1 ), join_cluster_dist AS ( SELECT c.* EXCEPT (NEAREST_CENTROIDS_DISTANCE), g.distance_to_center, CURRENT_TIMESTAMP() AS allocations_created_at FROM get_min_dist g INNER JOIN clusters_added c USING (holder_member_id) ) SELECT * FROM join_cluster_dist
После запуска мы можем просмотреть выходные данные модели в BigQuery и использовать их на наших информационных панелях, как и любую другую таблицу BigQuery.
Однако здесь есть ловушка, на которую следует обратить внимание! Проблема с прямым использованием BigQuery ML и dbt заключается в том, что ваши модели будут переобучаться каждый раз, когда кто-то выполняет dbt run
. Поскольку обучение моделей машинного обучения обычно занимает немного времени, это может продлить циклы разработки БД и увеличить вычислительные затраты. Переобучение моделей в производственной среде может потребоваться только раз в месяц, в то время как остальные ваши модели, вероятно, должны материализоваться чаще.
Хитрость заключается в том, чтобы отключить запуск модели в dbt по умолчанию и включить его только для определенных прогонов. Просто добавьте приведенный ниже код в свой файл dbt_project.yml , и dbt run
проигнорирует все в вашей папке models/bg_ml, куда вы можете поместить код ML.
models: hedvig: bq_ml: +enabled: "{{ var('bq_ml', false) | as_bool }}" # RUN WITH FLAG --vars 'bq_ml: true' TO ENABLE
Для справки, другие важные части моего dbt_project.yml прикреплены ниже:
# NOTE: This is NOT a complete version of the file name: hedvig version: '1.0' config-version: 2 # This setting configures which "profile" dbt uses for this project. Profiles contain # database connection information. profile: 'bigquery' # These configurations specify where dbt should look for different types of files. # The `model-paths` config, for example, states that source models can be found # in the "models/" directory. model-paths: ["models"] analysis-paths: ["analysis"] test-paths: ["tests"] seed-paths: ["data"] macro-paths: ["macros"]
Чтобы затем включить модели ML в материализацию, просто выполните:
dbt run --vars 'bq_ml: true' # run all models dbt run --models <model_name> --vars 'bq_ml: true' # run only <model_name>
Это решение я называю умным обучением, и мы, наконец, можем запланировать выполнение этих моделей, как обычно, в облаке dbt.
Отказ от ответственности и требования
Я успешно запустил все с моего локального Mac с помощью PyCharm, а затем запланировал запуск с облаком dbt со следующими установленными версиями:
dbt=1.0.8 bigquery=1.0.0 packages: - package: dbt-labs/dbt_utils version: 0.8.0 - package: dbt-labs/codegen version: 0.5.0 - package: kristeligt-dagblad/dbt_ml version: 0.5.1
Спасибо за прочтение!
Не стесняйтесь обращаться ко мне в LinkedIn, если у вас есть какие-либо отзывы или комментарии. Это действительно ценится!
Если вы тоже хотите работать с данными в быстрорастущей страховой компании, загляните на карьерную страницу Хедвиг.