Open4

BigQuery ML に関するメモ

畳屋民也畳屋民也

BQML の XGBoost で特定のカラムの値を元にデータを split する方法

https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-create-boosted-tree#data_split_method

直接指定する場合

DATA_SPLIT_METHOD="CUSTOM" を指定し、さらに DATA_SPLIT_COL で分割時に参照するカラム名を指定する。

DATA_SPLIT_COL の内容は、

  • True or NULL: evaluation(評価データ)
  • False: training (訓練データ)

カラムの値をソートして上からX%のような指定をする場合

DATA_SPLIT_METHOD="SEQ"としたうえで DATA_SPLIT_COL でソートしたいカラムを指定し、さらに DATA_SPLIT_EVAL_FRACTIONで evaluation として使う割合を指定する。

  • DATA_SPLIT_EVAL_FRACTION の値が大きい方から上位 DATA_SPLIT_EVAL_FRACTION の割合 → evaluation (評価データ)
  • 小さい側の 1-DATA_SPLIT_EVAL_FRACTION → training(訓練データ)
畳屋民也畳屋民也

BQML で ハイパーパラメータチューニング

https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-hyperparameter-tuning

基本的な使い方

基本的には、普通のモデル構築方法と同じように記述する。

違うところは、

  • NUM_TRIALS に試行回数を指定
    • 必須オプション。これの有無で、チューニングするかしないかが切り替わる。
    • MAX は 100
  • チューニングしたいパラメータは範囲・選択肢を指定
    • 数値データの例: l1_reg=hparam_range(0, 10)
    • カテゴリカルデータの例: booster_type=hparam_candidates(['dart', 'gbtree'])
  • チューニングの設定を加える
    • チューニングアルゴリズム HPARAM_TUNING_ALGORITHM
    • Tuning objective とする指標
    • データ分割方法
    • など

データ分割方法

training, evaluation, test に分ける。
デフォルトでは、80:10:10になるように分割する。

指定の仕方はTuning しない場合と同じようで微妙に異なるため、注意が必要。

特に、DATA_SPLIT_METHOD="CUSTOM" を指定した場合は厄介。
DATA_SPLIT_COLでデータ分割時に参照するカラム名を入れられるものの、
そこで指定したカラムに入れるべき値が通常の学習のみの場合と異なっている:

  • 学習のみの場合 ... BOOL (FALSE が学習データ、TRUE が評価データ)
  • パラメータチューニングも行う場合 ... STRING ("TRAIN": 学習データ、"EVAL": 評価データ、"TEST": テストデータ)
畳屋民也畳屋民也

モデル説明(SHAP)

https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-explain-predict

ML.EXPLAIN_PREDICT を用いることで、予測結果とともに予測根拠として「どの特徴量が寄与しているか」を取得できる。

寄与の算出に用いられる手法はモデルのアルゴリズムに依るが、XGBoost では SHAP (Tree SHAP) が用いられる。
https://cloud.google.com/bigquery/docs/xai-overview#explainable-ai-offerings

寄与度の取得方法

WITH
  explained AS (
  SELECT
    *
  FROM
    ML.EXPLAIN_PREDICT(MODEL `<project_id>.<dataset_name>.<model_name>`,
      (
      SELECT
        *
      FROM
        `<project_id>.<dataset_name>.<table_name_of_prediction_data>`),
      STRUCT(1 AS top_k_features, -- 上位何番目までの特徴量を見るか?(default は5, attributionの絶対値でsort)
        0 AS threshold -- 分類モデルの場合、予測スコア(probability)の閾値を指定する。
        )) )
  SELECT
    * EXCEPT(top_feature_attributions)
  FROM
    explained,
    UNNEST(top_feature_attributions) AS tfa) -- STRUCT だと扱いづらいので、行単位にバラす