haripo.com

LDA for Pokemon analysis

こんにちは。これは Machine Learning Advent Calendar 2016 の 23 日目の記事です。 ここでは LDA 解説し、ポケモンのデータを用いて実験してみます。

LDA

LDA は Latent Dirichlet Allocation の略で、日本語だと「潜在的ディリクレ配分法」です。 トピックモデルと呼ばれる手法の 1 つで、文書解析を主として提案されました。 文書がどのような話題(トピック)で構成されているかを解析するモデルです。

モデル

LDA は「トピック分布」と「単語分布」を用いて文書生成をモデル化します。

まず、「トピック分布」から説明します。 トピック分布というのは、文書が持っているトピックを割合の形で表したものです。 たとえば文書 A は 「政治トピックが 10%、スポーツトピックが 50%、医療トピックが 40% の文書」とかです。

alt
文書はトピックの割合で表すことができる

同様に、トピックは単語分布によって表すことができると考えます。 単語分布はトピックに関連する単語を割合の形で表したものです。

alt
トピックは単語の割合で表すことができる

このように、文書をトピック分布で、トピックを単語分布で表現することができました。 実際のテキストコーパスを用いて LDA を「学習」することで、各文書のトピック分布と各トピックの単語分布を求めることができます。 学習によって得られたトピック分布が、文書の扱っている話題の割合を表すというわけです。

ただし、LDA はトピックがどういった話題に対応しているのかを直接には教えくれません。 トピック分布は「トピック 1 の割合 40%、トピック 2 の割合 60%」のような形で得られますので、 トピック 1 が実際にどのような話題であるかは我々が解釈しなければなりません。 そこでトピックの単語分布を確認し、「ヒット、ホームラン、盗塁などの単語の割合が多いから、これは野球トピックだな」とか 「選挙、首相の割合が多いから、これは政治トピックだ」などというように解釈します。

学習

では、どのようにしてトピック分布と単語分布を求めるのでしょうか。

LDA の生成過程について確認してみましょう。 トピック分布と単語分布が決まっていれば、次のようにして確率的に単語を生成することができます。

  1. まず、トピック分布に基づいてトピックを 1 つ選びます。
    10% の確率で政治トピックが、50% の確率でスポーツトピックが選ばれるといった具合です。
  2. 次に、選ばれたトピックの単語分布を参照して単語を選びます。
    同様に 0.3% の確率で手術、0.1% の確率で問診……といった具合です。

これを繰り返すことによって単語列、すなわち文書が生成できます。

トピック分布と単語分布から文書を生成することができる
トピック分布と単語分布から文書を生成することができる

さて、文書はランダムに生成されますが、どのような文書が生成されやすい(もしくは生成されにくい)かは、トピック分布と単語分布によって決まります。 ということは、実際の文書コーパスを生成する確率が高いトピック分布・単語分布が存在するはずです。 そのようなトピック分布・単語分布を求めるのが LDA における学習です。

LDA は文書からトピック分布と単語分布を推定します
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 の単語分布(確率降順10件)
わざ確率
サイコキネシス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

左から「ひこうタイプ」「ほのおタイプ」「でんきタイプ」「くさタイプ」のトピックが得られました。

ポケモンの特徴を捉えたトピック

タイプ分類とは異なったカテゴライズが得られたトピックを紹介します。

トピック 9 の単語分布
わざ確率
つめとぎ0.0699
みだれひっかき0.0635
いあいぎり0.0613
シャドークロー0.0592
ひっかく0.0527
つばめがえし0.0430
みがわり0.0419
ねごと0.0398
あなをほる0.0333
アイアンテール0.0322
どろぼう0.0312

上位5件がすべて「爪」っぽい技のトピックです。 ここで、ポケモンごとのトピック分布を集計し、このトピックの割合が多いポケモンをリストアップしてみます。

トピック 9 の割合を多く持つポケモンの一覧
ポケモン確率
チョロネコ0.3823
レパルダス0.2857
スカンプー0.2857
ゾロア0.2537
テッカニン0.2459
ダグトリオ0.2380
ニャース0.2365
スカタンク0.2307
ブニャット0.2285
ニャルマー0.2191

「チョロネコ」「ニャース」などネコ系をはじめとするケモノっぽいポケモンが多いですね。
ダグトリオはよくわかりませんが……ひっかく・きりさくなどの技を覚えるようなので、爪がある設定なんですかね。

続いて似た傾向を持つトピックを紹介します。

トピック 16 の単語分布
わざ確率
つるぎのまい0.0616
つばめがえし0.0556
いあいぎり0.0547
シザークロス0.0512
みねうち0.0512
きりさく0.0382
れんぞくぎり0.0373
はたきおとす0.0364
みがわり0.0347
やつあたり0.0312
かわらわり0.0304

「爪」と似ていますが、こちらは「つるぎのまい」「みねうち」など剣っぽい技が並びます。

トピック 16 の割合を多く持つポケモンの一覧
ポケモン確率
ニダンギル0.4090
ヘイガニ0.4000
シザリガー0.3717
オノンド0.3571
カメテテ0.3333
キングラー0.3108
イシズマイ0.3050
キバゴ0.3000
アノプス0.2968
ハッサム0.2916

「ニダンギル」そのまんま剣をモチーフにしたポケモンですね。 ヘイガニ・シザリガーなどのカニ・エビ系が思ったより多い。 剣というよりは「ハサミ」でしょうか。

続いてはこちら。

トピック 31 の単語分布
わざ確率
あまえる0.04685
おんがえし0.04685
うそなき0.04685
みがわり0.04538
アンコール0.03953
ねごと0.03953
めざめるパワー0.03953
エコーボイス0.03953
さわぐ0.03806
りんしょう0.03367
なきごえ0.03074

あまえる、おんがえし、うそなき…..キュートっぽい。

トピック 31 の割合を多く持つポケモンの一覧
ポケモン確率
アンノーン1.0000
プラスル0.3200
ピチュー0.2972
マイナン0.2631
チラーミィ0.2622
エネコ0.2560
ピンプク0.2461
トゲピー0.2365
ルリリ0.2222
パチリス0.2173

小動物系! 正直なところ、わざだけでこういう分類が得られるとは思ってませんでした。想像以上です。

アンノーンは完全にノイズとなっています。 覚えられるわざが「めざめるパワー」しかない上に、「めざめるパワー」はほとんどのポケモンが覚えることのできるわざですので、 どうしてもうまく学習できないポケモンです。 前処理で削除しておいてもよかったですね。 自然言語処理では低頻度語・高頻度語をノイズとしてあらかじめ削除したうえで解析することが多いです。

ポケモンごとの解析

ポケモン数が多すぎて全ては確認できないので、いくつかに絞って見ていきます。

ピカチュウのトピック分布
トピック確率
210.3580
330.1975
10.1728
460.1234
20.0370
120.0246
310.0246
60.0123
320.0123
400.0123
420.0123
450.0123

でんきタイプを捉えたトピック 21 が 35% で 1 位になりました。

3 位のトピック 1 はかくとうタイプのトピックでした。ピカチュウは格闘もいける。

2 位のトピック 33 は何でしょうか。

トピック 33 の単語分布
わざ確率
のろい0.0588
がまん0.0528
ロケットずつき0.0518
いかり0.0508
ものまね0.0479
とっしん0.0479
ずつき0.0419
こらえる0.0409
のしかかり0.0399
ゆうわく0.0349
しぜんのめぐみ0.0349

ちょっと解釈できそうにないですねえ。 こういうトピックもあります。

リザードンのトピック分布
トピック確率
330.2075
140.1886
170.1603
190.1603
10.1226
360.0943
160.0471
150.0094
260.0094

リザードンの場合は先ほどのトピック 33 が 1 位。 次いで トピック 14, 17, 19 の割合が高いです。

トピック 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 に興味を持っていただければ幸いです。

参考文献

書籍

トピックモデルを扱う日本語書籍。 トピックモデルの立ち位置から学習の詳しい計算まで詳細に学べます。

ウェブサイト

論文

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.