BigQuery MLで手軽に機械学習モデルを作成!データ処理、モデル作成から予測まで

BigQueryML_KV

ビジネスの現場ではデータを収集し、それをBigQueryなどのデータウェアハウスに保存していることがあると思います。

BigQueryにはBigQuery MLという、保存されているデータに対してSQLクエリで機械学習モデルの作成、評価、予測を行える機能が備わっています。BigQuery MLを使えば、自前でインフラ構築をする必要が無く、TensorflowやPytorchなどのライブラリを学習する必要が無いため、機械学習モデルの作成を容易に始めることができます。

選択できるモデルには線形回帰、ロジスティック回帰のようなシンプルなものから、ディープニューラルネットワークや勾配ブースティングツリーのようなある程度複雑なものまであります。

また、モデルのハイパーパラメータチューニングを半自動化する機能や、自動でモデルの選択とチューニングを行うAutoML Tablesが用意されていることから、機械学習のアルゴリズムに詳しく無くとも、SQLの知識で使用できると言われています。

このブログではBigQuery MLを使って機械学習モデルを作成し始めるにあたって、必要となる知識をまとめました。

  1. 機械学習モデル作成の基本
  2. 機械学習モデル予測の基本
  3. DNN(Deep Neural Network)回帰分析
    1. 数値の特徴量を正規化!ML.STANDARD_SCALER
    2. 作成したモデルで予測してみる
    3. BigQuery MLの便利機能!: TRANSFORM句
  4. XGboost回帰分析
    1. 勾配ブースティングツリーで有効な特徴量エンジニアリング
      1. 多項式を生成: ML.POLYNOMIAL_EXPAND
      2. 数値特徴量をカテゴリー特徴量に: ML.QUANTILE_BUCKETIZE
      3. カテゴリー特徴量の組み合わせ: ML.FEATURE_CROSS
  5. ハイパーパラメータチューニングを半自動化!
  6. 終わりに

機械学習モデル作成の基本

BigQuery MLにおける機械学習モデルの作成方法を紹介します。以下の例ではproject_id.dataset_name.table_nameに保存されているテーブルのデータを使用してモデルを作成し、project_id.dataset_name.linear_model_nameに保存しています。

project_id.dataset_name.table_nameのテーブルにはlabel_column、feature1、feature2、feature3のコラムがあり、目的変数をlabel_columnとした場合、feature1、feature2、feature3のデータからlabel_columnのデータを予測します。これにより、学習時は4つすべてのコラムが使用されますが、予測時は特徴量のみ必要となります。

CREATE OR REPLACE MODEL `project_id.dataset_name.linear_model_name`
OPTIONS(model_type='LINEAR_REG', input_label_cols=['label_column']) AS
SELECT
  label_column,
  feature1,
  feature2,
  feature3
FROM
  `project_id.dataset_name.table_name`


CREATE OR REPLACE MODEL
: モデル名を決定します。もし、同じ名前のモデルがデータセットに存在した場合は、新しく作成するモデルを上書きします。上の例でモデル名はlinear_model_nameとされています。

OPTIONS句: モデルタイプ、その詳細を指定することができます。

model_type: モデルタイプを指定します。BigQueryのドキュメント に紹介されている通りのモデルタイプ名を使用し、仮に線形回帰を行う場合はLINEAR_REG、ニューラルネットワークによる分類を行う場合はDNN_CLASSIFIERと指定します。

input_lable_cols[ ]: 教師データの目的変数となるコラム名を指定します。このコラム名がモデルが予想する変数になります。上の例の場合、project_id.dataset_name.table_nameにlable_columnというコラムがあり、それを目的変数としています。

AS SELECT FROM: AS以下で、SQLのSELECTを使用し、トレーニングに使用するデータを指定しています。input_lable_colsで指定されていないコラムは特徴量として使用されます。上の例の場合、lable_columnは目的変数となり、feature1、 feature2、 feature3が特徴量になります。

機械学習モデル予測の基本

モデルを作成することができれば、次は実際のデータを使用してテストしていきます。下の例ではテストのテーブル名をtest_tableとしています。

SELECT
  *
FROM
  ML.PREDICT(MODEL `project_id.dataset_name.model_name`,
    (SELECT
      feature1,
      feature2,
      feature3
     FROM
      `project_id.dataset_name.test_table`))


ML.PREDICT
: 第一引数にモデル名、第二引数には特徴量コラムをSELECTで指定するクエリを取ります。これにより、指定されたモデルを使用して予測を行い、予測結果を戻り値として返します。上の例では予測結果のテーブルをSELEC * FROMで表示しています。

DNN(Deep Neural Network)回帰分析

ここまでで機械学習モデルの作成方法を大まかに確認しました。この章ではその知識を踏まえ、DNN回帰分析のモデルを作成していきます。

CREATE OR REPLACE MODEL `project_id.dataset_name.DNN_model_name`
OPTIONS(
  model_type='DNN_REGRESSOR',
  ACTIVATION_FN = 'RELU',
  BATCH_SIZE = 25,
  HIDDEN_UNITS = [16, 8],
  LEARN_RATE = 0.02,
  OPTIMIZER = 'ADAGRAD',
  DATA_SPLIT_METHOD = 'SEQ',
  DATA_SPLIT_EVAL_FRACTION = 0.2,
  DATA_SPLIT_COL = 'feature3',
  input_label_cols=['label_column']
) AS
SELECT
  label_column,
  ML.STANDARD_SCALER(feature1) AS scaled_feature1,
  ML.STANDARD_SCALER(feature2) AS scaled_feature2,
  feature3
FROM
  `project_id.dataset_name.table_name`


今回のモデルはディープニューラルネットワーク回帰なのでmodel_typeにDNN_REGRESSORを使用しています。ニューラルネットワークを使用する場合は活性化関数(ACTIVATION_FN)、バッチサイズ(BATCH_SIZE)、学習率(LEARN_RATE)、隠れ層、隠れユニット(HIDDEN_UNITS)、最適化アルゴリズム(OPTIMIZER)などを指定する必要があります。

また、データの分割方法(DATA_SPLIT_METHOD)も指定する必要があります。指定されなかった場合は、BigQuery MLが自動でデフォルト値を使用しますが、デフォルト値では良い精度のモデルを作成することが期待できないので、これらの値のチューニングには機械学習の知識が不可欠です。DNNチューニングのために指定できる内容についてはこちらのドキュメントで確認できます。

数値の特徴量を正規化!ML.STANDARD_SCALER

ニューラルネットワークを作成するにあたって気を付けなければならないことの一つとして、数値特徴量の正規化があります。正規化することで、最急降下法ベースの最適化アルゴリズムによる学習をスムーズにすることができます。ML.STANDARDは指定されたコラムの数値を標準化(平均0、分散1の正規化)します。上の例ではfeature1、feature2が数値の特徴量であると仮定し、

ML.STANDARD_SCALER(feature1) AS scaled_feature1,
ML.STANDARD_SCALER(feature2) AS scaled_feature2,

で、正規化を行なっています。

作成したモデルで予測してみる

モデルを作成することができれば、次は実際のデータを使用してテストしていきます。下の例ではテストのテーブル名をtest_tableとしています。

SELECT
  *
FROM
  ML.PREDICT(MODEL `project_id.dataset_name.DNN_model_name`,
    (SELECT
      ML.STANDARD_SCALER(feature1) AS scaled_feature1,
      ML.STANDARD_SCALER(feature2) AS scaled_feature2,
      feature3
     FROM
      `project_id.dataset.test_table`))


ニューラルネットワークのため、学習で使用した数値の特徴量はML.STANDARD_SCALERで正規化されていました。そのため、予測を作成するためのデータも同じように正規化されなければなりません。上の例では

ML.STANDARD_SCALER(feature1) AS scaled_feature1,
ML.STANDARD_SCALER(feature2) AS scaled_feature2,

を使用しています。

しかし、モデルの特徴量数が多くなったり、多数のモデルを作成した場合、どのように特徴量を編集したかを覚えておいて、予測の度にML.STANDARDを使用するのは面倒な作業です。また、後に紹介する
ML.FEATURE_CROSSやML.POLYNOMIAL_EXPANDを使用して特徴量エンジニアリングを行なったりすると、予測時、一層その処理に時間がかかってしまいます。

幸い、BigQuery MLにはその問題を解決する機能が用意されており、それがTRANSFORM句です。

BigQuery MLの便利機能!: TRANSFORM句

TRANSFOMRM句はモデル作成時にデータの前処理を定義しておく事で、予測や評価の段階でその処理を自動化してくれるものです。
下の例では上のDNN回帰分析と同じモデルをTRANSFORM句を用いて作成しています。

CREATE OR REPLACE MODEL `project_id.dataset_name.DNN_model_name`
#-------TRANSFORM句を追加-------
TRANSFORM(
  label_column,
  ML.STANDARD_SCALER(feature1) AS scaled_feature1,
  ML.STANDARD_SCALER(feature2) AS scaled_feature2,
  feature3
)
#------------------------------
OPTIONS(
  model_type='DNN_REGRESSOR',
  ACTIVATION_FN = 'RELU',
  BATCH_SIZE = 25,
  HIDDEN_UNITS = [16, 8],
  LEARN_RATE = 0.02,
  OPTIMIZER = 'ADAGRAD',
  DATA_SPLIT_METHOD = 'SEQ',
  DATA_SPLIT_EVAL_FRACTION = 0.2,
  DATA_SPLIT_COL = 'feature3',
  input_label_cols=['label_column']
) AS
SELECT
  label_column,
  feature1, #ここで前処理しない
  feature2,  #ここで前処理しない
  feature3
FROM
  `project_id.dataset_name.table_name`


OPTIONS句に続くAS以下のSQLクエリでは特徴量、目的変数として使用するコラムをテーブルで指定するだけの作業を行い、データの処理はTRANSFORM句で行います。下はTRANSFORM句を使用した場合の予測時のクエリです。

SELECT
  *
FROM
  ML.PREDICT(MODEL `project_id.dataset_name.DNN_model_name`,
    (SELECT
      feature1,
      feature2,
      feature3
     FROM
      `project_id.dataset.test_table`))


TRANSFORM句で前処理を定義しているため、ここでML.STANDARD_SCALERを使用して正規化する必要がなくなりました。これにより予想、評価の段階でデータの前処理を省略できます。

XGboost回帰分析

次に勾配ブースティングツリーの回帰分析を見ていきます。一般に勾配ブースティングツリーのような決定木ベースの機械学習モデルは、ニューラルネットワークのように特徴量間の関係性を学習しないため、正規化以外の特徴量エンジニアリングの恩恵を受けやすいと言われています。よって、次の例ではXGboostのモデルを使用しながら、TRANSFORM句内で特徴量の掛け合わせなどを行なってみます。

CREATE OR REPLACE MODEL `project_id.dataset_name.xgboost_model_name`
TRANSFORM(
  label_column,
  ML.POLYNOMIAL_EXPAND(feature1, 2) AS poly_feature1,
  ML.QUANTILE_BUCKETIZE(feature2, 10) AS bucketized_feature2,
  ML.FEATURE_CROSS(STRUCT(feature3, feature4)) AS feature_cross,
  feature5, 
)
OPTIONS(
  model_type='BOOSTED_TREE_REGRESSOR', 
  DATA_SPLIT_METHOD = 'SEQ',
  DATA_SPLIT_EVAL_FRACTION = 0.2,
  DATA_SPLIT_COL = 'feature5',
  input_label_cols=['label_column']
) AS
SELECT
  label_column,
  feature1,
  feature2,
  feature3,
  feature4,
  feature5
FROM
  `project_id.dataset_name.table_name`

勾配ブースティングツリーで有効な特徴量エンジニアリング

多項式を生成: ML.POLYNOMIAL_EXPAND


ML.POLYNOMIAL_EXPAND
は、既存の特徴量を掛け合わせるなどして、多項式特徴量を作成できる関数です。これにより、非線形の関係をモデルが学習しやすくなります。上の例ではfeature1を掛け合わせて、2次の多項式特徴量を生成し、新たな特徴量poly_feature1として追加しています。このほか、複数の数値特徴量を掛け合わせることもできます

数値特徴量をカテゴリー特徴量に: ML.QUANTILE_BUCKETIZE


ML.QUANTILE_BUCKETIZEを使用すれば
、数値特徴量をカテゴリー特徴量に変換することができます。これにより、数値データの中に隠れるパターンをモデルが捉えやすくすることができます。上の例では数値特徴量feature2を10等分し、10個のカテゴリーを作成することで新たな特徴量bucketized_feature2を追加しています。

カテゴリー特徴量の組み合わせ: ML.FEATURE_CROSS

ML.FEATURE_CROSSは、2以上のカテゴリー特徴量を組み合わせ、新たな特徴量を作成するもので、モデルがカテゴリー特徴量間の関係性を捉えやすくします。feature3feature4の交差項を新たな特徴量feature_crossとして追加しています。

BigQuery MLにはこれらの他にも様々な特徴量エンジニアリング関数を使用することができ、ドキュメントで確認することができます。

ハイパーパラメータチューニングを半自動化!

機械学習はその名の通り、自動で変数を学習しますが、モデルのトレーニング前に設定しなければならないパラメータもあります。これはハイパーパラメータと呼ばれ、適切なハイパーパラメータを特定することは精度の高い機械学習のモデルを作成するには必須です。ハイパーパラメータには学習率(モデルがデータから学ぶ速さ)、バッチサイズ(一度に処理されるデータサンプルの数)、そしてモデル特有のもの(例えば、決定木の深さやニューラルネットワークの隠れ層の数)があり、モデルの精度に大きな影響を与えるものもあります。

より良いハイパーパラメータを探すプロセスはハイパーパラメータチューニングと呼ばれますが、非常に時間がかかることが問題点として挙げられます。そのため、 グリッドサーチやランダムサーチの方法を用いて、効率的に探索することが必要です。

BigQuery MLにはこの探索を特定のアルゴリズムを用いてサポートする機能が備わっています。下の例はDNN回帰を行う場合のOPTIONS句です。

  OPTIONS(
    model_type='DNN_REGRESSOR',
    ACTIVATION_FN = 'RELU',
    BATCH_SIZE = 25,
    HIDDEN_UNITS = HPARAM_CANDIDATES([struct([8]), struct([14]), struct([8, 4])]),
    LEARN_RATE = HPARAM_RANGE(0.01, 0.03),
    HPARAM_TUNING_ALGORITHM = 'GRID_SEARCH',
    HPARAM_TUNING_OBJECTIVES= ['mean_squared_error'],
    NUM_TRIALS = 20,
    input_label_cols=['label_column']
  ) 


HPARAM_CANDIDATES([candidates])
: 探索するハイパーパラメータのリストを作成できます。上の例ではニューラルネットワークの隠れ層、隠れユニットを探索するように記述されており、BigQuery MLは隠れ層一層でユニット8個、隠れ層一層でユニット14個、隠れ層二層で一層目にユニット8個、二層目に4個の構造の中で試行します。また、 OPTIMIZER=HPARAM_CANDIDATES(['adagrad', 'sgd', 'ftrl'])のように最適化アルゴリズムを探索させることも可能です。

HPARAM_RANGE(min, max): 学習率やバッチサイズなど、数値のハイパーパラメータをチューニングする際に使用されます。探索範囲の下限と上限を設定し、BigQuery MLに試行させます。上の例では学習率0.01から0.03の間で探索させています。

HPARAM_TUNING_ALGORITHM: ハイパーパラメータチューニングに用いられる、探索するためのアルゴリズムを指定します。上の例ではGRID_SEARCH(グリッドサーチ)を選択しています。

HPARAM_TUNING_OBJECTIVES[ ]: ハイパーパラメータのチューニングによって、減少させたい損失関数を指定します。上の例ではmean_squared_error(平均二乗誤差)を選択しています。

NUM_TRIALS: ハイパーパラメータチューニングの試行回数を設定します。

HPARAM_CANDIDATESの候補を多く用意したり、HPARAM_RANGEの選択の幅を大きくするなどして、探索の範囲を広げた場合、NUM_TRIALSを多く設定しないと、最適なハイパーパラメータを特定できない可能性が高くなるため、これにはある程度大きい数字を設定する必要があります。しかし、その反面、NUM_TRIALSを多くするとコンピュテーションと時間が多く必要となるため、そのトレードオフを考えなければなりません。

NUM_TRIALSの設定方法については学習するデータセットの特徴や使用モデルによって様々なため、試行錯誤しながら適切に設定します。

終わりに

BigQuery MLは、他の機械学習フレームワークと比較して学習コストが低いことと、ハイパーパラメータチューニングなどの作業が半自動的に行える点から見て、非常に優秀なサービスであると思います。さらに、BigQueryに格納されたデータを別の場所に移すことなく直接分析できる利点も挙げられます。 冒頭で述べたように、「BigQuery MLでは特別な知識がなくても機械学習モデルを構築できる」という意見があります。しかし、モデル選択や特徴量選定、そしてハイパーパラメータチューニングが必要となることを考慮すると、この見解はAutoMLを使用する場合にのみ当てはまり、その他の場合にはやや無理があると思います。AutoMLとその精度については、別のブログ記事で詳しく説明していますので、そちらもぜひ合わせてご覧いただければと思います。   

BigQuery MLの基本的な使用方法については以上になります。詳しい使用方法についてはドキュメントを参照し、BigQueryでの機械学習の実装を試して見てください。最後まで読んでいただきありがとうございます。

※2023年9月8日時点

Techブログ 新着記事一覧