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

BQMLことはじめ

Dca4f8abd1e78940052ee52c85c4d2ed?s=47 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をなるべく簡潔に書いています。

Dca4f8abd1e78940052ee52c85c4d2ed?s=128

shimacos

January 14, 2021
Tweet

Transcript

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

  2. 3 名前 島越 直⼈ (シマコシ ナオト) よくトリゴエと間違えられますがシマコシです。 Twitter @nt_4o54 経歴

    奈良県出⾝ 京都⼤学 機械理⼯学専攻 卒業 2019/04 ~ DeNA新卒⼊社 2020/04 ~ MoTに出向中 ⾃⼰紹介
  3. 4 Kaggle 3 (solo1), 3 (solo 3) ⾊々なドメインに触れるのが好きなので、⾊々出てます ⾃⼰紹介

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

  5. 6 目次 01|BQMLとは

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

  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)
  9. 10 目次 02|BQMLの機能紹介

  10. 11 提供機能 前処理関数 MinMaxScalerやStandardScaler、Ngramなど 訓練関数 訓練と各種パラメータの設定など 評価関数 AUCやF1、MSEなどの基本的なものと混同⾏列、ROC曲線など 予測関数 訓練時と同じ変換を⾃動的に⾏い予測を⾏う

    モデルのエクスポート Tensorflow SavedModelやXGBoostのmodelをGCSに出⼒ BQMLの関数
  11. 12 BQMLによる訓練 出⼒先を指定 モデル種類を指定 各種パラメータの設定 分割⽅法の指定 Labelの名前を指定 DATA_SPLIT_COLと INPUT_LABEL_COLSに 指定してないカラム全てが

    特徴量として認識される Random Split
  12. 13 BQMLによる訓練 ダッシュボードで指標を確認できる

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

  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を⾃動的に単⼀の列に展開
  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のタイプに応じて補完
  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
  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

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

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

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

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

    DNN: 訓練, 予測はロジスティック回帰と同様 KMeans: 訓練, 予測 Tensorflow: インポート, OOF予測, test予測 Stacking: 訓練, OOF予測, test予測 訓練と予測
  22. 23 ⼀晩ぱっとSQLを書くだけでギリ銀圏くらいのスコアは出た 結果 Localでやった⽅が何か精度⾼い これを許容できるかはあなた次第 (少なくともKaggleでは無理)

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

  24. 25 XGBoost objectiveが回帰・分類でそれそれ固定 custom_objectiveやcustom_metricはもちろん使えない 容量制限のためかMAX_ITERATIONSの最⼤値が1000 訓練途中で⾒込みのない実験を切るとかはやりにくい 前述のEARLY_STOP謎挙動のせいでパラメータチューニングが⾟い Localでやった⽅が精度⾼い (無視できる差かはprj次第) DNN

    BatchNormがデフォルトでFalseになっていて、しかも変更できない マルチタスク学習 / マルチラベル学習はできない ここが嫌だよBQML
  25. 26 Tensorflow モデルサイズ制限が250MB 訓練時と同じ前処理するのが⼤変 (本当に⾟い, Tensorflowのグラフに前処理を含めたら良いかも) その他 データセットの中が汚れる SQL駆動なのでデバッグが⾟い ここが嫌だよBQML

  26. 27 l 簡単に訓練を並列化できる l 前処理を⾃動的にしてくれるのは楽 l ⼀度SQLを書いてしまうと管理は簡単 (な気がする) l 推論をBQ上で完結できる

    (GKEなどを使わなくて良い) l 推論がスキャン量の課⾦だけで済む (インスタンス代を削れる) ここは良いよBQML
  27. 28 l 線形回帰・ロジスティック回帰などは スキャン量をなるべく抑えるため、 訓練に投⼊するための中間テーブルを作成した⽅がいい。 l 特徴量追加やパラメータ探索の実験は、localで実験した⽅がコストを 抑えられる。 l XGBoostは1000iter制限があり、learning

    rateチューニング的なこと をしないと精度が出ない。 その他TIPS
  28. 29 今回のコードは全てgithubにあげているので 興味のある⽅はご覧ください https://github.com/shimacos37/bqml-tutorial