使用 AutoML Tables 预测客户生命周期价值

Last reviewed 2019-04-10 UTC

本文是由四篇文章组成的系列文章中的第四篇。该系列文章讨论如何使用 Google Cloud 上的 AI Platform 来预测客户生命周期价值 (CLV)。本文介绍了如何使用 AutoML 用于执行预测的表。

本系列文章包含以下内容:

本文中介绍的过程依赖于相同的数据处理步骤 请参阅 第 2 部分 本文介绍如何将该 BigQuery 数据集上传到 AutoML Tables 并创建模型。本文还将介绍如何将 AutoML 模型集成到第 3 篇文章所述的生产系统中。

用于实现此系统的代码位于与原始系列相同的 GitHub 代码库中。本文介绍如何使用该代码库中与 AutoML Tables 相关的代码。

AutoML Tables 的优势

在本系列的前几篇文章中,您学习了如何使用 TensorFlow 中实现的统计模型和 DNN 模型来预测 CLV。AutoML Tables 与其他两种方法相比具有多项优势:

  • 无需编码即可创建模型。这里有 控制台界面 可让您创建、训练、管理和部署数据集和模型。
  • 特征的添加或更改十分简便,在控制台界面即可直接完成。
  • 训练过程是自动进行的,包括超参数调节。
  • AutoML Tables 可以搜索最适合您的数据集的架构,您无需从众多可用选项中进行选择。
  • AutoML Tables 可以详细分析训练模型的性能,包括特征重要性。

因此,使用 AutoML Tables 开发和训练完全优化的模型可以缩短时间并节省费用。

AutoML Tables 解决方案的生产部署要求您使用 Python 客户端 API 来创建和部署模型并运行预测。本文介绍如何使用客户端 API 创建和训练 AutoML Tables 模型。如需了解如何使用 AutoML Tables 控制台执行这些步骤,请参阅 AutoML Tables 文档

安装代码

如果您尚未安装原始系列的代码,请按照原始系列第 2 篇文章所述的步骤安装代码。GitHub 代码库中的 README 文件介绍了准备环境、安装代码以及在项目中设置 AutoML Tables 所需的所有步骤。

如果您之前安装过代码,则需要执行以下附加步骤来完成本文中的安装事项:

  1. 在您的项目中启用 AutoML Tables API
  2. 激活您先前安装的 miniconda 环境。
  3. 安装 Python 客户端库 如 AutoML Tables 文档中所述。
  4. 创建并下载 API 密钥文件,并将其保存在已知位置,供日后用于客户端库。

运行代码

对于本文中的许多步骤,您可以运行 Python 命令。准备好环境并安装完代码后,您可以选择以下方式运行代码:

  • 在 Jupyter 笔记本中运行代码。在激活的 miniconda 环境中,通过终端窗口运行以下命令:

    $ (clv) jupyter notebook

    本文中每个步骤所对应的代码均位于 notebooks/clv_automl.ipynb 代码库的笔记本中。在 Jupyter 界面中打开此笔记本。然后,您便可以按照教程中的说明执行每个步骤。

  • 以 Python 脚本的形式运行代码。本教程的代码步骤位于 clv_automl/clv_automl.py 文件的代码库中。该脚本将命令行上的参数值作为可配置参数,例如项目 ID、API 密钥文件的位置、Google Cloud 区域和 BigQuery 数据集的名称。在激活的 miniconda 环境中,您通过终端窗口运行脚本,用您的 Google Cloud 项目名称替换 [YOUR_PROJECT]

    $ (clv) cd clv_automl
    $ (clv) python clv_automl.py --project_id [YOUR_PROJECT]

    如需获取参数和默认值的完整列表,请参阅脚本中的 create_parser 方法,或运行不带参数值的脚本以查看用法文档。

  • 按照 README 中的说明安装 Cloud Composer 环境后,执行 DAG 以运行代码,如后文运行 DAG 中所述。

准备数据

本文在 BigQuery 中使用原始系列的第 2 篇文章中所述的数据集和数据准备步骤。完成后 汇总数据 如该文章中所述,您可以创建一个数据集,以用于 AutoML Tables。

创建 AutoML Tables 数据集

首先,将您在 BigQuery 中准备的数据上传到 AutoML Tables 中。

  1. 如需初始化客户端,请将密钥文件名设置为您在安装步骤中下载的文件的名称:

    keyfile_name = "mykey.json"
    client = automl_v1beta1.AutoMlClient.from_service_account_file(keyfile_name)
    
  2. 创建数据集:

    create_dataset_response = client.create_dataset(
        location_path,
        {'display_name': dataset_display_name,
         'tables_dataset_metadata': {}})
    dataset_name = create_dataset_response.name
    

从 BigQuery 导入数据

创建数据集后,您可以从 BigQuery 导入数据。

  • 从 BigQuery 将数据导入 AutoML Tables 数据集:

    dataset_bq_input_uri = 'bq://{}.{}.{}'.format(args.project_id, args.bq_dataset, args.bq_table)
    input_config = {
        'bigquery_source': {
            'input_uri': dataset_bq_input_uri}}
    import_data_response = client.import_data(dataset_name, input_config)
    

训练模型

在为 CLV 数据创建 AutoML 数据集之后,您可以创建 AutoML Tables 模型。

  1. 获取数据集内每个 AutoML Tables 列的列规范:

    list_table_specs_response = client.list_table_specs(dataset_name)
    table_specs = [s for s in list_table_specs_response]
    table_spec_name = table_specs[0].name
    list_column_specs_response = client.list_column_specs(table_spec_name)
    column_specs = {s.display_name: s for s in list_column_specs_response}
    

    在后续步骤中,您必须提供列规范。

  2. 将其中一列指定为 AutoML Tables 模型的标签:

    TARGET_LABEL = 'target_monetary'
    ...
    label_column_name = TARGET_LABEL
    label_column_spec = column_specs[label_column_name]
    label_column_id = label_column_spec.name.rsplit('/', 1)[-1]
    update_dataset_dict = {
        'name': dataset_name,
        'tables_dataset_metadata': {
            'target_column_spec_id': label_column_id
        }
    }
    update_dataset_response = client.update_dataset(update_dataset_dict)
    

    此代码使用第 2 篇文章中 TensorFlow DNN 模型所用的标签列 (target_monetary)。

  3. 定义用于训练模型的特征:

    feat_list = list(column_specs.keys())
    feat_list.remove('target_monetary')
    feat_list.remove('customer_id')
    feat_list.remove('monetary_btyd')
    feat_list.remove('frequency_btyd')
    feat_list.remove('frequency_btyd_clipped')
    feat_list.remove('monetary_btyd_clipped')
    feat_list.remove('target_monetary_clipped')
    

    用于训练 AutoML Tables 模型的特征包括 用于训练 TensorFlow DNN 模型的 第 2 部分 原始系列中的其他内容但是,使用 AutoML Tables 在模型中添加或删减特征要容易得多。在 BigQuery 中创建好特征后,它会自动包含在模型中,除非您按照前面代码段中的说明将其显式删除。

  4. 定义用于创建模型的选项。建议对此数据集使用最大限度降低平均绝对误差的优化目标,由 MINIMIZE_MAE 参数表示。

    model_display_name = args.automl_model
    model_training_budget = args.training_budget * 1000
    model_dict = {
      'display_name': model_display_name,
      'dataset_id': dataset_name.rsplit('/', 1)[-1],
      'tables_model_metadata': {
          'target_column_spec': column_specs['target_monetary'],
          'input_feature_column_specs': [
              column_specs[x] for x in feat_list],
          'train_budget_milli_node_hours': model_training_budget,
          'optimization_objective': 'MINIMIZE_MAE'
      }
    }
    

    如需了解详细信息,请参阅有关优化目标的 AutoML Tables 文档。

  5. 创建模型并开始训练:

    create_model_response = client.create_model(location_path, model_dict)
    create_model_result = create_model_response.result()
    model_name = create_model_result.name
    

    客户端调用 (create_model_response) 的返回值将立即返回。值 create_model_response.result() 是一个 promise,在训练完成之后才会解除阻止。model_name 值是执行模型上其他客户端调用所必需的资源路径。

评估模型

模型训练完成后,您可以检索模型评估结果的统计信息。您可以使用 Google Cloud Console 或客户端 API。

  1. 如需使用控制台,请在 AutoML Tables 控制台中转到评估标签页:

    评估 AutoML Tables 控制台的标签页

  2. 如需使用客户端 API,请检索模型评估结果的统计信息:

    model_evaluations = [e for e in client.list_model_evaluations(model_name)]
    model_evaluation = model_evaluations[0]
    

    您将看到如下所示的输出:

    name: "projects/595920091534/locations/us-central1/models/TBL3912308662231629824/modelEvaluations/9140437057533851929"
    create_time {
      seconds: 1553108019
      nanos: 804478000
    }
    evaluated_example_count: 125
    regression_evaluation_metrics: {
      mean_absolute_error: 591.091
      root_mean_squared_error: 853.481
      mean_absolute_percentage_error: 21.47
      r_squared: 0.907
    }
    

与原始系列中使用的概率模型和 TensorFlow 模型相比,853.481 的均方根误差结果更优。但正如第 2 篇文章所述,建议您使用数据尝试提供的每种方法,看看哪种方法效果最佳。

部署 AutoML 模型

原始系列中的 Cloud Composer DAG 已进行了更新,加入了用于训练和预测的 AutoML Tables 模型。如需了解有关 Cloud Composer DAG 功能的一般信息,请参阅原始文章第 3 篇中的解决方案自动化部分

您可以按照 README 中的说明为此解决方案安装 Cloud Composer 编排系统。

更新后的 DAG 调用 clv_automl/clv_automl.py 脚本中的方法,用于复制之前为了创建模型并运行预测而显示的客户端代码调用。

训练 DAG

更新后用于训练的 DAG 包括创建 AutoML Tables 模型任务。下图显示了用于训练的新 DAG。

训练 DAG

预测 DAG

更新后用于预测的 DAG 包括使用 AutoML Tables 模型执行批量预测任务。下图显示了用于预测的新 DAG。

预测 DAG

运行 DAG

如需手动触发 DAG,您可以在以下位置运行命令: 运行 Dag 部分,或者使用 Google Cloud CLI 查看该文件。

  1. 如需运行 build_train_deploy DAG,请执行以下操作:

    gcloud composer environments run ${COMPOSER_NAME} \
        --project ${PROJECT} \
        --location ${REGION} \
        dags trigger \
        -- \
        build_train_deploy \
        --conf '{"model_type":"automl", "project":"'${PROJECT}'", "dataset":"'${DATASET_NAME}'", "threshold_date":"2011-08-08", "predict_end":"2011-12-12", "model_name":"automl_airflow", "model_version":"v1", "max_monetary":"15000"}'
    
  2. 运行 predict_serve DAG:

    gcloud composer environments run ${COMPOSER_NAME} \
        --project ${PROJECT} \
        --location ${REGION} \
        dags trigger \
        -- \
        predict_serve \
        --conf '{"model_name":"automl_airflow", "model_version":"v1", "dataset":"'${DATASET_NAME}'"}'
    

后续步骤