BigQuery ML


BQ ML 这款直白来说,就是让你在 BQ(BigQuery) 中,通过 SQL 语句来完成一些简单的机器学习任务。

其最大的特点就在于: 1)使用 SQL 2)内置了部分经典算法(甚至可以使用 Tensorflow) 3)BQ 速度很快 4)其他

你说这个有没有用呢,其实也有点,你要说多有用,其实也未必,说实在的,有学习这个的功夫,学一下 Python,也差不不了多少。

一般完成一个简单的 BQ ML 需要执行以下几个步骤:

1. 创建模型

示例代码:

#standardSQL
CREATE OR REPLACE MODEL `bqml_lab.sample_model`
OPTIONS(model_type='logistic_reg') AS
SELECT
  IF(totals.transactions IS NULL, 0, 1) AS label,
  IFNULL(device.operatingSystem, "") AS os,
  device.isMobile AS is_mobile,
  IFNULL(geoNetwork.country, "") AS country,
  IFNULL(totals.pageviews, 0) AS pageviews
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`
WHERE
  _TABLE_SUFFIX BETWEEN '20160801' AND '20170631'
LIMIT 100000;

这里,相当于创建了一个逻辑回归模型,logistic_reg ,还可以选择的例如 linear_reg 线性回归模型, KMEANSTENSORFLOW 等等。

需要了解全部可用模型,可参考: model option list

然后在 SELECT 中,其实可以理解为,默认情况下 label 对应的就是我们需要预测的 label 标签,而其他维度就是预测用的特征。

BQ ML 会自动对特征进行一定的处理(当然,也可以自己手动进行一下特征工程),以使其能够运用于模型计算(当然,复杂的特征就需要预先处理了,比如通过 Datapreb)

输入变量的自动变换,可参考:https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-create#input_variable_transformations

简单来说,就是对:

  • 数值型,进行标准环
  • 对于布尔型、字符型、日期型等等,使用独热编码(从 ML.WEIGHTS 中也可以看出),数组类型也相似,也是把唯一值,取出然后分类 等等

但是这块可以看到存在一些问题,比如有一个类别,以数字ID形式存储,那么如果我们不对其进行处理,那么 BQ ML 默认是会按数值型特征处理的,就标准化了,但是我们希望的是按离散特征,独热编码,所以这块实际使用中,就需要我们额外的进行处理了。

此外除了自动变换为,还有一个我们场景的特征工程问题,也就是缺失值的处理。

BQ ML 中 NULL 值被视为缺失的数据(也就是说 '' 不是),BQ ML 会根据列的类型来处理缺失值,例如:

  • 数值列会自动替换为中值
  • 独热/多热编码列,会被映射到额外类别(例如我们填充 Other) 等等。

如果你想选择某一列为所将使用的标签列,那也可以使用 input_label_cols ,此处可以参考以下官方提供的语法

{CREATE MODEL | CREATE MODEL IF NOT EXISTS | CREATE OR REPLACE MODEL}
model_name
[TRANSFORM (select_list)]
[OPTIONS(model_option_list)]
[AS query_statement]

model_option_list:
  MODEL_TYPE = { 'LINEAR_REG' | 'LOGISTIC_REG' | 'KMEANS' | 'TENSORFLOW' | 'MATRIX_FACTORIZATION' | 'AUTOML_REGRESSOR' | 'AUTOML_CLASSIFIER' | 'BOOSTED_TREE_CLASSIFIER' | 'BOOSTED_TREE_REGRESSOR' | 'DNN_CLASSIFIER' | 'DNN_REGRESSOR' }
  [, INPUT_LABEL_COLS = string_array ]
  [, OPTIMIZE_STRATEGY = { 'AUTO_STRATEGY' | 'BATCH_GRADIENT_DESCENT' | 'NORMAL_EQUATION' } ]
...

所以在 OPTIONS 中就行指定即可, 除了一些基本的配置项,model_option_list 中,其实还包含了众多,可以调节的超参数。

一般情况下,BQ ML 内置了默认值,以降低使用门槛,但如果你比较熟悉机器学习,那么就可以充分利用此部分配置来对模型进行调节。

2. 评估模型

评估模型的代码示例如下:

#standardSQL
SELECT
  *
FROM
  ml.EVALUATE(MODEL `bqml_lab.sample_model`, (
SELECT
  IF(totals.transactions IS NULL, 0, 1) AS label,
  IFNULL(device.operatingSystem, "") AS os,
  device.isMobile AS is_mobile,
  IFNULL(geoNetwork.country, "") AS country,
  IFNULL(totals.pageviews, 0) AS pageviews
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`
WHERE
  _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'));

可以看到,里面的核心就是 ml.EVALUATE,因为这是评估,所以提供的数据,其实相当于验证集,需要提供 label 和预测 label 进行比对,以衡量模型效果。

这里面就会自动计算出那些我们常用的指标,例如:

precision, recall
accuracy, f1_score
log_loss, roc_auc

如果是 linear_reg 则会有其他评价指标,例如:mean_squared_error (rmse)

可以直接通过 SELECT roc_auc, recall from ML.EVALUATE(XXX) 这种形式取出。

此外,还可以使用诸如 ML.WEIGHTS() 来获取模型的相关权重,权重这块,如果列是数值型,则其对应的权重则为数值型,但是如果输入的特征列是离散型,例如类别,那么 BQ ML 此处会自动完成分类。

此处通过 ML.WEIGHTS() 可以很容易的看到各个类别的权重。

3. 模型预测

模型训练完,那就得用起来了!这么 BQ ML 的使用也很简单,如下代码所示:

#standardSQL
SELECT
  country,
  SUM(predicted_label) as total_predicted_purchases
FROM
  ml.PREDICT(MODEL `bqml_lab.sample_model`, (
SELECT
  IFNULL(device.operatingSystem, "") AS os,
  device.isMobile AS is_mobile,
  IFNULL(totals.pageviews, 0) AS pageviews,
  IFNULL(geoNetwork.country, "") AS country
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`
WHERE
  _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'))
GROUP BY country
ORDER BY total_predicted_purchases DESC
LIMIT 10;

基本和评估没有太大区别,使用的是 ml.PREDICT 然后灌入的数据没有 label(因为 label 需要我们预测嘛!) 然后对预测结果进行计算就完了,就是正常的 SQL 语句了。