Open4
BigQuery ML に関するメモ
BQML の XGBoost で特定のカラムの値を元にデータを split する方法
直接指定する場合
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 で ハイパーパラメータチューニング
基本的な使い方
基本的には、普通のモデル構築方法と同じように記述する。
違うところは、
-
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)
ML.EXPLAIN_PREDICT
を用いることで、予測結果とともに予測根拠として「どの特徴量が寄与しているか」を取得できる。
寄与の算出に用いられる手法はモデルのアルゴリズムに依るが、XGBoost では SHAP (Tree SHAP) が用いられる。
寄与度の取得方法
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 だと扱いづらいので、行単位にバラす
作成したモデルのコピー
Console からはできない(2023/06/19時点)ので、Cloud Shell を立ち上げて bq コマンドを用いて行うのが簡単。