Модели машинного обучения могут быть очень полезны для принятия бизнес-решений на основе фактических данных. В зависимости от вашего бизнеса его можно использовать для сегментации клиентов, прогнозирования спроса и многого другого. Однако одним из самых больших препятствий для начала работы с 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, если у вас есть какие-либо отзывы или комментарии. Это действительно ценится!

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

Рекомендации

[1] https://cloud.google.com/bigquery-ml/docs/introduction