Моделирование регрессии в Ads Data Hub

Линейная и логистическая регрессии – это модели машинного обучения, которые позволяют строить прогнозы на основе рекламных данных.

  • Линейная регрессия создает линейную функцию таким образом, чтобы расстояние между исходными данными и этой функцией было минимальным. Эта модель может использоваться, чтобы прогнозировать численные значения на основе входных данных, например общую ценность пользователя на основе данных о покупках, взаимодействиях и т. д.
  • Логистическая регрессия используется для решения задач классификации. В зависимости от количества переменных, будет использоваться один из двух типов модели:
    • Бинарная логистическая регрессия позволяет получать ответы на вопросы "да/нет", например "Может ли произойти это событие-конверсия?".
    • Многоклассовая логистическая регрессия позволяет отвечать на вопросы с большим числом вариантов ответа, например определять ценность клиента как низкую, среднюю или высокую.

Алгоритмы линейной и логистической регрессий обучаются на данных (в рассматриваемом случае – на ваших рекламных данных) и позволяют строить прогнозные модели, помогающие принимать решения. Как правило, чем больше качественных данных вы предоставите, тем выше будет точность прогнозов. Обе модели работают лучше, если использовать для обучения тесно сгруппированные данные.

Дифференциальная приватность

И для линейной, и для логистической регрессии используется дифференциальная приватность – особая система проверок конфиденциальности, отличная от той, которая применяется для остальных операций в Ads Data Hub. Дифференциальная приватность защищает конфиденциальность конечных пользователей, добавляя шум в результаты во время обучения. Уровень шума достаточно низок, чтобы результаты были полезны, однако его добавление препятствует идентификации конечных пользователей. Кроме того, уровень шума недетерминирован, то есть непостоянен, что позволяет ещё надежнее защитить конечных пользователей.

Ограничения на количество запросов

Если используется заданное по умолчанию значение EPSILON_PER_MODEL, то ограничение составит 100 запросов на моделирование линейной и логистической регрессии для данных за сутки, то есть событий, которые созданы в определенный день. Эти события определяются датами начала и окончания, которые указываются при выполнении запроса и при создании таблиц, используемых в запросе, например временных таблиц для обучения. Из этого следует, что данные за один день могут использоваться не более чем в 100 моделях. Если вы укажете для EPSILON_PER_MODEL число, превышающее значение по умолчанию, то сможете создавать меньше моделей, но они будут более высокого качества. А если вы зададите для EPSILON_PER_MODEL значение ниже, чем по умолчанию, то сможете обучать больше моделей, но их качество будет ниже.

Принцип работы

Процесс включает следующее:

  1. подготовка данных для обучения модели;
  2. создание модели;
  3. применение модели для получения прогнозов.

Как подготовить данные для обучения

Как уже говорилось, чем больше объем предоставленных данных и выше их качество, тем лучше будут результаты. Поскольку к входным данным применяется нормализация мин-макс, слабо сгруппированные данные или данные, содержащие много выбросов, приведут к смещению среднего, что сделает модель менее точной.

По умолчанию Ads Data Hub случайным образом выбирает для проверки 18 % обучающих данных. Это значение можно изменить с помощью функции data_split_eval_fraction.

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

Задайте параметры и укажите входные данные для обучения модели.

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

Один из ключевых факторов, влияющих на качество модели, – объем данных для обучения. Однако баланс между объемом и качеством данных может меняться в зависимости от вашей задачи и перечисленных ниже обстоятельств. Поделитесь с нами своим опытом. *По нашим данным, точность моделей логистической регрессии, построенных по наборам данных для обучения, содержащим не менее 100 000 пользователей, составляет более 0,7. *По нашим данным, коэффициент детерминации для моделей линейной регрессии, построенных по наборам данных для обучения, содержащим не менее 800 000 пользователей, составляет более 0,7.

Ряд факторов может отрицательно повлиять на качество модели. *Логистические модели, в которых один класс представлен намного больше остальных. В частности, если на один ярлык в наборе для обучения приходится мало пользователей, а на другие ярлыки – много, точность модели для первого ярлыка будет невысокой. Например, если у вас два ярлыка, лучше, если на них приходится 10 000 и 2000 пользователей, а не 20 000 и 1000. *Данные, которые не содержат значимые сигналы для ярлыков. *Первичные данные со сложной системой признаков, например в некоторых полях может быть очень много возможных значений. Один из способов улучшить качество таких данных – преобразования значения в признаки с меньшим количеством категорий или сегментов.

Как анализировать результаты

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

Оператор CREATE MODEL

Оператор CREATE MODEL создает модель с заданным вами названием, используя указанный набор данных. Если модель с таким названием уже существует, оператор CREATE MODEL заменит ее.

Синтаксис оператора CREATE MODEL

CREATE MODEL
model_name
OPTIONS
(
  // model_option_list:
  // Required parameter.
  MODEL_TYPE = { 'ADH_LINEAR_REGRESSION' | 'ADH_LOGISTIC_REGRESSION'}

  // Optional tuning parameters.
  [, L1_REG = float64_value ]
  [, L2_REG = float64_value ]
  [, DATA_SPLIT_EVAL_FRACTION = float64_value ]
  [, OPTIMIZE_STRATEGY = { 'AUTO_STRATEGY' | 'BATCH_GRADIENT_DESCENT' |
                           'NORMAL_EQUATION' } ]
  [, MAX_ITERATIONS = int64_value ]
  [, LEARN_RATE_STRATEGY = { 'LINE_SEARCH' | 'CONSTANT' } ]
  [, LEARN_RATE = float64_value ]
  [, EARLY_STOP = { TRUE | FALSE } ]
  [, MIN_REL_PROGRESS = float64_value ]
  [, LS_INIT_LEARN_RATE = float64_value ]
  [, EPSILON_PER_MODEL = float64_value ]
  [, AUTOMATIC_IMPUT_SCALING = bool_value ]
  [, MIN_MAX_SCALED_COLS = [string_value, string_value... ] ]
  [, STANDARD_SCALED_COLS = [string_value, string_value... ] ]
  [, QUANTILE_BUCKETIZED_COLS = [
        STRUCT(string_value AS col_name, int64_value AS num_buckets), 
       STRUCT(string_value AS col_name, int64_value AS num_buckets)... ] ]
)
AS query_statement

model_name

Название модели может содержать буквы, цифры, символы подчеркивания и дефисы и не может включать точки. Если модель с введенным названием уже существует, она будет перезаписана.

query_statement

Указывает, какой стандартный SQL-запрос использовался для создания обучающих данных. Если вы используете одни и те же обучающие данные для создания нескольких моделей, создайте временную таблицу с этими данными и укажите ее в этом запросе. Это позволяет избежать ошибок из-за проверок различий (например, если данные были удалены или впоследствии помечены как спам).

model_option_list

model_type

Единственный обязательный параметр. Не может иметь значения adh_linear_regression или adh_logistic_regression.

l1_reg

Необязательный параметр. Примененное значение регуляризации L1. При регуляризации L1 к весам добавляется штраф, пропорциональный сумме абсолютных значений весов. Может быть любым положительным числом. Значение по умолчанию – 0.

l2_reg

Необязательный параметр. Примененное значение регуляризации L2. При регуляризации L2 к весам добавляется штраф, пропорциональный квадратному корню из суммы квадратов весов. Может быть любым положительным числом. Значение по умолчанию – 0.

data_split_eval_fraction

Необязательный параметр. Может принимать значения от 0,01 до 0,99. Значение по умолчанию – 0,18. Определяет, какая доля данных будет использоваться для проверки. Уменьшение количества строк, используемых для обучения модели, снижает ее точность, но увеличивает количество доступных моделей. Таблица ниже иллюстрирует эту зависимость (предполагается, для проверки каждой модели из одного и того же набора данных используется одинаковая доля данных).

Доля данных для проверки Доступное количество запросов
0,01 7
0,1 8
0,15 8
0,18 9
0,2 9
0,3 10
0,5 14
0,9 50

optimize_strategy

Необязательный параметр. Стратегия обучения моделей линейной регрессии.

Аргументы

AUTO_STRATEGY определяет стратегию обучения следующим образом:

  • Если заданы l1_reg или warm_start, используется стратегия batch_gradient_descent.
  • Если общее количество уникальных значений используемых для обучения признаков превышает 10 000, используется стратегия batch_gradient_descent.
  • Если возникает проблема переобучения (количество обучающих примеров меньше, чем 10 х общее количество уникальных значений), используется стратегия batch_gradient_descent.
  • В остальных случаях используется стратегия NORMAL_EQUATION.

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

NORMAL_EQUATION (только линейные модели) рассчитывает решение задачи линейной регрессии с аналитической формулой по методу наименьших квадратов. Нормальное уравнение не может использоваться в следующих случаях:

  • задан параметр l1_reg;
  • задан параметр warm_start;
  • общее количество уникальных значений используемых для обучения признаков превышает 10 000;
  • значение по умолчанию – AUTO_STRATEGY.

max_iterations

Необязательный параметр. Количество итераций или шагов обучения, а также количество деревьев, поскольку этот запрос создает одно дерево для каждой итерации. Может быть целым числом больше единицы. Значение по умолчанию – 20.

learn_rate_strategy

Необязательный параметр, используется только для логистической модели. Стратегия определения скорости обучения.

Аргументы

LINE_SEARCH рассчитывает скорость обучения по методу линейного поиска. Изначальная скорость обучения для линейного поиска – значение, заданное в LS_INIT_LEARN_RATE.

  • Линейный поиск замедляет обучения и увеличивает количество обрабатываемых байтов, однако в целом сближается с более высокой скоростью обучения, заданной изначально.

CONSTANT назначает для скорости обучения значение, заданное в LEARN_RATE.

Значение по умолчанию – LINE_SEARCH.

learn_rate

Необязательный параметр, используется только для логистической модели. Скорость обучения для градиентного спуска, если для LEARN_RATE_STRATEGY задано значение CONSTANT. Если для LEARN_RATE_STRATEGY задано LINE_SEARCH, возвращается ошибка.

Аргументы

float64_value может быть любым 64-битным числом с плавающей запятой. Значение по умолчанию – 0,1 (10 %).

early_stop

Необязательный параметр. Указывает, нужно ли останавливать обучение после первой итерации, для которой относительное улучшение потерь ниже значения, заданного для MIN_REL_PROGRESS.

Аргументы

TRUE значит "да", FALSE – "нет". Значение по умолчанию – TRUE.

min_rel_progress

Необязательный параметр. Минимальное относительное улучшение потерь, необходимое для продолжения обучения, если для EARLY_STOP задано значение true. Например, значение 0,01 указывает, что каждая итерация должна снижать потери на 1 %, чтобы обучение продолжалось.

Аргументы

float64_value может быть любым 64-битным числом с плавающей запятой. Значение по умолчанию – 0,1 (10 %).

ls_init_learn_rate

Необязательный параметр. Изначальная скорость обучения для LEARN_RATE_STRATEGY='LINE_SEARCH'. Может использоваться, только если задан параметр LINE_SEARCH.

Если ML.TRAINING_INFO показывает, что скорость обучения модели (LEARN_RATE) удваивается с каждой итерацией, попробуйте задать для LS_INIT_LEARN_RATE значение, равное последней скорости обучения, умноженной на 2. Оптимальная изначальная скорость обучения для разных моделей будет различаться. Значение, которое подходит одной модели, может не подойти для другой.

Аргументы

float64_value может быть любым 64-битным числом с плавающей запятой.

epsilon_per_model

Необязательный параметр. Объем бюджета конфиденциальности, который будет выделен для обучения модели. Каждый пользователь Ads Data Hub получает для данных за сутки бюджет конфиденциальности, равный 10,0. Обученная модель будет расходовать указанную в параметре EPSILON_PER_MODEL долю бюджета для данных за каждые сутки из диапазона, заданного в запросе. Значение по умолчанию, равное ln(3)/10, позволит создать около 100 моделей. Если задать более высокое значение, вы сможете создавать меньше моделей лучшего качества, а если более низкое, – больше моделей, качество которых будет хуже.

Аргументы

float64_value может быть любым положительным 64-битным числом с плавающей запятой меньше ln(3) (примерно 1,0986). По умолчанию составляет ln(3)/10.

automatic_input_scaling

Необязательный параметр. Если они принимает значение TRUE, ко всем столбцам численных признаков применяется min_max_scaling так, словно название столбца непосредственно вызывается в функции min_max_scaled_cols. Это не касается столбцов, которые вызываются в standard_scaled_cols или quantile_bucketized_cols.

Аргументы

bool_value принимает значение BOOL, значение по умолчанию – TRUE.

min_max_scaled_cols

Необязательный параметр. Масштабирует все указанные признаки столбцов numerical_expression в диапазоне от 0 до 1 с использованием MIN и MAX для всех строк. Эти же MIN и MAX автоматически используются при создании прогноза. Если прогнозируемые данные выходят за пределы диапазона MINMAX, они ограничиваются 0 или 1.

Аргументы

Массив string_value, где каждое значение string_value – STRING с именем столбца, который нужно преобразовать.

standard_scaled_cols

Необязательный параметр. Стандартизирует указанные признаки столбцов numerical_expression во всех строках. Значения STDDEV и MEAN, рассчитанные для стандартизации выражения, автоматически используются при создании прогноза.

Аргументы

Массив string_value, где каждое значение string_value – STRING с именем столбца, который нужно преобразовать.

quantile_bucketized_cols

Сегментирует указанные столбцы сквозного численного признака в виде STRING, где название сегмента – значение, основанное на квантиле. Те же квантили автоматически используются при создании прогноза.

Аргументы

Массив STRUCT(string_value AS col_name, int64_value AS num_buckets), где каждое значение string_value – STRING с именем столбца сквозного численного признака, который нужно преобразовать, а каждое значение int64_value – количество сегментов, в которые нужно объединить численные значения.

Проверка

  • Для данных за каждые сутки из диапазона, заданного в запросе, должен быть доступен достаточный бюджет конфиденциальности (т. е. превышающий EPSILON_PER_MODEL). В противном случае запрос выполнен не будет.
  • Если заданы необязательные параметры настройки, они будут проверяться для указанных выше диапазонов.
  • Непосредственно нужно задать только один обязательный параметр model_type.
  • В обучающем наборе должен быть один столбец с названием "label" (ярлык). Несколько ярлыков в настоящее время не поддерживаются.
  • Столбец ярлыков не должен быть пустым (содержать значения NULL), в противном случае запрос выполнен не будет.
  • Столбцы признаков не могут быть получены из user_id.
  • Каждая строка должна соответствовать строго одному уникальному пользователю. Строки не могут включать данные нескольких пользователей, – такое может произойти при некоторых методах объединений, например перекрестном.
  • Один пользователь не может быть включен в две строки.
  • Для защиты конфиденциальности можно использовать только параметры, приведенные в разделе "Синтаксис". Другие варианты, приведенные в документации для запроса BQML CREATE MODEL, в настоящее время не поддерживаются.

Функции оценки

ML.EVALUATE

Используйте функцию ML.EVALUATE, чтобы оценить показатели модели. Функция ML.EVALUATE может использоваться и для линейной, и для логистической регрессии.

SELECT
  *
FROM ML.EVALUATE(MODEL `linear_model_test`);

ML.ROC_CURVE

Используйте функцию ML.ROC_CURVE, чтобы оценить показатели логистической регрессии. Функция ML.ROC_CURVE может использоваться только для таких моделей.

SELECT
  *
FROM ML.ROC_CURVE(MODEL `logistic_model_test`);

Функции прогнозирования

ML.PREDICT

Функция ML.PREDICT может использоваться, чтобы прогнозировать результаты с помощью модели. Результаты, полученные с помощью ML.PREDICT, проходят те же проверки конфиденциальности, что и остальные результаты в Ads Data Hub. Подробнее о проверках конфиденциальности

Линейная регрессия

/* This example outputs the average value for labels that the model predicted */
SELECT
  AVG(predicted_label) AS average_predicted_label
FROM
  ML.PREDICT(MODEL `linear_model_test`, TABLE tmp.linear_training_set);

Логистическая регрессия

/* This example outputs the model's prediction and probabilities for said prediction over individual users. It groups by label and prediction, counting the number of users in each prediction */
SELECT
  label,
  predicted_label, /* one of the two input labels, depending on which label has the higher predicted probability */
  COUNT(*) AS num /* a tally of users */
FROM
  ML.PREDICT(MODEL `logistic_model_test`, TABLE tmp.logistic_training_set)
GROUP BY 1, 2;

Функции исследования моделей и признаков

ML.TRAINING_INFO

Функция ML.TRAINING_INFO позволяет посмотреть сведения об итерациях обучения модели.

SELECT
  *
FROM ML.TRAINING_INFO(MODEL `logistic_model_test`);

ML.FEATURE_INFO

Функция ML.FEATURE_INFO позволяет посмотреть сведения о входных признаках, использующихся для обучения модели.

SELECT
  *
FROM ML.FEATURE_INFO(MODEL `logistic_model_test`);

ML.WEIGHTS

Функция ML.WEIGHTS позволяет посмотреть вес, который используется в модели для прогнозирования.

SELECT
  *
FROM ML.WEIGHTS(MODEL `linear_model_test`);

Примеры

Создание модели

В примерах ниже для создания модели используется пример таблицы natality.

Выбор данных для обучения (линейная модель)

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

CREATE MODEL `natality_model`
OPTIONS
  (model_type='adh_linear_regression') AS
SELECT
  weight_pounds as label,
  is_male,
  gestation_weeks,
  mother_age,
  CAST(mother_race AS string) AS mother_race
FROM
  `bigquery-public-data.samples.natality`
WHERE
  weight_pounds IS NOT NULL

Выбор данных для обучения (логистическая модель)

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

CREATE MODEL `natality_model`
OPTIONS
  (model_type='adh_logistic_regression') AS
SELECT
  weight_pounds,
  is_male as label,
  gestation_weeks,
  mother_age,
  CAST(mother_race AS string) AS mother_race
FROM
  `bigquery-public-data.samples.natality`
WHERE
  weight_pounds IS NOT NULL

Активация аудитории

Прогнозы с помощью существующей модели линейной регрессии (с известными весовыми значениями) можно создавать без использования ML.PREDICT, даже если у вас нет доступа к самой модели. О том, как это сделать, рассказывается в Практической работе по моделированию регрессии для активации аудитории.