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

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

概要

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

このアルゴリズムには次の 2 つのフェーズがあります。

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

制限事項

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

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

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

入力データを整形する

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

CSV ファイルを準備する

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

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

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

整数値を処理する

一意の値の数が十分でない場合、整数値の列はデフォルトでカテゴリ列として解釈されます。たとえば、データセットの列に {101, 102, 103} のような整数値が含まれる場合、AI Platform はこれらの値を {'high', 'medium', 'low'} のようなカテゴリとして解釈します。

このような誤った解釈がされないようにするため、データを数値として与える場合は必ず整数を浮動小数点数に変換してください。つまり、前の例では {101.0, 102.0, 103.0} にします。整数がカテゴリとして解釈されるようにするには、各値の前後に文字列を追加します(例: {code_101, code_102, code_103})。

回帰を目的としたターゲット値の正規化

回帰トレーニング ジョブでは、ターゲット値を必ず正規化して、各値が 0 から 1 の範囲に収まるようにします。

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

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

Google Cloud Platform Console には各ハイパーパラメータの簡単な説明があるほか、XGBoost 組み込みアルゴリズムのリファレンスには、その詳しい説明があります。

Console

  1. Google Cloud Platform Console で AI Platform のジョブページに移動します。

    AI Platform の [ジョブ] ページ

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

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

  4. 使用可能なすべてのパラメータの詳細については、Google Cloud Platform 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 は各列のデータ型を自動的に検出し、各列をどのように扱うべきかを判断して、列のデータの統計情報を計算します。この情報は、metadata.json ファイルに取り込まれます。

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

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

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

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

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

変換

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

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

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

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

  6. 行キーまたは定数として扱う列を削除します。

変換の例

欠損値が 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 は処理済みのデータセットを、ジョブ リクエストで指定した Cloud Storage バケット内のディレクトリにアップロードします。

次のステップ