kanayamaのブログ

twitter: @tkanayama_

「施策デザインのための機械学習入門」を完全に理解したサトシくんがポケモン捕獲アルゴリズムを実装する話

  • プロローグ
  • ストーリー編
    • 第1章 感銘
      • step1. KPIの設定
      • step2. データの観測構造をモデル化する
      • step3. 解くべき問題を特定する
      • step4. 観測データのみを用いて問題を解く方法を考える
      • step5. 機械学習モデルを学習する
      • step6. 施策を導入する
    • 第2章 絶望
    • 第3章 反省
    • 第4章 再起
      • step1(再) KPIの設定
      • step2(再) データの観測構造をモデル化する
      • step3(再) 解くべき問題を特定する
      • step4(再) 観測データのみを用いて問題を解く方法を考える
      • step5(再) 機械学習モデルを学習する
      • step6(再) 施策を導入する
    • 第5章 俺たちの戦いはこれからだ!
  • 実装編
    • 準備
    • 擬似データの生成
    • 意思決定モデルの学習
    • モデルのオフ方策評価
    • モデルの真の性能の評価
  • まとめ
  • この記事を読んだ方はこんな記事も読んでいます(多分)

@tkanayama_です。先日、「施策デザインのための機械学習入門*1」をご恵贈いただきました。

そこで本の内容を引用しつつ、学んだことをポケモンを題材に実践する*2ことにより、自らの理解を定着させるとともに本の良さをお伝えできればと思います。

gihyo.jp

プロローグ

サトシくんはデータサイエンスに強みを持ったポケモントレーナーです。

この世界では、ポケモンを捕獲することによりもらえる謝礼金ポケモントレーナーの重要な収入源の一つとなっています。ポケモンを捕まえて博士に送ると、ポケモン研究への協力金として謝礼金を受け取ることができます*3

すなわち、以下のような表がポケモントレーナーに与えられているものとします。(データの全体はGitHubから確認できます。)

図鑑番号 名前 捕獲難度(数字が大きいほど捕獲が難しい)*4 礼金(ポケ円)*5
1 フシギダネ 210 1,600
2 フシギソウ 210 4,358
・・・ ・・・ ・・・ ・・・
25 ピカチュウ 65 1,785
・・・ ・・・ ・・・ ・・・
150 ミュウツー 252 47,333
151 ミュウ 210 24,414

ポケモンの捕獲に使えるボールはモンスターボールからマスターボールまで4種類あり、それぞれのボールは価格と性能が異なっています。ポケモントレーナーは、ポケモンに対してこれらいずれかのボールを投げる、もしくは何もせず「逃げる」という選択肢を取ることができます。表にまとめると以下のようになります。

アクション名 コスト(ポケ円) 捕獲しやすさ
逃げる 0 必ず捕まえられない
モンスターボールを投げる 100 捕まえにくい
スーパーボールを投げる 500 やや捕まえやすい
ハイパーボールを投げる 2,000 とても捕まえやすい
マスターボールを投げる 10,000 必ず捕まえられる

サトシくんはこれらの定性的・定量的な情報を頼りに、収益をできるだけ大きくする必要があります。さもなくば、ポケモントレーナーとして生計を立てていくのは難しいでしょう。

以下では簡単のため、ポケモンとの対面1回につき捕獲チャンスは1回のみとします。捕獲に失敗したら、また次のポケモンと対面することになります。次に現れるポケモンは、同じ種類のポケモンかもしれないし、違う種類かもしれません。(2021/09/15追記:どのポケモンと対面するかは適当な確率分布によって決まりますが、ポケモントレーナー側はこの分布を制御できないものとします。つまり、ピカチュウと会いたいからといってピカチュウがいそうな場所だけをウロウロするようなことはできません。)

f:id:tepppei:20210904171448j:plain

*1:施策デザインのための機械学習入門〜データ分析技術のビジネス活用における正しい考え方 -- 齋藤 優太, 安井 翔太

*2:この記事を含め、私が何度か書いているポケモンのブログ記事はいわゆる二次創作に相当すると考えられ、著作権に対して注意を払う必要があります。任天堂ゲーム内の動画や静止画に対するガイドラインにて、ガイドラインの範囲内で適切な動画や静止画の共有サイトに投稿することを許可しています。一方、本ブログ記事のような形式の二次創作に対しては、任天堂および株式会社ポケモンから明確なガイドラインは公表されていないようでした。そこで、本ブログ記事は収益性を持たないこと・ポケモンを貶める意図はないことを明言した上で、権利者に要求された場合は速やかに記事の公開を停止することをここに宣言します。

*3:ポケモンを売ることでお金をもらえます」という説明が一番シンプルではあるのですが、ポケモンに値段をつけて売買することはポケモンの世界観に反するので、「ポケモン研究への協力金」というストーリーをひねり出しました。

*4:捕獲難度はポケモンWikiの捕捉率一覧 の大小を逆転させたものを用いています。

*5:礼金の金額は、赤緑青ピカチュウ攻略サイト の合計種族値を40で割ってから4乗したものを用いています。これにより、「強いポケモンほど謝礼金が大きい」かつ「ポケモンの種類によってそれなりに金額に違いがある」が成り立つようにしています。

続きを読む

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

  • [祝] ポケモン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:効果検証入門〜正しい比較のための因果推論/計量経済学の基礎 -- 安井 翔太

続きを読む