infoseiri’s blog

映画から食からサッカーまで

近傍法でロールを見分けよう

どうもこんにちは赤猫です。

先日、大好きなジョジョの第5部がアニメ化決定したということで、さっそく見てみたのですが。あんな話だったんですね。というのも、自分はアニメからジョジョに入って、漫画は2部の途中までしか見ていなかったもんですから。姉に漫画を貸してもらい、5部は途中から読んでいたのですが、そうすると中途半端な理解度になって(´∀`)ギャングの親玉がトチ狂ったから(娘を殺した?)その復讐かなんかで…ああやっぱだめだ、全然話が分かっていません。とはいえ、アニメを見ればわかるだろうと思って、1話2話を一気見していたのですが、なんか話のテンポが以上に早くないですか?ジョルノがギャングスターを目指そうとして、ブチャラティと協力するところなんか、いやそれはうまが良すぎるやろって。なんかついていけなくなりそう。まあそんな感じも好きなんですけどね、ジョジョ。自分としては、思い出補正がかかっているかもしれませんが、1部がやはり1番好き。あのミステリアスなんだか、ギャグなんだかよくわからない不思議さが、初めて出会ったとき衝撃でしたね。というわけで、ダイレクトマーケティングでした。スタンドもなにが一番強いのかとか考えていくと、盛り上がりますし、ぜひ見てみてください。

 

どうしてRやってんの?

というわけで、本題に入っていきたいと思います。今回は、統計学?といってもR(統計ソフト)の専門的な話になるので、初学者には難しいかもしれませんが…でも実践的な話になるので面白いとは思います。

それは、私がまだ学部2年生でどのゼミに入ろうか迷っていた時、統計学出会いました。これだと思って、ゼミの担当先生と話していると、今からの時代はAIや機械学習の時代だということ。そのときは、金融工学に興味があってそれに時間を費やしており、統計学は検定2級の参考書を使って勉強していただけで、実践的なことはやっていませんでした。そこで、なんか機械学習とかAI関係学びたいな。本屋に行っていいものがないか探しました。そこで見つけたのがこれ。これならいくらか自分が触ったことのあるRを使って、機械学習を学べるんだとか。やったね。

機械も人間も一緒

まずは、機械学習とは何ぞやという話。最近のセンサーの発達やPCの計算能力の向上のおかげで生まれた手法なんだとか。たしかに、センサーだとiphoneの顔認証(わたしはsurfaceですが)とか、計算能力の向上は、テラバイトとか出てきて、それが普通になってますからね。そこで、人間が日常やっていること

  1. いろんなデータを見る(外部情報との接触
  2. 抽象的な概念に変換
  3. 新しい情報に出会ったときにその概念を適用

という工程を機械に任せてしまおうということらしいです。たとえば、スパムメール(迷惑メール)で、怪しい金額の表示やアダルト用語があると、私たち人間はそれがスパムだとわかりますよね。それを機械に任せます。まずいくらかのスパムメールと通常メールを見せて、違いを概念化させる(スパムメールにはどんな文字列が含まれるか)、こうすることで機械学習のメール振り分けフィルタ完成ってわけです。ですが注意が必要。人間の判断にも失敗があるように、機械にも当然、失敗はつきものです。まあ操っているのが人間なので、機械の失敗というかは人間の失敗かもしれませんが。よく言われるのが、機械学習というぐらいですから、最初に何らかのでもデータを学習させる・訓練するわけですが、そのデータに過剰に適応してしまうと、新しい問題にうまく対応できなくなります。機械も既成概念(絶対こうに違いない)に縛られてしまうわけですね。そこで、学習した後は、それがどれぐらい新しい問題に使えそうか評価を行わないといけません。精度が悪ければ修正の必要があります。

実践(ロールを識別しよう)

では、具体的に例に入っていきましょう。今回行ったのは、最近傍法というもの。近傍ということなので、複数のデータの中で一番性質が似通ったものを探し、カテゴライズする・整理するというものですね。本で紹介されているものでは、

などなど、実生活での例も多く強力らしいです。本書で紹介されていたのは、k近傍法というもの。任意のk個の近傍を考えて分類していくということです。与えられた最初のデータが例えば食べ物であれば、果物と野菜というカテゴリーにもともと分かれてあり、それぞれの特徴量(甘さ、歯ごたえ)なんかが記されています。次に、データに含まれていなかった、特徴量の分かっているもの(例えばトマト)をカテゴリーに従って、分類していきます。どのカテゴリーと近いかを表すのに使うのが距離なんですが、ここではユークリッド距離を使っていました。距離が特徴量の測り方に影響するので

  • 最大最小正規化
  • Zスコア標準化
  • ダミーコーディング

など対処法はいろいろあるのですが、実際にやってみましょう。私の好きなゲームvaingloryのヒーローを分類したいと思います。

まずはデータの下準備

公式サイト

Vainglory 5V5

にアクセスして頑張りました。

完成した表がこちらです。

f:id:infoseiri:20181016130626p:plain

エクセルの置換やら、行と列を入れ替えて貼り付けをする、また、基本ですが同じ画面で一気に終わらせられるように考えながら(頻繁に手を動かしまくらなくてもいいように)やりました。

置換って便利ですね。vainglory知っている人はわかるかもしれませんが、エナジーがないひーろーがいますよね。あーだんとかBFとか。そいつらの下処理(欠損値を0)とりあえずしておきました。あと、substitute関数これもとても便利。substitute(セル,検索文字列,置換)で簡単に文字を整理できます。

Excel:不特定の文字を一括削除する −教えて!HELPDESK

 

それではまず、データを見ていきましょう。レーン、ジャングル、ロームなどはポジション。狙撃手、魔導士などはロールと名付けました。

f:id:infoseiri:20181016133036p:plain

ロールを予想するモデルを作ってみましょう。

f:id:infoseiri:20181016135515p:plain

これはなにをしたかというと、

  1. まず名前はいらないから削除
  2. ロールを表形式で表示
  3. 文字になっているので、factorとして定義
  4. %の表を改めて作りました

まあ、見やすさ重視の操作です。まだ特に何もしていません。

f:id:infoseiri:20181016140152p:plain

次に、上の表を見ると、まあ当然ですが体力やエナジーなどはデータの幅が大きいです。そこで、さっきの正規化というやつをします。

f:id:infoseiri:20181016142703p:plain

幅が大きかった、体力という項目も幅1になりました。

本題のclassパッケージに入っているknn(k近傍)は訓練データ、テストデータ、訓練データのラベル、kの個数を指定します。

gmodelsパッケージのCrossTable関数で見よう見まねでやってみると、訓練データとテストデータを表の上下半分で分け、kの値は4(=訓練データ20の平方根に近い)にすると…

f:id:infoseiri:20181016151241p:plain

結果…つかれた

狙撃手と戦士以外は、間違いが多かったです。似ているところがあるのでしょうか。それともデータのとり方が悪かったのか。とりあえず、疲れたのでここまでで。休憩_(:3 」∠)_

気づいたんですが、どうやればRのクロス表なんかを図として保存できるのでしょうか。メモ帳に貼り付けたり、スクショして頑張ってました。なんかデータの下処理で終わってしまいました<m(__)m>