LDA for Pokemon analysis
こんにちは。これは Machine Learning Advent Calendar 2016 の 23 日目の記事です。 ここでは LDA 解説し、ポケモンのデータを用いて実験してみます。
LDA
LDA は Latent Dirichlet Allocation の略で、日本語だと「潜在的ディリクレ配分法」です。 トピックモデルと呼ばれる手法の 1 つで、文書解析を主として提案されました。 文書がどのような話題(トピック)で構成されているかを解析するモデルです。
モデル
LDA は「トピック分布」と「単語分布」を用いて文書生成をモデル化します。
まず、「トピック分布」から説明します。 トピック分布というのは、文書が持っているトピックを割合の形で表したものです。 たとえば文書 A は 「政治トピックが 10%、スポーツトピックが 50%、医療トピックが 40% の文書」とかです。
同様に、トピックは単語分布によって表すことができると考えます。 単語分布はトピックに関連する単語を割合の形で表したものです。
このように、文書をトピック分布で、トピックを単語分布で表現することができました。 実際のテキストコーパスを用いて LDA を「学習」することで、各文書のトピック分布と各トピックの単語分布を求めることができます。 学習によって得られたトピック分布が、文書の扱っている話題の割合を表すというわけです。
ただし、LDA はトピックがどういった話題に対応しているのかを直接には教えくれません。 トピック分布は「トピック 1 の割合 40%、トピック 2 の割合 60%」のような形で得られますので、 トピック 1 が実際にどのような話題であるかは我々が解釈しなければなりません。 そこでトピックの単語分布を確認し、「ヒット、ホームラン、盗塁などの単語の割合が多いから、これは野球トピックだな」とか 「選挙、首相の割合が多いから、これは政治トピックだ」などというように解釈します。
学習
では、どのようにしてトピック分布と単語分布を求めるのでしょうか。
LDA の生成過程について確認してみましょう。 トピック分布と単語分布が決まっていれば、次のようにして確率的に単語を生成することができます。
- まず、トピック分布に基づいてトピックを 1 つ選びます。
10% の確率で政治トピックが、50% の確率でスポーツトピックが選ばれるといった具合です。 - 次に、選ばれたトピックの単語分布を参照して単語を選びます。
同様に 0.3% の確率で手術、0.1% の確率で問診......といった具合です。
これを繰り返すことによって単語列、すなわち文書が生成できます。
さて、文書はランダムに生成されますが、どのような文書が生成されやすい(もしくは生成されにくい)かは、トピック分布と単語分布によって決まります。 ということは、実際の文書コーパスを生成する確率が高いトピック分布・単語分布が存在するはずです。 そのようなトピック分布・単語分布を求めるのが LDA における学習です。
LDA の注意点ですが、学習によって「医療」「スポーツ」のような話題を捉えたトピックが得られるという保証はありません。 これは LDA の学習が正解データ(文書がどのような話題であるか判っているデータ)を必要としない、教師なし学習だからです。 もちろん「医療」などのトピックが得られる可能性もありますし、たとえば文書を書いた人によって単語の出現傾向が違っていれば、それを捉えたトピックが出現するかもしれません。また、文書コーパスによっては「標準語」「関西弁」といったトピックが出現することも考えられます。 このように様々なトピックが考えられるのが LDA の面白いところであり、難しいところでもあります(半教師あり LDA という発展もあります)。
ポケモンへの応用
LDA は文書解析に限らず、多方面に応用されています。
たとえばオンライン書店に会員登録しているユーザを文書、そのユーザが購買した書籍 ID を単語とみなして LDA に応用することができます。 あるユーザが購買した書籍 ID(単語)の出現傾向は、ユーザ(文書)の趣味や嗜好によって変化するでしょうから、 ユーザのトピックとして「SF 好き」や「ファンタジー好き」得られると考えられます。 画像を文書、画像中の特徴量を量子化して単語とし、画像に写っている物体を検出する研究もあります。
ここでは「文書と単語」を「ポケモンとポケモンの技」に置き換えて実験してみます。 ポケモンの覚える技は、そのポケモンのタイプ属性によって変化します。 水タイプのポケモンは「みずてっぽう」を覚える傾向が、電気タイプのポケモンは「10 万ボルト」を覚える傾向がありますね。 ポケモンの「技」を LDA に適用するとトピックとしてポケモンの「タイプ」が得られそうです。
ほかにも、「しっぽをふる」や「アイアンテール」などの技は尻尾を持っているポケモンにしか出現しません。 このような特徴を捉えたトピックが現れる可能性もあります。
実験
ポケモンの技リストを用意して LDA に適用します。
実装
JavaScript で実装しました。 Collapsed Gibbs Sampling によって学習しています。 コードは後日公開します。
データセット
全世代のポケモンを利用します。 技は「たまごわざ」「わざマシン」含めポケモンの覚えることのできる技すべてを扱っています。
実験条件
LDA のハイパーパラメータは
- トピック数 = 50
- alpha = 0.1
- beta = 0.02
を用いています。 パラメータの意味については参考文献を参照してください。
実験結果
タイプ分類を捉えたトピック
トピックごとの単語(技)分布から確認していきましょう。 まず、わかりやすい例から。
わざ | 確率 |
---|---|
サイコキネシス | 0.0379 |
ひかりのかべ | 0.0349 |
フラッシュ | 0.0349 |
じこあんじ | 0.0328 |
めいそう | 0.0315 |
シグナルビーム | 0.0307 |
リフレクター | 0.0303 |
サイコショック | 0.0303 |
ゆめくい | 0.0261 |
しねんのずつき | 0.0261 |
ねんりき | 0.0252 |
エスパータイプのトピックですね!
「フラッシュ」「じこあんじ」「シグナルビーム」は分類上はエスパータイプではありませんが、 これらの技を覚えるポケモンがエスパー技を覚えやすいため、このようなトピックになったのだと思われます。
正式な分類より「それっぽい」分類が得られているのではないでしょうか。
続いて、同様にタイプの傾向が見られたトピックを挙げます。
わざ | 確率 |
---|---|
おいかぜ | 0.0518 |
はねやすめ | 0.0472 |
つばめがえし | 0.0416 |
はがねのつばさ | 0.0406 |
きりばらい | 0.0381 |
エアカッター | 0.0381 |
そらをとぶ | 0.0376 |
あやしいかぜ | 0.0325 |
とんぼがえり | 0.0294 |
ついばむ | 0.0264 |
ねっぷう | 0.0264 |
わざ | 確率 |
---|---|
やきつくす | 0.0722 |
だいもんじ | 0.0722 |
かえんほうしゃ | 0.0712 |
オーバーヒート | 0.0660 |
おにび | 0.0608 |
ニトロチャージ | 0.0608 |
ねっぷう | 0.0546 |
ひのこ | 0.0495 |
ソーラービーム | 0.0464 |
いびき | 0.0330 |
ほのおのうず | 0.0319 |
わざ | 確率 |
---|---|
10まんボルト | 0.0479 |
でんげきは | 0.0460 |
チャージビーム | 0.0442 |
フラッシュ | 0.0433 |
かみなり | 0.0433 |
でんじふゆう | 0.0423 |
ボルトチェンジ | 0.0423 |
ほうでん | 0.0405 |
でんじは | 0.0396 |
ワイルドボルト | 0.0377 |
シグナルビーム | 0.0368 |
わざ | 確率 |
---|---|
なやみのタネ | 0.0511 |
タネばくだん | 0.0505 |
こうごうせい | 0.0463 |
エナジーボール | 0.0463 |
しぜんのちから | 0.0457 |
ギガドレイン | 0.0451 |
フラッシュ | 0.0415 |
タネマシンガン | 0.0385 |
くさむすび | 0.0379 |
ソーラービーム | 0.0379 |
にほんばれ | 0.0349 |
左から「ひこうタイプ」「ほのおタイプ」「でんきタイプ」「くさタイプ」のトピックが得られました。
ポケモンの特徴を捉えたトピック
タイプ分類とは異なったカテゴライズが得られたトピックを紹介します。
わざ | 確率 |
---|---|
つめとぎ | 0.0699 |
みだれひっかき | 0.0635 |
いあいぎり | 0.0613 |
シャドークロー | 0.0592 |
ひっかく | 0.0527 |
つばめがえし | 0.0430 |
みがわり | 0.0419 |
ねごと | 0.0398 |
あなをほる | 0.0333 |
アイアンテール | 0.0322 |
どろぼう | 0.0312 |
上位 5 件がすべて「爪」っぽい技のトピックです。 ここで、ポケモンごとのトピック分布を集計し、このトピックの割合が多いポケモンをリストアップしてみます。
ポケモン | 確率 |
---|---|
チョロネコ | 0.3823 |
レパルダス | 0.2857 |
スカンプー | 0.2857 |
ゾロア | 0.2537 |
テッカニン | 0.2459 |
ダグトリオ | 0.2380 |
ニャース | 0.2365 |
スカタンク | 0.2307 |
ブニャット | 0.2285 |
ニャルマー | 0.2191 |
「チョロネコ」「ニャース」などネコ系をはじめとするケモノっぽいポケモンが多いですね。
ダグトリオはよくわかりませんが......ひっかく・きりさくなどの技を覚えるようなので、爪がある設定なんですかね。
続いて似た傾向を持つトピックを紹介します。
わざ | 確率 |
---|---|
つるぎのまい | 0.0616 |
つばめがえし | 0.0556 |
いあいぎり | 0.0547 |
シザークロス | 0.0512 |
みねうち | 0.0512 |
きりさく | 0.0382 |
れんぞくぎり | 0.0373 |
はたきおとす | 0.0364 |
みがわり | 0.0347 |
やつあたり | 0.0312 |
かわらわり | 0.0304 |
「爪」と似ていますが、こちらは「つるぎのまい」「みねうち」など剣っぽい技が並びます。
ポケモン | 確率 |
---|---|
ニダンギル | 0.4090 |
ヘイガニ | 0.4000 |
シザリガー | 0.3717 |
オノンド | 0.3571 |
カメテテ | 0.3333 |
キングラー | 0.3108 |
イシズマイ | 0.3050 |
キバゴ | 0.3000 |
アノプス | 0.2968 |
ハッサム | 0.2916 |
「ニダンギル」そのまんま剣をモチーフにしたポケモンですね。 ヘイガニ・シザリガーなどのカニ・エビ系が思ったより多い。 剣というよりは「ハサミ」でしょうか。
続いてはこちら。
わざ | 確率 |
---|---|
あまえる | 0.04685 |
おんがえし | 0.04685 |
うそなき | 0.04685 |
みがわり | 0.04538 |
アンコール | 0.03953 |
ねごと | 0.03953 |
めざめるパワー | 0.03953 |
エコーボイス | 0.03953 |
さわぐ | 0.03806 |
りんしょう | 0.03367 |
なきごえ | 0.03074 |
あまえる、おんがえし、うそなき.....キュートっぽい。
ポケモン | 確率 |
---|---|
アンノーン | 1.0000 |
プラスル | 0.3200 |
ピチュー | 0.2972 |
マイナン | 0.2631 |
チラーミィ | 0.2622 |
エネコ | 0.2560 |
ピンプク | 0.2461 |
トゲピー | 0.2365 |
ルリリ | 0.2222 |
パチリス | 0.2173 |
小動物系! 正直なところ、わざだけでこういう分類が得られるとは思ってませんでした。想像以上です。
アンノーンは完全にノイズとなっています。 覚えられるわざが「めざめるパワー」しかない上に、「めざめるパワー」はほとんどのポケモンが覚えることのできるわざですので、 どうしてもうまく学習できないポケモンです。 前処理で削除しておいてもよかったですね。 自然言語処理では低頻度語・高頻度語をノイズとしてあらかじめ削除したうえで解析することが多いです。
ポケモンごとの解析
ポケモン数が多すぎて全ては確認できないので、いくつかに絞って見ていきます。
トピック | 確率 |
---|---|
21 | 0.3580 |
33 | 0.1975 |
1 | 0.1728 |
46 | 0.1234 |
2 | 0.0370 |
12 | 0.0246 |
31 | 0.0246 |
6 | 0.0123 |
32 | 0.0123 |
40 | 0.0123 |
42 | 0.0123 |
45 | 0.0123 |
でんきタイプを捉えたトピック 21 が 35% で 1 位になりました。
3 位のトピック 1 はかくとうタイプのトピックでした。ピカチュウは格闘もいける。
2 位のトピック 33 は何でしょうか。
わざ | 確率 |
---|---|
のろい | 0.0588 |
がまん | 0.0528 |
ロケットずつき | 0.0518 |
いかり | 0.0508 |
ものまね | 0.0479 |
とっしん | 0.0479 |
ずつき | 0.0419 |
こらえる | 0.0409 |
のしかかり | 0.0399 |
ゆうわく | 0.0349 |
しぜんのめぐみ | 0.0349 |
ちょっと解釈できそうにないですねえ。 こういうトピックもあります。
トピック | 確率 |
---|---|
33 | 0.2075 |
14 | 0.1886 |
17 | 0.1603 |
19 | 0.1603 |
1 | 0.1226 |
36 | 0.0943 |
16 | 0.0471 |
15 | 0.0094 |
26 | 0.0094 |
リザードンの場合は先ほどのトピック 33 が 1 位。 次いで トピック 14, 17, 19 の割合が高いです。
わざ | 確率 |
---|---|
りゅうのはどう | 0.0669 |
げきりん | 0.0535 |
りゅうのいぶき | 0.0401 |
ドラゴンテール | 0.0383 |
アイアンテール | 0.0383 |
りゅうせいぐん | 0.0339 |
にほんばれ | 0.0321 |
ギガインパクト | 0.0321 |
じならし | 0.0312 |
めざめるパワー | 0.0294 |
ほえる | 0.0276 |
わざ | 確率 |
---|---|
おいかぜ | 0.0518 |
はねやすめ | 0.0472 |
つばめがえし | 0.0416 |
はがねのつばさ | 0.0406 |
きりばらい | 0.0381 |
エアカッター | 0.0381 |
そらをとぶ | 0.0376 |
あやしいかぜ | 0.0325 |
とんぼがえり | 0.0294 |
ついばむ | 0.0264 |
ねっぷう | 0.0264 |
わざ | 確率 |
---|---|
やきつくす | 0.0722 |
だいもんじ | 0.0722 |
かえんほうしゃ | 0.0712 |
オーバーヒート | 0.0660 |
おにび | 0.0608 |
ニトロチャージ | 0.0608 |
ねっぷう | 0.0546 |
ひのこ | 0.0495 |
ソーラービーム | 0.0464 |
いびき | 0.0330 |
ほのおのうず | 0.0319 |
ドラゴン、ひこう、ほのおタイプのトピックですね。 リザードンの特徴が捉えられています。 トピック 33 の解釈ができないのが悔やまれます。
まとめ
LDA を用いてポケモンデータを解析し、ポケモンのタイプにとらわれない多様な分類ができることを確認しました。 このように、LDA は「文書と単語」の関係性を見出すことで様々な分野に応用できるモデルですので、 身近な場面で役に立つことも多いかと思います。
本記事で LDA に興味を持っていただければ幸いです。
参考文献
書籍
トピックモデルを扱う日本語書籍。 トピックモデルの立ち位置から学習の詳しい計算まで詳細に学べます。
ウェブサイト
-
人工知能学会 私のブックマーク Vol.27 No.3
LDA のまとめとリンク集。 -
離散データの確率的トピックモデル
LDA をトピックモデル全体の流れのなかで解説したプレゼン資料。わかりやすい。
論文
LDA の提案論文と Collapsed Gibbs Sampling の論文。
- Blei, D. M., Ng, A. Y., & Jordan, M. I. (2003). Latent dirichlet allocation. Journal of machine Learning research, 3(Jan), 993-1022.
- Griffiths, T. L., & Steyvers, M. (2004). Finding scientific topics. Proceedings of the National academy of Sciences, 101(suppl 1), 5228-5235.