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

使い回しやすい 2-stage recommender systemの デザインパターンを考えて実装した話

使い回しやすい 2-stage recommender systemの デザインパターンを考えて実装した話

Higuchi kokoro

January 19, 2024
Tweet

More Decks by Higuchi kokoro

Other Decks in Programming

Transcript

  1. © commmune Inc. All rights reserved 使い回しやすい 2-stage recommender systemの

    デザインパターンを考えて実装した話 2024/01/20 #16 atmaCup 表彰式&振り返り会 Kokoro Higuchi
  2. © commmune Inc. All rights reserved 自己紹介 樋口 心 Commmune

    - Data Scientist お仕事 • 機械学習システムの開発(推薦システム...etc) • プロダクト KPIの分析 • (入社して2週間🐣) SNS • X (旧 Twitter):@zerebom_3 Kokoro Higuchi X アイコン
  3. © commmune Inc. All rights reserved 会社紹介 コミュニティ作りに 特化したプロダクト commmune(コミューン)

    営業・CSのアクションを 最速で効率化するプロダクト SuccessHub(サクセスハブ) あらゆる組織とひとが融け合う未来をつくる VISION
  4. © commmune Inc. All rights reserved 作ってきた2-stage recommender systemのドメインと所感 自分が過去に作ってきたドメイン

    • ビジネスSNSのマッチング@Wantedly • 洋服のEC @H&Mコンペ 🥈 • 総合EC @ottoコンペ 🥈 • 旅行サイト @atma-16 27位 • コミュニティプラットフォーム @commmune 所感 • どのドメインでも2st-recysなら、体感80/100点以上の精度は出せる • ドメインによらず、割と実装構成は似せることができる • → 使い回せる自作ライブラリを作ると便利そう!
  5. © commmune Inc. All rights reserved 2st-recsysの入力データ形式 行: 複数の候補生成ロジックの和集合 列:

    キーとなるID列 + 候補集合の順位,スコア + ユーザー/アイテム/ユーザ*アイテムに紐付く特徴量
  6. © commmune Inc. All rights reserved 2st-recsysのCandidateとFeatureの要件? Candidate • 複数のロジックを使用する

    • 各ロジックの和集合をとる Feature • 複数のロジックを使用する • 候補集合の和集合に left joinで紐付ける つまり... • 基底クラスを継承し、For文でJoinすればOK? (Template Methodパターン)
  7. © commmune Inc. All rights reserved 隠れていた2st-recsysのCandidateとFeatureの要件 共通 • 重い処理は一度だけ実行し、保存したい。二度目は読み出したい

    • データの取得先や方法を柔軟に変えたい(BQ, インメモリ, csv…) • 柔軟にデータの保存先を変えたい(Train/ valid / test…, Fold,....) • 各ロジックごとに検証したい(欠損値はないか、len() != 0...) Candidate • 複数のTOP KでRecallやなどMetricを評価したい Feature • ロジックは同じだけど、 join先のkey_colsを可変にしたい (ex. item2itemの推薦) • 実験を経て、使うカラムを柔軟に決めたい
  8. © commmune Inc. All rights reserved 巨大Candidate Classの完成😭 ナイーブに盛り込むと、多機能で取り回しづらいクラスになる •

    持っている機能 ◦ 入力データのダウンロード ◦ 候補集合の生成 ◦ 候補集合の保存 ◦ 候補集合の評価 ◦ 候補集合の検証 • 巨大クラスの弊害 ◦ 引数の順番ミスによるエラー発生 ◦ 可読性低下 ◦ ドメインごとに一部だけ変えることが難しい
  9. © commmune Inc. All rights reserved 解決策: 責務ごとにクラスを作り、委託する(Strategy パターン) 責務ごとにクラスを分けるメリット

    • 必要なところだけ独立で呼び出せる ◦ クラスを通さずアドホックに作った候補集合を評価 ◦ 入力データのダウンロード機構を特徴量にも流用 • 必要なところだけ作り替えられる ◦ DataLoaderだけcsv → BQに • → 様々なドメインで使い回しやすくなる👌
  10. © commmune Inc. All rights reserved 作ってどうだったか? これらを踏まえ、コンペ中にscortaという自作ライブラリを作りました: https://github.com/zerebom/scorta Good

    • 複雑化したコンペ終盤でもエラーなく、速度を落とさず実験できた • 業務でもatmaでもscortaのコードをほぼ流用して、すぐに2-stage recsysを実装できた Bad • 短期コンペで作り始めたので、序盤は精度改善できなかった ◦ 有休期間だったからこそ作れたかも • ライブラリに熱中すると精度改善が疎かになる🙃