kanayamaのブログ

twitter: @tkanayama_

ポケモン人気投票データを使って推薦システムを作る

  • [祝] ポケモン25周年
    • 〜推薦システムに詳しい方へ〜
  • 本編
    • ステップ1. 基本的な集計をする
    • ステップ2. ポケモンうしの共起度を計算する
    • ステップ3. ポケモンどうしをグループ分けする
    • ステップ4. 推薦システムを作る
  • まとめ
  • 宣伝
  • 補足など
    • ツイートの収集
    • ステップ2の結果一覧
    • Matrix Factorizationの実装

[祝] ポケモン25周年

@tkanayama_ です。先日、ポケモン公式による投票企画「#キミにきめた」が実施されました。これは、Twitter上で以下のようにハッシュタグをつけてツイートすることにより、ポケモンの人気投票を行う企画です。

f:id:tepppei:20210225102457p:plain
投票の例

今回の投票ルールで特筆すべき点は「一人が投票できるポケモンの種類数に制限がない*1」という点です。例えば上の例であれば、@tkanayama_さんは「オタチ」と「ヒノアラシ」の両方に投票したことになります。

このルールを見て私は、ポケモンうしの共起関係を使ってポケモンの推薦システムを作れるのではないかと考えました。例えば、今回の投票を分析した結果「シャワーズとブースターとサンダースが同一ユーザーによって投票されやすい」ということが分かったとします。もし「シャワーズとブースターが好きだ」という人がいたら、その分析結果を使って「シャワーズとブースターが好きな人は、サンダースというポケモンも好きみたいですよ」とオススメすることができます(現段階ではたかだか900種類程度しかポケモンがいないため、推薦システムの価値は薄いかもしれません。しかし、この25年で900種類のポケモンが発見されたということは、200年後くらいには1万種類のポケモンがいると予想できます。その場合、なかなか全ポケモンを把握するのは難しいので、推薦システムが真価を発揮することでしょう)。

〜推薦システムに詳しい方へ〜

この記事は、簡易的な共起分析とクラスタリングでデータを観察したのち、最後にナイーブなMatrix Factorizationに突っ込んだという内容です。手法的に新しい点は特にありません。なお、「あるポケモンに投票した」という行動を「そのポケモンが好きである」と見なして、implicit feedbackの問題設定を暗に仮定しています。

*1:実際のルールはもう少し複雑で、「異なるツイートであれば同一のポケモンに何回投票しても良いが、同一ツイート同一ポケモンは1票分としてカウントする」などの制約もあります。今回のブログの趣旨とはあまり関係がないので説明を省略しました。ルール詳細は公式ページを確認してください。

続きを読む

ポケモンを題材に「SQLアンチパターン」を実践してみる

@tkanayama_です。「SQLアンチパターン *1」 という本を読みました。「ポケモンを題材に因果推論を実践してみる」のように、仮想的なストーリ上で実際に使ってみた感を出すことにより、自分の記憶に定着させることを狙います。

前提として、何をアンチパターンとするかは状況(ベンダーフリーである必要があるかどうか、どの程度の頻度で更新されるか・・・など)によって大きく異なるので、下記で紹介するアンチパターンは実は状況によっては問題にならないケースもあるかと思います。この投稿はあくまで「SQLアンチパターン」に忠実に従うことが目的です。

www.oreilly.co.jp

追記

  • このブログを公開後、「外部キー制約はレコードロック周りのトラブルが起きやすい」との知見共有を有識者からいただきました。実務で使う場合にはご注意ください。

登場人物

*1:SQLアンチパターン -- Bill Karwin (著), 和田 卓人 (監修), 和田 省二 (監修), 児島 修 (翻訳)

続きを読む

Kaggleの学習から投稿までをAWS, GitHub Actionsを使って自動化する

金山(@tkanayama_)です。先日終了したKaggleの"M5 Forecasting"というコンペに参加した際、クラウドやCI/CDの勉強も兼ねて、AWS, GitHub Actionsを使って遊んでみました。

免責

  • N番煎じだったらすみません。一応、同じことをやっているネット記事は見つかりませんでした。
  • 私はクラウドなど勉強中の身分ですので、もっといいやり方がある or 説明が間違っている、などありましたら教えてください。
  • 私がこのシステムを使って参加したコンペの順位は5,558チーム中1,000,000,000位だったので、Kaggleで勝てるかどうかは別問題のようです :pien:

この記事のゴール

下記のようなシステムを構築することをゴールとします。

ユーザーがやることは2つ(図中でユーザーから伸びている黄色矢印)で、

  1. 実装したコードをgit pushし、
  2. AWSコンソールからEC2の実行ボタンを押す

です。その他はシステムによって自動化されていることを目指します。また、実行中のログやメモリ使用率・CPU使用率などはCloudWatchを用いてリアルタイム*1で可視化します。

f:id:tepppei:20200707144217p:plain
構築したシステム

*1:メモリ使用率・CPU使用率は5分くらいのタイムラグあり

続きを読む

ポケモンを題材に因果推論を実践してみる

  • 問題設定
  • 有意差検定
  • 交絡因子の存在
  • 線形重回帰によるモデル化
  • 回帰係数の推定
  • 回帰係数の仮説検定
  • 補足など
    • 残差の分布について
    • 他の交絡因子について
    • データの生成方法について
  • 参考文献

@tkanayama_です。最近「計量経済学*1」と「効果検証入門 *2」を読んだので、せっかくなので実際に手を動かすことによって理解の整理をしたいと思いました。

www.yuhikaku.co.jp

gihyo.jp

そこで今回は、人工データを用いて「ボールの性能と捕獲確率」の関係性を効果検証してみました(人工データの生成方法は記事の末尾に記述しました)。

*1:計量経済学 (y21) -- 浅野 皙, 中村 二朗

*2:効果検証入門〜正しい比較のための因果推論/計量経済学の基礎 -- 安井 翔太

続きを読む

userの閲覧確率を考慮したMatrix Factorization

Modeling User Exposure in Recommendation [Liang et al., WWW2016] を読んだので、今回も行間を補いつつ、主にアルゴリズムの導出部分をブログにしました。

論文の一言要約

「itemが閲覧されたかどうか」(言い換えると、ユーザーの目に入ったかどうか)を表す確率変数をMatrix Factorizationに導入した。これによって、例えば「このユーザーに興味がありそうなのにクリックされていないアイテムは、まだユーザーの目に入っていない確率が高い」などを考慮したモデルの構築が期待できる。

この記事のゴール

この論文の提案手法である「exposure MF」の更新式を導出する。

続きを読む

Matrix Factorizationを確率モデルから導出する

Probabilistic Matrix Factorization [Salakhutdinov and Mnih, NIPS 2008] を読んだので、自分の言葉で行間を補いつつモデルの導出過程をまとめてみます。古典的な論文ですが、グラフィカルモデルを用いた独立性判定やベイズ推論を使いこなすための良い訓練になると思いました。

この記事のゴール

確率モデルから出発して、Matrix Factorizationの損失関数を導く。

続きを読む