Upgrade to Pro — share decks privately, control downloads, hide ads and more …

BQMLことはじめ

shimacos
January 14, 2021

 BQMLことはじめ

社内の技術共有会で発表した資料です。
BQMLの概要について紹介しています。
更に、KaggleのOtto Group Product Classification Challengeのデータを用いて以下のBQMLの機能を試し、肌感について述べています。
- ロジスティック回帰
- KMeans
- XGBoost
- DNN
- Tensorflow modelのインポート

使用したコードについても以下に公開しています。
https://github.com/shimacos37/bqml-tutorial
タスクランナーとしてinvokeを用いていたり、jinja2テンプレートでSQLをなるべく簡潔に書いています。

shimacos

January 14, 2021
Tweet

More Decks by shimacos

Other Decks in Technology

Transcript

  1. 2021.01.14
    Naoto Shimakoshi
    株式会社ディー・エヌ・エー + 株式会社 Mobility Technologies
    BQMLことはじめ
    AI技術共有会

    View full-size slide

  2. 3
    名前
    島越 直⼈ (シマコシ ナオト)
    よくトリゴエと間違えられますがシマコシです。
    Twitter
    @nt_4o54
    経歴
    奈良県出⾝
    京都⼤学 機械理⼯学専攻 卒業
    2019/04 ~ DeNA新卒⼊社
    2020/04 ~ MoTに出向中
    ⾃⼰紹介

    View full-size slide

  3. 4
    Kaggle
    3 (solo1), 3 (solo 3)
    ⾊々なドメインに触れるのが好きなので、⾊々出てます
    ⾃⼰紹介

    View full-size slide

  4. 5
    目次
    01|BQMLとは
    02|BQMLの機能紹介
    03|実際に使ってみた

    View full-size slide

  5. 6
    目次 01|BQMLとは

    View full-size slide

  6. 7
    BigQuery上でMLモデルを構築できる
    2021/01/14時点で以下のモデルに対応
    l 線形回帰
    l ロジスティック回帰
    l KMeans
    l Matrix Factorization (要申し込み)
    l ARIMA
    l XGBoost
    l DNN
    l Tensorflow modelのインポート
    l AutoML Tables (ベータ版)
    BQMLとは

    View full-size slide

  7. 8
    メリット
    BQ上でデータの整形・学習・予測まで構築できるので管理コストが低い
    データをGCSなどに⼀度外出しする必要がないので推論速度が上がる
    デメリット
    Pythonで学習・予測するのに⽐べて⾃由度は低い
    凝った特徴量を⼤量に作ろうとすると頭が痛くなる
    実験段階で何度も訓練を⾏ったりするとちょっと⾼い
    BQMLの概要

    View full-size slide

  8. 9
    料⾦
    BQMLの概要
    https://cloud.google.com/bigquery-ml/pricing?hl=ja
    モデル 値段
    線形回帰, ロジスティック回帰,
    KMeans, ARIMAの訓練
    普通のBQクエリの50倍の値段
    ($250 / TB)
    AutoML, DNN, XGBoostの訓練 普通のBQクエリと同じ値段 ($5.00 / TB)
    + AI Platform費用
    BQMLで作成したモデルを用いた予測 普通のBQクエリと同じ値段 ($5.00 / TB)

    View full-size slide

  9. 10
    目次 02|BQMLの機能紹介

    View full-size slide

  10. 11
    提供機能
    前処理関数
    MinMaxScalerやStandardScaler、Ngramなど
    訓練関数
    訓練と各種パラメータの設定など
    評価関数
    AUCやF1、MSEなどの基本的なものと混同⾏列、ROC曲線など
    予測関数
    訓練時と同じ変換を⾃動的に⾏い予測を⾏う
    モデルのエクスポート
    Tensorflow SavedModelやXGBoostのmodelをGCSに出⼒
    BQMLの関数

    View full-size slide

  11. 12
    BQMLによる訓練
    出⼒先を指定
    モデル種類を指定
    各種パラメータの設定
    分割⽅法の指定
    Labelの名前を指定
    DATA_SPLIT_COLと
    INPUT_LABEL_COLSに
    指定してないカラム全てが
    特徴量として認識される
    Random Split

    View full-size slide

  12. 13
    BQMLによる訓練
    ダッシュボードで指標を確認できる

    View full-size slide

  13. 14
    BQMLによる予測 (OOFの作成)
    ML.PREDICTとMODELでmodelを指定
    訓練に⽤いた前処理・特徴量を
    ⾃動的に使⽤してくれる
    predicted_{label_name}_probs
    という名前で出⼒される(STRUCT型)

    View full-size slide

  14. 15
    ⼊⼒変数の変換 (データ型に応じて⾃動変換)
    BQMLの⼊⼒
    https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-create?hl=ja#inputs
    ⼊⼒データ型 変換⽅法
    INT64, NUMERIC, FLOAT64
    標準化
    (KMeansを⽤いるときはOptionで選択)
    BOOL, STRING, BYTES, DATE,
    DATETIME, TIME
    One-hot Encoding
    (XGBoostはLabel Encoding)
    ARRAY Multi-hot Encoding
    TIMESTAMP
    TIMESTAMPから⾃動的に年・⽉・週・
    分・曜⽇・⽇などを抽出し、
    One-hot Encoding (秒は標準化)
    STRUCT 各Fieldを⾃動的に単⼀の列に展開

    View full-size slide

  15. 16
    ⼊⼒変数の補完
    BQMLの⼊⼒
    https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-syntax-create?hl=ja#imputation
    特徴量列の種類 補完⽅法
    数値列
    訓練時に⼊⼒した
    データ全体の平均値で補完
    One-hot / Multi-hot Encode列
    訓練時は追加カテゴリとして扱い、
    未知のデータは予測時に重み0とする
    TIMESTAMP列
    秒に関しては平均値
    その他は追加カテゴリとして扱う
    STRUCT 各Fieldのタイプに応じて補完

    View full-size slide

  16. 17
    ML.BUCKETIZE
    数値列を指定したbinのARRAYで分割し、カテゴリ化する
    ML.POLYNOMIAL_EXPAND
    指定した次数以下の数値列の組み合わせの積を計算する
    ML.FEATURE_CROSS
    指定した次数以下のカテゴリの組み合わせを計算し、新たなカテゴリとする
    ML.NGRAMS
    ARRAYの⼊⼒からNGRAMを⽣成する
    ML.QUANTILE_BUCKETIZE
    分位に基づいて指定したバケット数に数値列を分割し、カテゴリ化する
    前処理関数
    https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-preprocessing-functions?hl=ja

    View full-size slide

  17. 18
    ML.MIN_MAX_SCALER
    数値列を[0, 1]にスケーリングする
    ML.STANDARD_SCALER
    数値列を標準化する
    前処理関数
    https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-preprocessing-functions?hl=ja

    View full-size slide

  18. 19
    目次 03|実際に使ってみた

    View full-size slide

  19. 20
    KaggleのOttoのデータを⽤いて実験
    特徴︓93個の匿名特徴量 (整数値)
    + 9クラス分類
    + それぞれの特徴が右に裾の⻑い分布
    精度を⾼めるというよりは肌感を掴む
    実験

    View full-size slide

  20. 21
    Pipeline
    元の特徴量とlogを取った特徴量
    Kmeansのクラスタ中⼼までの距離特徴を
    各modelに突っ込むシンプルなStacking
    実験

    View full-size slide

  21. 22
    コード (https://github.com/shimacos37/bqml-tutorial)
    ロジスティック回帰: 訓練, OOF予測, test予測
    XGBoost: 訓練, 予測はロジスティック回帰と同様
    DNN: 訓練, 予測はロジスティック回帰と同様
    KMeans: 訓練, 予測
    Tensorflow: インポート, OOF予測, test予測
    Stacking: 訓練, OOF予測, test予測
    訓練と予測

    View full-size slide

  22. 23
    ⼀晩ぱっとSQLを書くだけでギリ銀圏くらいのスコアは出た
    結果
    Localでやった⽅が何か精度⾼い
    これを許容できるかはあなた次第
    (少なくともKaggleでは無理)

    View full-size slide

  23. 24
    EARLY_STOPの挙動がよく分からない
    過学習してるのに⽌まらないことがある
    (多分MIN_REL_PROGRESSの幅の改悪は⾒逃す設定になってる︖)
    何round改善しなかったら終了みたいなことができない
    ここが嫌だよBQML

    View full-size slide

  24. 25
    XGBoost
    objectiveが回帰・分類でそれそれ固定
    custom_objectiveやcustom_metricはもちろん使えない
    容量制限のためかMAX_ITERATIONSの最⼤値が1000
    訓練途中で⾒込みのない実験を切るとかはやりにくい
    前述のEARLY_STOP謎挙動のせいでパラメータチューニングが⾟い
    Localでやった⽅が精度⾼い (無視できる差かはprj次第)
    DNN
    BatchNormがデフォルトでFalseになっていて、しかも変更できない
    マルチタスク学習 / マルチラベル学習はできない
    ここが嫌だよBQML

    View full-size slide

  25. 26
    Tensorflow
    モデルサイズ制限が250MB
    訓練時と同じ前処理するのが⼤変
    (本当に⾟い, Tensorflowのグラフに前処理を含めたら良いかも)
    その他
    データセットの中が汚れる
    SQL駆動なのでデバッグが⾟い
    ここが嫌だよBQML

    View full-size slide

  26. 27
    l 簡単に訓練を並列化できる
    l 前処理を⾃動的にしてくれるのは楽
    l ⼀度SQLを書いてしまうと管理は簡単 (な気がする)
    l 推論をBQ上で完結できる (GKEなどを使わなくて良い)
    l 推論がスキャン量の課⾦だけで済む (インスタンス代を削れる)
    ここは良いよBQML

    View full-size slide

  27. 28
    l 線形回帰・ロジスティック回帰などは
    スキャン量をなるべく抑えるため、
    訓練に投⼊するための中間テーブルを作成した⽅がいい。
    l 特徴量追加やパラメータ探索の実験は、localで実験した⽅がコストを
    抑えられる。
    l XGBoostは1000iter制限があり、learning rateチューニング的なこと
    をしないと精度が出ない。
    その他TIPS

    View full-size slide

  28. 29
    今回のコードは全てgithubにあげているので
    興味のある⽅はご覧ください
    https://github.com/shimacos37/bqml-tutorial

    View full-size slide