使用内置 XGBoost 算法进行训练

使用 AI Platform Training 中的内置算法进行训练时,您无需编写任何训练代码即可提交数据集并训练模型。本页面介绍了内置 XGBoost 算法的工作原理及使用方法。

概览

内置 XGBoost 算法是 XGBoost 算法的封装容器,可在 AI Platform Training 上兼容运行。

本文档介绍了在单个虚拟机副本上运行的算法版本。此算法还有一个分布式版本,该版本使用多个虚拟机进行训练,并且各虚拟机的使用方式略有不同。 该算法包含两个阶段:

  1. 预处理:AI Platform Training 会将分类数据和数值数据混合处理为一个纯数值数据集,以便为使用 XGBoost 进行训练做好准备。
  2. 训练:AI Platform Training 会根据您提供的数据集和模型参数,使用 XGBoost 算法执行训练。目前的实现基于 XGBoost 0.81 版本。

限制

使用内置 XGBoost 算法的单副本版本进行训练时,您无法使用以下功能

支持的机器类型

以下是系统支持的 AI Platform Training 容量层级和机器类型

设置输入数据的格式

XGBoost 基于数值表格数据运行。数据集的每一行表示一个实例,数据集的每一列表示一个特征值。目标列表示您要预测的值

准备 CSV 文件

您的输入数据必须是采用 UTF-8 编码的 CSV 文件。如果您的训练数据仅包含分类值和数值,则可以使用我们的预处理模块将分类数据转换为数值数据。或者,您可以在不启用自动预处理的情况下运行训练。

准备的输入 CSV 文件必须满足以下要求:

  • 移除标题行。标题行包含每列的标签。移除标题行,避免将其作为训练数据的一部分与其余数据实例一起提交。
  • 确保目标列为第一列。目标列包含您尝试预测的值。对于分类算法,目标列中的所有值均为类或类别。对于回归算法,目标列中的所有值均为数值。

处理整数值

整数值的含义可能不明确,这会导致整数值的列在自动预处理过程中成为问题。AI Platform Training 会自动确定如何处理整数值。默认情况下:

  • 如果每个整数值都是唯一的,则该列会被视为实例键。
  • 如果只有几个唯一的整数值,则该列会被视为分类列。
  • 否则,该列中的值将转换为浮点数并被视为数值。

要覆盖这些默认判定,请执行以下操作:

  • 如果数据应被视为数值,请将列中的所有整数值转换为浮点数,例如,{101.0, 102.0, 103.0}
  • 如果数据应被视为分类,请在列中所有整数值的前面加上非数值前缀,例如,{code_101, code_102, code_103}

归一化目标值以便回归

对于回归训练作业,请确保对目标值进行归一化,使每个值介于 0 和 1 之间。

检查 Cloud Storage 存储桶权限

要存储数据,请使用用于运行 AI Platform Training 作业的同一 Google Cloud 项目中的 Cloud Storage 存储桶。否则,需要向 AI Platform Training 授予对存储数据的 Cloud Storage 存储桶的访问权限

提交 XGBoost 训练作业

本部分介绍如何提交内置 XGBoost 训练作业。

您可以在 Google Cloud 控制台中找到每个超参数的简要说明,还可以在内置 XGBoost 算法参考文档中查看更全面的说明。

控制台

  1. 转到 Google Cloud 控制台中的 AI Platform Training“作业”页面:

    AI Platform Training“作业”页面

  2. 点击新建训练作业按钮。从下方显示的选项中,点击内置算法训练

  3. 创建新的训练作业页面上,选择内置 XGBoost (Built-in XGBoost),然后点击下一步

  4. 如需详细了解所有可用的参数,请点击 Google Cloud 控制台中的链接,并参阅内置 XGBoost 参考文档,以了解详情。

gcloud

  1. 为您的作业设置环境变量,用您的项目的相应值替代 [VALUES-IN-BRACKETS] 内的值:

    # Specify the name of the Cloud Storage bucket where you want your
    # training outputs to be stored, and the Docker container for
    # your built-in algorithm selection.
    BUCKET_NAME='[YOUR-BUCKET-NAME]'
    IMAGE_URI='gcr.io/cloud-ml-algos/boosted_trees:latest'
    
    # Specify the Cloud Storage path to your training input data.
    TRAINING_DATA='gs://[YOUR_BUCKET_NAME]/[YOUR_FILE_NAME].csv'
    
    DATASET_NAME='census'
    ALGORITHM='xgboost'
    MODEL_TYPE='classification'
    
    DATE='date '+%Y%m%d_%H%M%S''
    MODEL_NAME="${DATASET_NAME}_${ALGORITHM}_${MODEL_TYPE}"
    JOB_ID="${MODEL_NAME}_${DATE}"
    
    JOB_DIR="gs://${BUCKET_NAME}/algorithm_training/${MODEL_NAME}/${DATE}"
    
  2. 使用 gcloud ai-platform jobs training submit 提交训练作业:

    gcloud ai-platform jobs submit training $JOB_ID \
       --master-image-uri=$IMAGE_URI --scale-tier=BASIC --job-dir=$JOB_DIR \
       -- \
       --preprocess --objective=binary:logistic \
       --training_data_path=$TRAINING_DATA
    
  3. 使用 gcloud 查看日志,从而监控训练作业的状态。请参阅 gcloud ai-platform jobs describegcloud ai-platform jobs stream-logs

    gcloud ai-platform jobs describe ${JOB_ID}
    gcloud ai-platform jobs stream-logs ${JOB_ID}
    

预处理的工作原理

自动预处理适用于分类数据和数值数据。预处理例程先分析您的数据,然后再转换数据

分析

首先,AI Platform Training 会自动检测每个列的数据类型、确定应如何处理每一列,并计算该列中数据的部分统计信息。此类信息将捕获到 metadata.json 文件中。

AI Platform Training 会分析目标列的类型,以此确定特定数据集是用于回归还是分类。如果此分析与您对 objective 的选择冲突,则会导致错误。通过在不确定的情况下清楚地设置数据格式,明确应如何处理目标列。

  • 类型:列可以是数值列,也可以是分类列

  • 处理方式:AI Platform Training 会根据如下原则确定如何处理每个列:

    • 如果列在所有行中包含单个值,则将其视为常量
    • 如果列是分类列,并且所有行中都包含唯一值,则将其视为 row_identifier
    • 如果列是带有浮点值的数值列,或者该列是带整数值的数值列且包含许多唯一值,则将该列视为数值
    • 如果列是带有整数值的数值列,并且包含的唯一值非常少,则将该列视为分类列,其中整数值是身份词汇
      • 如果列中唯一值的数量小于输入数据集中行数的 20%,则认为该列具有很少的唯一值
    • 如果列是具有高基数的分类列,则对该列进行哈希处理,其中哈希分区数等于列中唯一值数量的平方根。
      • 如果唯一值的数量大于数据集中行数的平方根,则认为该分类列具有高基数
    • 如果列是分类列,并且唯一值的数量小于或等于数据集行数的平方根,则将该列视为包含词汇的普通分类列。
  • 统计信息:AI Platform Training 会根据已确定的列类型和处理方式计算以下统计信息,以便在后续阶段中用于转换列。

    • 如果列是数值列,则计算均值和方差值。
    • 如果列是分类列,并且处理方式是身份或词汇,则从列中提取不同的值。
    • 如果列是分类列,并且处理方式是哈希技术,则按照列的基数计算哈希分区的数量。

转换

完成数据集的初始分析后,AI Platform Training 会根据应用于数据集的类型、处理方式和统计信息来转换您的数据。AI Platform Training 会按以下顺序执行转换:

  1. 将训练数据集拆分为验证数据集和测试数据集(如果您以百分比的方式指定要在两者中使用的训练数据量)。
  2. 移除特征缺失达 10% 以上的行。
  3. 填写缺失值。均值用于数值列,零用于分类列。请参阅下面的示例。

  4. 对于使用词汇身份处理方式的每个分类列,AI Platform Training 会对列值执行独热编码。请参阅下面的示例。

  5. 对于使用哈希处理方式的每个分类列,AI Platform Training 会使用 scikit-learn 的 FeatureHasher 进行特征哈希处理。之前计算的特征数决定了哈希桶的数量。

  6. 指定了 row_key常量处理方式的每一列都会被删除。

转换示例

超过 10% 的值缺失的行会被删除。在以下示例中,假设该行具有 10 个值。为简单起见,每个示例行都经过精简。

行问题 原始值 转换后的值 说明
没有缺失值的示例行 [3, 0.45, ...,
'fruits', 0, 1]
[3, 0.45, ...,
1, 0, 0, 0, 1]
'fruits' 字符串在独热编码中转换为“1, 0, 0”值。
缺失值过多 [3, 0.45, ...,
'fruits', __, __]
行已移除 行中超过 10% 的值缺失。
缺少数值 [3, 0.45, ...,
'fruits', 0, __]
[3, 0.45, ...,
1, 0, 0, 0, 0.54]
  • 该列的平均值替换了缺失的数值。在本示例中,平均值是 0.54。
  • 'fruits' 字符串在独热编码中转换为“1, 0, 0”值。
缺少分类值 [3, 0.45, ...,
__, 0, 1]
[3, 0.45, ...,
0, 0, 0, 0, 1]
  • 缺失的分类值在独热编码中转换为值“0, 0, 0”。

自动预处理完成后,AI Platform Training 会将处理后的数据集上传回 Cloud Storage 存储桶,并存放在您在作业请求内指定的目录中。

后续步骤