广告数据中心内的回归建模

线性回归和逻辑回归都是机器学习模型,可让您根据广告数据生成有意义的预测。

  • 线性回归模型会创建一个函数来将一条线与数据进行拟合,从而最大限度缩短数据点与这条线之间的距离。然后,您可以使用此模型来根据输入的数据对数值进行预测,例如根据购买记录、过往互动等预测用户的生命周期价值。
  • 逻辑回归模型用于预测性分类问题。根据您提供的变量数量,此模型可分为以下两种类型:
    • 二元逻辑回归模型可回答是非问题,例如转化事件发生的可能性。
    • 多类别逻辑回归模型用于预测多个可能的值,例如确定客户是“低价值”“中等价值”还是“高价值”客户。

线性回归模型和逻辑回归模型均通过训练数据(在本例中为您的广告数据)进行学习,让您能够运用预测模型来做出广告决策。一般来说,提供更多数据并确保提供优质数据有助于提高模型的准确性。如果提供紧密聚类训练数据,这两种模型的效果都会更好。

差分隐私

线性回归模型和逻辑回归模型均使用差分隐私,这种隐私权检查系统不同于广告数据中心内其他操作所使用的系统。差分隐私会在训练过程中向结果注入干扰数据,从而保障最终用户的隐私。这种干扰级别会保持适中,既能保证最终结果仍然有用,又能确保最终用户的身份不会被识别出来。此外,干扰级别是不确定的,因此结果中出现的干扰级别也不一致,从而进一步保障最终用户的隐私。

查询限制

使用默认 EPSILON_PER_MODEL 时,每个“数据日”最多只能运行 100 次线性和逻辑回归建模查询。数据日是指在指定日期生成的事件。这些事件对应于您在运行查询时提供的开始日期和结束日期,以及在创建查询所用的任何表(例如用于训练的临时表)时使用的开始日期和结束日期。也就是说,1 天的数据最多可用于 100 个模型。如果您选择指定大于默认值的 EPSILON_PER_MODEL 值,则可以创建较少的模型,但模型质量较高。如果您选择较小的 EPSILON_PER_MODEL 值,则可以训练更多模型,但模型的质量会较低。

运作方式

工作流程遵循以下基本步骤:

  1. 准备训练数据。
  2. 创建模型。
  3. 从模型中收集数据洞见。

准备训练数据

如上所述,使用规模较大的优质数据集通常可以带来更加出色的成效。此外,由于输入的数据使用最小-最大缩放比例进行缩放,因此稀疏聚类数据或具有显著离群值的数据可能会因平均值改变而对模型产生不利影响。

默认情况下,广告数据中心会随机选择 18% 的训练数据进行验证。用于验证的数据的百分比可通过 data_split_eval_fraction 选项进行控制。

创建模型

指定用于训练模型的参数和输入数据。

最佳实践

训练集的大小是影响模型质量的最重要因素之一。不过,大小/质量方面的权衡取舍会因具体问题和下列因素而异。欢迎与我们分享您的使用体验。* 我们发现,如果逻辑回归模型基于包含至少 100,000 位用户的训练集构建而成,准确率会大于 0.70。* 我们发现,如果线性回归模型基于包含至少 800,000 位用户的训练集构建而成,r 平方值会大于 0.70。

此外,还有其他因素可能会降低模型质量。* 逻辑模型中一个类别的代表性远高于其他类别。具体而言,如果一个标签包含的训练集用户不多,则使用包含大量训练集用户的其他标签对于提高模型在用户数较少的标签上的准确率可能没有太大帮助。例如,与训练集用户数分别为 10,000 和 2,000 的两个标签相比,训练集用户数分别为 20,000 和 1,000 的两个标签的准确率更低。* 没有为标签提供明确信号的特征数据。* 需要进行更广泛的特征工程的原始数据。例如,某些字段可能包含大量可能的值。改进此类数据的一种方法就是,将值转换为类别(或存储桶)较少的特征。

收集数据洞见

您可以调用函数来评估模型在验证数据方面的效果、查看特征和迭代训练相关信息(例如预测期间模型使用的基础权重),以及对未知数据进行预测。

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_regwarm_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

(可选,仅限逻辑回归)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 可以是小于 ln(3) 的任意正 64 位浮点数,约为 1.0986。默认值为 ln(3)/10。

automatic_input_scaling

(可选)如果为 TRUE,所有数值特征列都将自动应用 min_max_scaling,就像在 min_max_scaled_cols 选项中明确指明列名称一样(standard_scaled_colsquantile_bucketized_cols 选项中已明确指明的所有列除外)。

参数

bool_valueBOOL,默认值为 TRUE

min_max_scaled_cols

(可选)调整每个指定的 numerical_expression 特征列(范围为 0 到 1),并且所有行均具有 MINMAX。系统会在预测中自动使用相同的 MINMAX。如果预测数据不在 MINMAX 的范围内,则其极限值为 0 或 1。

参数

string_value 的数组,其中每个 string_value 都是一个 STRING,表示要转换的列名称。

standard_scaled_cols

(可选)对所有行中指定的 numerical_expression 特征列进行标准化。系统会在预测中自动使用为标准化表达式计算的 STDDEVMEAN

参数

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 派生而来。
  • 每一行都必须只代表一位唯一身份用户。一行不能代表多位用户的数据。进行某些联接(例如交叉联接)时可能会发生这种情况。
  • 任何用户都不能出现在两个不同的行中。
  • 出于隐私保护方面的考虑,仅语法部分中所述的选项可供使用。目前不支持 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 获取的结果需要接受与广告数据中心内其他结果相同的隐私权检查。详细了解隐私权检查

线性回归

/* 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 示例表来演示如何创建模型。

内部 select 中的训练数据(线性)

以下示例根据出生体重、性别、妊娠周数、母亲年龄和母亲种族来预测婴儿的出生体重。

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

内部 select 中的训练数据(逻辑)

以下示例根据出生体重、性别、妊娠周数、母亲年龄和母亲种族来预测婴儿的性别。

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,即使无权访问模型本身也是如此。如需了解具体方法,请参阅受众群体激活的回归建模 Codelab