XGBoost 組み込みアルゴリズムを使用したトレーニング

AI Platform Training での組み込みアルゴリズムを使用したトレーニングでは、データセットを送信し、トレーニング コードを一切作成せずに、モデルをトレーニングできます。このページでは、XGBoost 組み込みアルゴリズムの仕組みとその使用方法について説明します。

概要

XGBoost 組み込みアルゴリズムは、AI Platform Training 上で実行できる互換性を備えた XGBoost アルゴリズムのラッパーです。

このドキュメントでは、単一の仮想マシンレプリカで実行されるアルゴリズムのバージョンについて説明します。また、このアルゴリズムの分散バージョンもあります。このバージョンはトレーニングに複数の仮想マシンを使用するもので、少し異なる使い方をする必要があります。このアルゴリズムには次の 2 つのフェーズがあります。

  1. 前処理: XGBoost によるトレーニングで使用できるよう、AI Platform Training がカテゴリデータと数値データの混在を処理し、数値データセットのみにします。
  2. トレーニング: ユーザーのデータセットとユーザーが指定したモデル パラメータに基づき、XGBoost アルゴリズムを使用したトレーニングが AI Platform Training によって実施されます。現在の実装は XGBoost の 0.81 バージョンに基づいています。

制限事項

次の機能は、XGBoost 組み込みアルゴリズムの単一レプリカ バージョンを使用したトレーニングではサポートされていません。

サポートされているマシンタイプ

次の AI Platform Training スケール階層とマシンタイプがサポートされています。

入力データのフォーマット

XGBoost は表形式の数値データを扱います。データセットでは、各行が 1 つのインスタンスを表し、各列が特徴値を表します。ターゲット列は予測対象の値を表します。

CSV ファイルを準備する

入力データは UTF-8 でエンコードされた CSV ファイルでなければなりません。トレーニング データがカテゴリ値と数値のみで構成されている場合は、前処理モジュールを使用してカテゴリデータを数値データに変換できます。それ以外の場合は、自動前処理を有効にせずにトレーニングを実施できます。

入力 CSV ファイルを準備する際、以下の要件を守ってください。

  • ヘッダー行を削除する。ヘッダー行には各列のラベルが含まれています。ヘッダー行がトレーニング データの一部として残りのデータ インスタンスと一緒に送信されないようにするため、ヘッダー行を削除します。
  • 1 列目をターゲット列にする。ターゲット列に予測対象の値が含まれています。分類アルゴリズムの場合、ターゲット列の値はすべてクラスまたはカテゴリにします。回帰アルゴリズムの場合、ターゲット列の値はすべて数値にします。

整数値を処理する

整数値の意味があいまいになると、自動前処理で整数値の列に問題が生じることがあります。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 バケットを使用します。それ以外の場合は、データが保存されている Cloud Storage バケットへのアクセス権を AI Platform Training に付与します。

XGBoost トレーニング ジョブの送信

このセクションでは、XGBoost 組み込みトレーニング ジョブを送信する方法について説明します。

各ハイパーパラメータの簡単な説明については、Google Cloud Console 内で確認できます。より包括的な説明については、XGBoost 組み込みアルゴリズムのリファレンスをご覧ください。

Console

  1. Google Cloud コンソールで AI Platform Training の [ジョブ] ページに移動します。

    AI Platform Training の [ジョブ] ページ

  2. [新規トレーニング ジョブ] ボタンをクリックします。下に表示されたオプションから、[組み込みアルゴリズムによるトレーニング] をクリックします。

  3. [新しいトレーニング ジョブの作成] ページで [XGBoost] を選択して [次へ] をクリックします。

  4. 使用可能なすべてのパラメータの詳細については、Google Cloud Console 内のリンクをたどって、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 ファイルに取り込まれます。

次に、ターゲット列の型を分析して、指定されたデータセットが回帰用か分類用かを識別します。この分析が objective の設定値と矛盾するとエラーになります。あいまいな場合はデータを明確にフォーマットすることで、ターゲット列をどのように扱うべきかを明示してください。

  • 型: 列は数値とカテゴリのどちらかになります。

  • 扱い方: AI Platform Training は、各列の扱い方を次のように識別します。

    • すべての行に単一の値が含まれる列は、定数として扱われます。
    • 列がカテゴリ型で、すべての行に一意の値が含まれている場合は、行識別子として扱われます。
    • 列が浮動小数点の数値型である場合、または整数の数値型で多数の一意の値が含まれる場合、その列は数値として扱われます。
    • 列が整数値の数値型で、一意の値の数が十分でない場合、その列は整数値が ID または語彙を表すカテゴリ列として扱われます。
      • 列にある「一意の値の数が十分でない」とみなされるのは、列に含まれる一意の値の数が入力データセットの行数の 20% 未満の場合です
    • 列がカーディナリティの高いカテゴリ型である場合、その列はハッシュとして扱われます。ハッシュ バケットの数は、列にある一意の値の数の平方根と等しくなります。
      • カテゴリ列の「カーディナリティが高い」とみなされるのは、列に含まれる一意の値の数がデータセットの行数の平方根より多い場合です
    • 列がカテゴリ型で、一意の値の数がデータセットの行数の平方根以下である場合、その列は、語彙を表す通常のカテゴリ列として扱われます。
  • 統計情報: 識別された列の型と扱い方に基づいて、後の段階で列を変換するために使用される以下の統計情報が計算されます。

    • 列が数値型の場合、平均値と分散値が計算されます。
    • 列がカテゴリ型で、ID または語彙として扱われる場合は、列から一意の値が抽出されます。
    • 列がカテゴリ型で、ハッシュとして扱われる場合は、列のカーディナリティに基づくハッシュ バケットの数が計算されます。

変換

データセットの初期分析が完了すると、データセットに適用された型、扱い方、統計情報に基づいてデータが変換されます。変換は以下の順に行われます。

  1. トレーニング データセットのうち、検証データセットとテスト データセットそれぞれに使用するデータ量(パーセンテージ)が指定されている場合は、トレーニング データセットを検証データとテストデータに分割します。
  2. 特徴の欠損が 10% を超える行を削除します。
  3. 欠損値を埋めます。数値列には列の値の平均値、カテゴリ列にはゼロをそれぞれ使用します。以下の例をご覧ください。

  4. 語彙ID として扱うカテゴリ列の値に対し、ワンホット エンコードを適用します。以下の例をご覧ください。

  5. ハッシュとして扱う各カテゴリ列に対し、AI Platform トレーニングは scikit-learn の FeatureHasher を使用して特徴のハッシュ処理を行います。先にカウントした特徴の数で、ハッシュ バケットの数が決まります。

  6. row_keyまたは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 バケット内のディレクトリにアップロードします。

次のステップ