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

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

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

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

Дифференциальная конфиденциальность

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

Ограничение запросов

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

Как это работает

Рабочий процесс состоит из следующих важных шагов:

  1. Подготовьте данные для обучения.
  2. Создайте модель.
  3. Соберите информацию из модели.

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

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

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

Создать модель

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

Лучшие практики

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

  • Мы наблюдали точность > 0,70 для моделей логистической регрессии, построенных на основе обучающих наборов с числом пользователей не менее 100 000.
  • Мы видели r-квадрат > 0,70 для моделей линейной регрессии, построенных на основе обучающих наборов с числом пользователей не менее 800 000.

Есть и другие факторы, которые могут снизить качество модели.

  • Логистические модели, в которых один класс представлен гораздо более широко, чем другие. В частности, когда у одной метки мало пользователей обучающего набора, наличие большого количества пользователей обучающего набора с другими метками, вероятно, не сильно поможет точности модели на маленькой метке. Например, 20 000 и 1 000 пользователей обучающего набора для двух меток хуже, чем 10 000 и 2 000.
  • Данные объекта, которые не дают четкого сигнала для меток.
  • Необработанные данные, требующие более тщательного проектирования функций. Например, некоторые поля могут иметь очень большое количество возможных значений. Один из способов улучшить данные этого типа — преобразовать значения в признак с меньшим количеством категорий или сегментов.

Собирайте информацию

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

Оператор 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

имя_модели

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

запрос_оператор

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

model_option_list

тип_модели

(Обязательно) Единственный обязательный вариант. Может быть « adh_linear_regression » или « adh_logistic_regression ».

l1_reg

(Необязательно) Степень примененной регуляризации L1. Регуляризация L1 штрафует веса пропорционально сумме абсолютных значений весов. Может быть любым неотрицательным числом, по умолчанию равно нулю.

l2_reg

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

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

оптимизировать_стратегию

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

Аргументы

' 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

(Необязательно) Количество итераций или шагов обучения. Поскольку этот запрос строит одно дерево для каждой итерации, это также количество деревьев. Должно быть целое число больше 1. По умолчанию — 20.

Learn_rate_strategy

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

Аргументы

' LINE_SEARCH ' использует метод поиска строк для расчета скорости обучения. Начальная скорость обучения строкового поиска — это значение, указанное для LS_INIT_LEARN_RATE .

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

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

Значение по умолчанию — « LINE_SEARCH ».

оцените_обучение

(Необязательно, только для логистики) Скорость обучения для градиентного спуска, когда для 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 .

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

Аргументы

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

epsilon_per_model

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

Аргументы

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

auto_input_scaling

(Необязательно) При значении TRUE ко всем столбцам числовых объектов автоматически применяется min_max_scaling , как если бы имена столбцов были явно указаны в опции min_max_scaled_cols , за исключением любых столбцов, которые были явно вызваны в standard_scaled_cols или quantile_bucketized_cols .

Аргументы

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

min_max_scaled_cols

(Необязательно) Масштабирует каждый из указанных столбцов функции числового_выражения в диапазоне от 0 до 1, ограниченный значениями MIN и MAX во всех строках. При прогнозировании автоматически используются одни и те же MIN и MAX . Если данные прогноза находятся за пределами диапазона MIN , MAX , они ограничиваются значением 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 должен быть указан явно.
  • Один столбец в обучающем наборе должен называться «метка». Несколько ярлыков в настоящее время не поддерживаются.
  • Столбец метки не может содержать значения NULL. Если столбец метки содержит значения NULL, запрос не будет выполнен.
  • Ни один из столбцов функций не может быть получен из user_id.
  • Каждая строка должна представлять ровно одного уникального пользователя. Одна строка не может представлять данные более чем от одного пользователя. Это может произойти с некоторыми соединениями, например CROSS JOIN.
  • Ни один пользователь не может находиться в двух отдельных строках.
  • По соображениям конфиденциальности можно использовать только параметры, описанные в разделе синтаксиса. Другие параметры, которые можно найти в документации запроса BQML CREATE MODEL, в настоящее время не поддерживаются.

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

ML.ОЦЕНКА

Используйте функцию 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.ПРЕДИКТ

Функцию 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 позволяет вам видеть базовые веса, используемые моделью во время прогнозирования.

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