Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

6 目次 01|BQMLとは

Slide 6

Slide 6 text

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とは

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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)

Slide 9

Slide 9 text

10 目次 02|BQMLの機能紹介

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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を⾃動的に単⼀の列に展開

Slide 15

Slide 15 text

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のタイプに応じて補完

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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