Bigquery ML で Titanic をやる

多分既に誰かがやっているとは思うので、あくまで備忘録的な作業メモ的な。 スタートガイドをやってみたのですが、簡単過ぎて逆に覚えられなかったので…

データ準備

$ mkdir ~/Documents/titanic
$ cd ~/Documents/titanic
$ wget https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv
$ head -n 600 titanic.csv > train.csv 
$ head -n 1 titanic.csv > valid.csv
$ tail -n 292 titanic.csv >> valid.csv    # titanic.csvは全部で892行

BQにアップロード

適当なプロジェクトにtitanicデータセットを作成。UIからtrain.csvとvalid.csvをインポートする。 スキーマは自動検出で行けました。

f:id:kex5n:20200909234530p:plain

学習

CREATE MODEL `titanic.model`
OPTIONS(
    model_type='logistic_reg',
    input_label_cols=['Survived']
) AS (
    SELECT * FROM `titanic.train`
)

スタートガイドではターゲットとなるカラムにlabelというエイリアスをつけて学習を行っているみたいですが、ここではエイリアスは使わずinput_label_colsを使用してターゲットとなるカラムを指定します。 ARRAYにしないといけないんですね。

評価

SELECT 
    *
FROM
    ML.EVALUATE(
        MODEL `titanic.model`, (
            SELECT * FROM `titanic.valid`
        )
    )

予測

スタートガイドでは何やらいろいろ加工しているので、いったん全部出力してみようと思います。

SELECT
    *
FROM
    ML.PREDICT(
        MODEL `titanic.model`, (
            SELECT * FROM `titanic.valid`
        )
    )

f:id:kex5n:20200910002047p:plain

こんな感じになるから加工が必要なんですね。predicted_labelの意味も分かりました。 必要な形に加工して出力します。

SELECT
    PassengerId,
    predicted_Survived,
FROM
    ML.PREDICT(
        MODEL `titanic.model`, (
            SELECT * FROM `titanic.valid`
        )
    )

まとめ

Bigquery ML を使う上で使用するのは主に次の3つの機能で、それぞれ次のような形で使う。

  • 学習
CREATE MODEL `dataset.model_name`
OPTIONS(
    model_type='hoge',
    input_label_cols=['huga']
) AS (
    SELECT * FROM `dataset.train_table_name`
)
  • 評価
SELECT
    *
FROM
    ML.EVALUEATE(
        MODEL `dataset.model_name`, (
            SELECT * FROM `dataset.valid_table_name`
        )
    )
  • 予測
SELECT
    *    --適当な形に加工する。
FROM
    ML.PREDICT(
        MODEL `dataset.model_name`, (
            SELECT * FROM `dataset.test_table_name`
        )
    )

こうやってみるとシンプル。 公開当初に比べてAutoML Tablesに対応したりと使える場面は広がっているはず。 フィットすればかなり高速に開発できそう。