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

BigQueryで参加するレコメンドコンペ / bq-recommend-competitio...

shimacos
November 26, 2023

BigQueryで参加するレコメンドコンペ / bq-recommend-competition-kaggle-meetup-tokyo-2023

Kaggle Tokyo Meetup 2023のLT資料です。
「BigQueryで参加するレコメンドコンペ 」という題でレコメンドコンペにBigQueryで参加する際のTIPSなどについて説明しました。
Kaggle Notebookでコードも公開しています。
https://www.kaggle.com/code/shimacos/otto-recommend-bq-example-0f2b8e
実際にottoに参加していた際の3位解法のコードもありますので参考にしてください。
https://github.com/shimacos37/kaggle-otto-3rd-place-solution/tree/main/shimacos

shimacos

November 26, 2023
Tweet

More Decks by shimacos

Other Decks in Science

Transcript

  1. 自己紹介 島越 直人 よくトリゴエと間違えられますがシマコシです • 経歴 ◦ 京都大学 機械理工学専攻 卒業

    ◦ 2019/04 ~ 2023/04 DeNA Data Scientist ▪ (2020/04 ~ 2022/03) GO株式会社に出向 ◦ 2023/04 ~ LayerX 機械学習エンジニア ML Team Tech Lead • Kaggle ◦ Kaggle Competitions Grandmaster ◦ 色々なドメインのデータに触れるのが好きな ので色々やってます @nt_4o54 @shimacos
  2. © 2023 LayerX Inc. 4 Kaggleで行われたレコメンドコンペ • OTTO – Multi-Objective

    Recommender System ◦ Session-based Recommendation ◦ クリックやカート追加、購入などのsession毎の時系列から その後に何のitemに対してどんなアクションを取るかを予測 • H&M Personalized Fashion Recommendations ◦ Batch Recommendation ◦ 7日後までにどの商品を購入するかを予測
  3. © 2023 LayerX Inc. 5 Table taskとして解く場合の一般的なレコメンドの解き方 あるあるな例 • 候補抽出の際に共起行列を作ろうとし

    てメモリが死ぬ • User x Itemの特徴量を作ろうとして 組合せ爆発して死ぬ • 「色々なCandidates作ったぞ!組み 合わせるか〜」→ UNIONで死ぬ レコメンドコンペはメモリとの戦い
  4. © 2023 LayerX Inc. 6 一般的な処理方法 Pandas • 言わずと知れたテーブルデータ処理 ライブラリ

    • 遅い • (使い慣れてる) Polars • Rust製のテーブルデータ処理ライブラリ • 高速 • CPU上で動く cuDF • Nvidia製のテーブルデータ処理 ライブラリ • 高速 • GPUがないと使えない • GPUのメモリに載る量しか扱えない BigQuery • GCP上で動くDWH • SQLさえ書けば、勝手に分散して 最適化してくれるため高速 • 1TB scanあたり500円くらいお金がか かる
  5. © 2023 LayerX Inc. 7 一般的な処理方法 Pandas • 言わずと知れたテーブルデータ処理 ライブラリ

    • 遅い • (使い慣れてる) Polars • Rust製のテーブルデータ処理ライブラリ • 高速 • CPU上で動く cuDF • Nvidia製のテーブルデータ処理 ライブラリ • 高速 • GPUがないと使えない • GPUのメモリに載る量しか扱えない BigQuery • GCP上で動くDWH • SQLさえ書けば、勝手に分散して 最適化してくれるため高速 • 1TB scanあたり500円くらいお金がか かる 今日はこの部分を紹介
  6. © 2023 LayerX Inc. 8 BigQueryのメリット・デメリット メリット • 最終的なデータセットを手元に落として訓練・予測するまではlocalにリソースが必要ない。 •

    あまりゴリゴリ最適化せずとも雑にSQLを書いて高速に動作する • クエリjobを並列に投げておけば、お手軽に並列で特徴量などを作れる。 • WINDOW関数が便利で、直近N時間とか直近N分のようなRolling特徴が作りやすい デメリット • 課金が発生する。 • 細かいcandidatesのRecall Tuningなどinteractiveに結果を確認したい場合面倒。 • 特徴量が増えてくるとダウンロード速度がボトルネックになってくる。 • item2vecなどpython経由で候補を作成する場合に一度localを経由するので面倒。
  7. © 2023 LayerX Inc. 10 問題設定 • Sessionの途中まで与えられて、その後にクリックする商品、カートに入れる商品、注文す る商品を当てる •

    データサイズ ◦ train: 2億行 (!) (4week分) ◦ test: 700万行 (1week分) ◦ sessionとaid (item_id)、時間、action_typeが記録されている • 2億行のデータの取り回しに苦労する
  8. © 2023 LayerX Inc. 11 学習方針 • test期間は1week分なのでtrainの最後1weekで学習させる • 最後1weekのsessionをrandomにtruncateして自分でラベルを作成

    • 特徴量などは訓練全体とtruncateした前半部分を用いる • test期間を予測する時は、trainとtest部分を使って再度特徴量を作り直す 特徴量・候補作成期間 (Train時) Train期間 特徴量・候補作成期間 (Test時)
  9. © 2023 LayerX Inc. 13 BigQueryが活きる例 • 例えば、同じsessionに対して直近前後1時間にアクションされたaidが共起しているとし て共起行列を作りたいとなった場合どうしますか? •

    polarsの場合 ◦ 「えーまず、同じsessionでdfをjoinして、timestampの差分が1時間以内のもの にして。。。」 → joinで死ぬ (chunkでやれという話はあります)
  10. © 2023 LayerX Inc. 16 TIPS 1: Jinja2 Templateを活用する •

    例1) 訓練とテストで全く同じクエリを使い回したいけどほとんど     内容が同じ二つのファイルを作るのは面倒 解) for文とステートメントを繋げることで使いまわす
  11. © 2023 LayerX Inc. 17 TIPS 1: Jinja2 Templateを活用する •

    例2) 特徴量のaggregationと命名がpandasなどと比べて面倒 解) for文を使うことで feature = df.groupby(cols).agg([‘mean’, ‘std’]) feature.columns = [‘-’.join(cols) for cols in feature.columns] を擬似的に再現できる
  12. © 2023 LayerX Inc. 18 TIPS 2: shuffleした時の再現性はFARM_FINGERPRINTを使う • 例)

    Negative Sampling時に全体からランダムに負例を持ってきたいが、     RAND()を使うと再現性がなくなる • 解) ユニークなkeyにseedをくっつけ、     FARM_FINGERPRINGで乱数を発生させた上で並び替える ※ ちなみにただのROW_NUMBERだけだと本質的にRandomに並び替えられずbiasがかかる。 (shimacosはこれで数日溶けた)
  13. © 2023 LayerX Inc. 19 TIPS 3: localに持ってくる時はBQ storage APIを使う

    • 例) TableをBQで作ったのはいいもののlocalに持ってくるのが遅い • 解) storage APIを使ってdownloadする。 少し課金が走るが14292091 x 31くらいなら15secでdownloadできる。 ※ storage APIを使う場合、ORDER BYをクエリに含めていてもsortされずに返ってくることがあるので注意
  14. © 2023 LayerX Inc. 20 TIPS 4: 予測時はCluster化して少しずつ予測を行う。 • 例)

    TestデータはNegative Samplingできないので、データセットがデカくなる • 解) sessionでCluster化してN session単位で予測する。 Cluster化することで毎回全スキャン走らないので課金を減らせる。 前もってsampleしたidのリストを作っておく
  15. © 2023 LayerX Inc. 21 まとめ • BigQueryを使ったレコメンドコンペの参加ベースラインを公開 ◦ 参考:Kaggle

    Notebook, GitHub • BigQueryを使う場合に便利になるTIPSをいくつか紹介 とはいえ。。 • 一度BigQueryで参加して分かったが辛い部分もあるので、 polarsやcuDFなどと適切に使い分けていくことが重要