简介
数据科学家和工程师在处理大型数据集时经常面临挑战,特别是在训练机器学习模型时。BigQuery ML是谷歌云提供的一个强大的工具集,允许用户直接在BigQuery中训练和提供机器学习模型。
BigQuery ML的优势
BigQuery ML提供了几个优势,包括:
- 无需将数据读入本地内存,允许你用大型数据集训练模型
- 使用SQL,实现团队成员之间的无缝协作
- 立即为预测训练的模型提供服务,减少对额外部署步骤的需求
教程概述
在本教程中,我们将了解以下过程:
- 在BigQuery中设置和创建一个数据集
- 使用
CREATE OR MODEL语句创建一个二元逻辑回归模型 - 使用
ML.EVALUATE函数评估该模型 - 使用
ML.PREDICT函数进行预测
最后,在最后一节,我们将看到如何通过改变模型和参数以使用XGBoost来改善我们的结果。
设置和创建你的数据集
本文展示了一个真实的例子,说明BigQuery ML如何帮助你使用Google Analytics样本数据集建立二元逻辑回归模型,预测网站访客是否会进行交易。
要开始使用,你需要创建一个BigQuery数据集来存储你的ML模型。按照逐步说明,在谷歌云控制台创建一个新的数据集。
数据集 "ga_sessions_20170801 "的预览
创建一个模型
接下来,你将创建一个用于分类的逻辑回归模型。在一个新的查询标签中,我们使用CREATE MODEL 语句来定义模型,选择特征,并指定用于训练的表的范围。
在这种情况下,该模型使用设备操作系统os ,是否是移动设备is_mobile ,country ,以及pageviews 的数量的信息来预测交易。
CREATE OR REPLACE MODEL `bqml_tutorial.sample_model`OPTIONS(model_type='logistic_reg') ASSELECT 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 pageviewsFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`WHERE _TABLE_SUFFIX BETWEEN '20160801' AND '20170630'
这个查询大约需要3分钟的时间来运行。
我们在这里看到,我们使用了CREATE OR REPLACE MODEL 语句来定义模型,这将创建一个模型,如果它不存在,或者它将用一个新的模型替换现有的模型,如果一个具有相同名称的模型已经被创建。
在BigQuery控制台,在你的bqml_tutorial 表中,你现在可以看到一个名为Models (1) 的新部分,你的模型已经被存储在那里。一些图表被自动创建,以观察训练的细节。
评估模型
在机器学习中,分类器指的是预先确定的分配给标签的目标值列表。在本教程中,采用二进制分类模型来识别交易,标签列由两个类别组成:
- 0:表示没有交易
- 1:表示有交易发生
为了评估你的模型的性能,使用ML.EVALUATE函数。
# Use the same data used for the model creationSELECT *FROM ML.EVALUATE(MODEL `bqml_tutorial.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 pageviewsFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`WHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'))
评估查询几乎是即时运行的,你会得到以下指标:
sample_model的评估指标
如果你运行了一个逻辑回归,你会在结果中看到几列,包括:
- 精度:一个分类模型指标,衡量正确的正面预测的频率。
- 召回率:一个分类模型指标,衡量在所有可能的标签中,正确识别的正面标签的比例。
- 准确率:分类模型做出的正确预测的比例。
- F1得分:衡量模型准确性的指标,是精度和召回率的谐波平均值,满分是1,最差是0。
- 对数损失:逻辑回归损失函数,衡量模型的预测和正确标签之间的差异。
- ROC AUC:ROC曲线下的面积表示分类器对随机选择的正面例子比随机选择的负面例子更有信心的概率。
用你的模型预测结果
在对模型进行评估后,你现在可以使用ML.PREDICT 功能来进行预测。
每个国家的购买量
让我们用它来预测各国的交易数量和每个用户的购买量。
# Here we GROUP BY country to have the results for each countrySELECT country, SUM(predicted_label) as total_predicted_purchasesFROM ML.PREDICT(MODEL `bqml_tutorial.sample_model`, (SELECT IFNULL(device.operatingSystem, "") AS os, device.isMobile AS is_mobile, IFNULL(totals.pageviews, 0) AS pageviews, IFNULL(geoNetwork.country, "") AS countryFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`WHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'))GROUP BY country# Rank the output with the most predicted purchases countriesORDER BY total_predicted_purchases DESC# Limit the output to the top 10 countriesLIMIT 10
预测查询在1秒内运行,我们得到以下输出:
表中列出了预测购买量最大的前10个国家
每个用户的购买量
在这种情况下,我们的任务是预测一个网站的每个访问者将进行的交易数量。
该查询与之前的查询非常相似,除了GROUP BY 子句外,结果将根据访客IDfullVisitorId 进行分组。
# Here we GROUP BY fullVisitorId to have the results per userSELECT fullVisitorId, SUM(predicted_label) as total_predicted_purchasesFROM ML.PREDICT(MODEL `bqml_tutorial.sample_model`, (SELECT IFNULL(device.operatingSystem, "") AS os, device.isMobile AS is_mobile, IFNULL(totals.pageviews, 0) AS pageviews, IFNULL(geoNetwork.country, "") AS country, fullVisitorIdFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`WHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'))GROUP BY fullVisitorId# Rank the output with the most predicted purchases usersORDER BY total_predicted_purchases DESC# Limit the output to the top 10 usersLIMIT 10
下面是BigQuery的输出:
预测购买量最大的前10个用户的表格
用XGBoost改进结果
BigQuery ML在支持的模型类型方面有一个限制。下面是到目前为止一些内置模型的列表:
- 线性回归(
LINEAR_REG) 用于预测一个连续变量的值 - Logistic回归(
LOGISTIC_REG) 用于对观察值进行分类 - K-means(
KMEANS) 用于识别类别 - XGBoost(
BOOSTED_TREE_CLASSIFIER) 是一个分布式梯度提升库,在梯度提升框架下实现机器学习算法。
让我们尝试使用XGBoost来改善我们之前的表现。我建议使用以下选项BOOSTED_TREE_CLASSIFIER :
- L2_reg = 0.1
- num_parallel_tree = 8
- max_tree_depth = 10
CREATE OR REPLACE MODEL `bqml_tutorial.sample_model_2`OPTIONS( model_type='BOOSTED_TREE_CLASSIFIER' , l2_reg = 0.1, num_parallel_tree = 8, max_tree_depth = 10) ASSELECT 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 pageviewsFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`WHERE _TABLE_SUFFIX BETWEEN '20160801' AND '20170630'
创建一个XGBoost模型比一个简单的线性回归模型需要更长的时间(大约9分钟)。现在让我们评估一下我们的模型,看看我们的表现如何:
SELECT *FROM ML.EVALUATE(MODEL `bqml_tutorial.sample_model_2`, (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 pageviewsFROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`WHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'))
正如我们在下面的表格中看到的那样,结果略有改善。绿色的矩形(第1行)是XGBoost的结果:精度、准确度和roc_auc都有所提高,而且log_loss更小。
结论
BigQuery ML是加速机器学习工作流程的优秀工具,特别是在处理大型数据集时。通过学习本教程,你将获得使用 BigQuery ML 创建、评估和部署 ML 模型的实践经验。
试一试,看看它如何能简化你的ML项目,并加强团队内部的协作。