Вы можете делать прогнозы, используя существующую модель линейной или логистической регрессии с известными весами, не используя ML.PREDICT
даже без доступа к самой модели. Для этого вам необходимо использовать обходной путь для использования моделей дифференциально-частной регрессии (DP) в запросах активации аудитории в Ads Data Hub.
Этот пошаговый пример научит вас выполнять смоделированный вывод для реальных моделей линейной и бинарной логистической регрессии, а затем сравнивать результаты с результатами ML.PREDICT
, чтобы показать точность смоделированных результатов. Также будет продемонстрирован практический пример того, как создать список аудитории с помощью бинарной логистической модели, который будет использоваться при применении модели конверсии для активации аудитории.
Обзор примера:
- Генерация данных
- Обучение модели
- Получите веса и перехватите
- Смоделировать прогноз
- Сравнить результаты
Пошаговый пример
1. Генерация данных
Создайте таблицу с смоделированными данными для обучения модели. Отметьте часть строк для набора удержания.
Линейная регрессия
CREATE OR REPLACE TABLE DATASET_NAME.LIN_REG_TRAINING_SET AS
WITH
A AS (
SELECT
*
FROM
UNNEST(GENERATE_ARRAY(1, 100000)) AS row_number),
B AS (
SELECT
row_number,
RAND() AS rand_label,
RAND() AS rand_feature_1,
RAND() AS rand_feature_2,
RAND() AS rand_feature_3,
RAND() AS rand_feature_4,
RAND() AS rand_feature_5,
RAND() AS rand_feature_6,
RAND() AS rand_feature_7,
RAND() AS rand_feature_8,
RAND() AS rand_feature_9,
RAND() AS rand_feature_10
FROM
A),
C AS (
SELECT
rand_label AS label,
*
FROM
B),
D AS (
SELECT
row_number,
CAST(round(10 * label) AS INT64) AS label,
(rand_label + rand_feature_1) / 2 AS feature_1,
(rand_label + rand_feature_2) / 2 AS feature_2,
(rand_label + rand_feature_3) / 2 AS feature_3,
(rand_label + rand_feature_4) / 2 AS feature_4,
(rand_label + rand_feature_5) / 2 AS feature_5,
(rand_label + rand_feature_6) / 2 AS feature_6,
(rand_label + rand_feature_7) / 2 AS feature_7,
(rand_label + rand_feature_8) / 2 AS feature_8,
(rand_label + rand_feature_9) / 2 AS feature_9,
(rand_label + rand_feature_10) / 2 AS feature_10
FROM
C)
SELECT
label,
feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10,
RAND() < 0.1 AS holdback -- Ten percent will be true.
FROM
D
Бинарная логистическая регрессия
SELECT
CASE
WHEN label < 5 THEN 0
WHEN label >= 5 THEN 1
END
AS label,
* EXCEPT (label)
FROM
`DATASET_NAME.BIN_LOG_REG_TRAINING_SET`
2. Обучите модель
Обучите модель регрессии из обучающего набора.
Линейная регрессия
CREATE OR REPLACE MODEL `DATASET_NAME.LIN_REG_MODEL` OPTIONS (model_type="linear_reg") AS
SELECT
* except (holdback)
FROM
`DATASET_NAME.LIN_REG_TRAINING_SET`
WHERE
NOT holdback
Обратите внимание, что мы добавили достаточно шума к смоделированным данным, чтобы получить модель с R 2 = 0,9009.
Измерение | Ценить |
---|---|
Средняя абсолютная ошибка | 0,7359 |
Среднеквадратическая ошибка | 0,8432 |
Среднеквадратическая ошибка журнала | 0,0810 |
Медианная абсолютная ошибка | 0,6239 |
R в квадрате | 0,9009 |
Бинарная логистическая регрессия
CREATE OR REPLACE MODEL `DATASET_NAME.BIN_LOG_REG_MODEL` OPTIONS (model_type="logistic_reg") AS
SELECT
* EXCEPT (holdback)
FROM
`DATASET_NAME.BIN_LOG_REG_TRAINING_SET`
WHERE
NOT holdback
Примеры результатов. Обратите внимание на точность 0,9260.
Измерение | Ценить |
---|---|
Позитивный класс | 1 |
Отрицательный класс | 0 |
Точность | 0,0810 |
Отзывать | 0,9315 |
Точность | 0,9260 |
Оценка F1 | 0,9328 |
Значения, выделенные жирным шрифтом в этой матрице путаницы, показывают, как часто модель правильно классифицировала каждую метку, а нежирные значения показывают, как часто модель ошибочно классифицировала каждую метку.
Настоящая этикетка | Прогнозируемая метка 1 | Прогнозируемая метка 2 |
---|---|---|
1 | 93% | 7% |
0 | 8% | 92% |
3. Получите веса и перехватите
Получите веса и точку пересечения модели:
Линейная регрессия
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.LIN_REG_MODEL`)
масса | Category_weights.category |
---|---|
Feature_1 | 1.8263055528635743 |
Feature_2 | 1.8143804404490813 |
Feature_3 | 1.8601204874033492 |
Feature_4 | 1.8507603439031859 |
Feature_5 | 1.7899764387123640 |
Feature_6 | 1.8645246630251291 |
Feature_7 | 1.8698005281925356 |
Feature_8 | 1.7904637080330201 |
Feature_9 | 1.8036887855406274 |
Feature_10 | 1.8117115890624449 |
ПЕРЕХВАТ | -4.1428754911504306 |
Бинарная логистическая регрессия
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`)
масса | Category_weights.category |
---|---|
Feature_1 | 3.823533928 |
Feature_2 | 3.734812819 |
Feature_3 | 3.842239823 |
Feature_4 | 3.785488823 |
Feature_5 | 3.737386716 |
Feature_6 | 3.567663961 |
Feature_7 | 3.819643052 |
Feature_8 | 3.734673763 |
Feature_9 | 3.839301406 |
Feature_10 | 3.787306994 |
ПЕРЕХВАТ | -17,922169920 |
4. Смоделируйте прогноз
Линейная регрессия
Используйте скалярное произведение значений признаков с весами и добавьте перехват, чтобы сделать прогноз с использованием стандартного SQL без использования ML.PREDICT
. Этот запрос сравнивает прогнозы, полученные с использованием этого метода, с прогнозами, использующими ML.PREDICT
. Обратите внимание, как жирные строки SQL выполняют скалярное произведение значений признаков для строки с весами модели, а затем добавляют перехват.
WITH
T AS (
SELECT
label AS actual_label,
predicted_label AS ml_predicted_label,
[feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10] AS features,
[1.8263055528635743,
1.8143804404490813,
1.8601204874033492,
1.8507603439031859,
1.789976438712364,
1.8645246630251291,
1.8698005281925356,
1.7904637080330201,
1.8036887855406274,
1.8117115890624449] AS weights
FROM
ML.PREDICT(MODEL `DATASET_NAME.LIN_REG_MODEL`,
(
SELECT
*
FROM
`PROJECT_NAME.DATASET_NAME.LIN_REG_TRAINING_SET`))
WHERE
holdback),
P AS (
SELECT
actual_label,
ml_predicted_label,
(
SELECT
SUM(element1 * element2) - 4.1428754911504306
FROM
T.features element1
WITH
OFFSET
pos
JOIN
T.weights element2
WITH
OFFSET
pos
USING
(pos) ) sql_predicted_label,
features,
weights
FROM
T)
SELECT
actual_label,
ml_predicted_label,
sql_predicted_label,
ABS(ml_predicted_label - sql_predicted_label) < 0.00000000001 AS diff_is_negligible
FROM
P
Бинарная логистическая регрессия
Для бинарной логистической регрессии метод моделирования прогнозов очень похож на линейную регрессию с добавлением применения сигмовидной функции на последнем шаге с желаемым порогом.
Используйте скалярное произведение значений признаков с весами и добавьте перехват, чтобы сделать прогноз с использованием стандартного SQL без использования ML.PREDICT
. Затем используйте сигмовидную функцию с порогом 0,5 для результата, чтобы спрогнозировать либо 0, либо 1. Этот запрос сравнивает прогнозы, выполненные с использованием этого метода, с прогнозами, использующими ML.PREDICT
.
WITH
T AS (
SELECT
label AS actual_label,
predicted_label AS ml_predicted_label,
[feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10] AS features,
[3.8235339279050287,
3.7348128191185244,
3.8422398227859471,
3.7854888232502479,
3.7373867156553713,
3.5676639605351026,
3.8196430517007811,
3.7346737628343032,
3.8393014063170749,
3.7873069939244743] AS weights
FROM
ML.PREDICT(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`,
(
SELECT
*
FROM
`PROJECT_NAME.DATASET_NAME.BIN_LOG_REG_TRAINING_SET`))
WHERE
holdback),
P AS (
SELECT
actual_label,
ml_predicted_label,
(
SELECT
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
FROM
T.features element1
WITH
OFFSET
pos
JOIN
T.weights element2
WITH
OFFSET
pos
USING
(pos) ) sql_predicted_label,
features,
weights
FROM
T)
SELECT
actual_label,
ml_predicted_label,
sql_predicted_label,
ml_predicted_label = sql_predicted_label AS simulation_is_accurate
FROM
P
Блок кода SQL, выделенный жирным шрифтом в приведенном выше запросе, выполняет скалярное произведение значений признаков для каждой строки с весами модели и добавляет перехват, чтобы получить прогноз линейной регрессии:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Затем он применяет сигмовидную функцию Y = 1 / (1+e^-z)
к скалярному произведению и перехватывает его, используя стандартный SQL:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Наконец, результат сигмоидальной функции сравнивается с пороговым значением 0,5, чтобы получить прогноз бинарной логистической регрессии либо 0, если оно меньше 0,5, либо 1, если это не так. Обратите внимание, что вы можете использовать любое пороговое значение от 0 до 1.
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Этот метод также можно распространить на многоклассовую логистическую регрессию. В этом случае веса модели будут представлять собой матрицу nxn, а не вектор, а веса будут вектором, а не скаляром. Вы должны умножить вектор значений признаков на матрицу весов и добавить вектор пересечения. Результирующий вектор будет иметь оценку для каждой метки, и вы можете выбрать метку с наивысшим баллом для вашего прогноза. Если вы хотите вернуть массив вероятностей, вы должны применить сигмовидную функцию к каждому элементу массива.
5. Сравните результаты
Линейная регрессия
Результаты выборки почти идентичны, за исключением небольшой ошибки округления.
фактическая_метка | ml_predicted_label | sql_predicted_label | diff_is_negligible |
---|---|---|---|
6 | 5.2062349420751834 | 5.2062349420751826 | истинный |
0 | 0.40318472770048075 | 0,403184727700479 | истинный |
3 | 3.0703766078249597 | 3.0703766078249597 | истинный |
7 | 7.0588171538562 | 7.0588171538562 | истинный |
6 | 6.7802375930646 | 6.7802375930646 | истинный |
6 | 5.1088569571339368 | 5.1088569571339377 | истинный |
4 | 4.051839078116874 | 4.051839078116874 | истинный |
4 | 5.1810254680219243 | 5.1810254680219234 | истинный |
6 | 6.1440349466401223 | 6.1440349466401205 | истинный |
1 | 2.0842399472783519 | 2.0842399472783519 | истинный |
2 | 2.1911209811886847 | 2.1911209811886838 | истинный |
3 | 3.0236086790006622 | 3.0236086790006613 | истинный |
2 | 2.573083132964213 | 2.5730831329642125 | истинный |
7 | 5.68662973136732 | 5.6866297313673186 | истинный |
9 | 8.1860026312677938 | 8.1860026312677938 | истинный |
Бинарная логистическая регрессия
Сравнение смоделированного вывода с фактическими результатами ML.PREDICT
является идеальным — ни одного противоречия в наборе удержаний из 10 тыс. строк. Есть несколько строк, в которых и ML.PREDICT
, и смоделированный вывод не совпадают с фактической меткой, и это ожидаемо, поскольку точность модели составляет около 93 %, а в недиагональных ячейках имеются небольшие, но ненулевые значения. матрица путаницы.
фактическая_метка | ml_predicted_label | sql_predicted_label | симуляция_is_accurate |
---|---|---|---|
0 | 1 | 1 | истинный |
0 | 0 | 0 | истинный |
0 | 0 | 0 | истинный |
0 | 0 | 0 | истинный |
0 | 0 | 0 | истинный |
0 | 0 | 0 | истинный |
0 | 0 | 0 | истинный |
0 | 0 | 0 | истинный |
0 | 0 | 0 | истинный |
0 | 0 | 0 | истинный |
0 | 1 | 1 | истинный |
0 | 0 | 0 | истинный |
Создайте список активации аудитории с помощью ML
Типичный вариант использования — создание дифференциально-частной модели бинарной логистической регрессии для прогнозирования конверсий, а затем применение выводов к этой модели при создании списка аудитории. Предположим, что бинарная логистическая модель, созданная в приведенном выше примере, моделирует конверсии и что каждая строка в наборах обучения и оценки представляет отдельного пользователя.
Следующий запрос показывает, как создать список аудитории с теми пользователями, которые, по прогнозам модели, будут конвертироваться:
WITH
T AS (
SELECT
*,
label AS actual_label,
[feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10] AS features,
[3.8235339279050287,
3.7348128191185244,
3.8422398227859471,
3.7854888232502479,
3.7373867156553713,
3.5676639605351026,
3.8196430517007811,
3.7346737628343032,
3.8393014063170749,
3.7873069939244743] AS weights
FROM
`PROJECT_NAME.DATASET_NAME.BIN_LOG_REG_TRAINING_SET`
WHERE
holdback),
P AS (
SELECT
*,
(
SELECT
IF
((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
FROM
T.features element1
WITH
OFFSET
pos
JOIN
T.weights element2
WITH
OFFSET
pos
USING
(pos) ) predicted_label,
features,
weights
FROM
T),
SELECT
user_id
FROM
P
WHERE
predicted_label = 1;