町田市の領土問題に、機械学習でケリをつける
機械学習というのがスゴいらしい。
具体的にあれこれ指示を出さなくても、データを与えればコンピュータが勝手に学習して、その結果囲碁やら将棋やらポーカーやらがめちゃめちゃ強くなったりするそうだ。
とても良い。 テクノロジーそのものへの興味もさることながら、なにより、コンピュータが勝手に学習してくれるなら、人間があんまり動かなくて良さそうなのが素晴らしい。
ゲームでプロに勝つような高度ものはともかく、もう少しシンプルな問題なら、chocoxinaでも機械学習を利用して解決できるんじゃないか。例えば町田市の領土問題とか。
step0. 町田市領土問題とは
町田市といえば、東京都と神奈川県の境にあり、その所属について古くから議論の続く地域である。
歴史的な経緯から東京都に属するものだという意見もある一方で、東京の他地域とは丘によって隔てられており、また横浜・川崎・相模原との交流が盛んであるなどの事情から、近隣住民の間では当然神奈川県に帰属するものだという意見が主流だ。
法的には、前身となる町田村が1893年に神奈川から東京へ移管された旨が確認できるものの、20世紀の日本政府が町田と神奈川県相模原市をひとまとめに扱っている事例もみられ、いずれとも断定しかねる状態になっている。
そんな町田市について、機械学習の力を用いて東京か神奈川か判別しよう、というのが今回の趣旨である。
つまり、
- 東京・神奈川の各市区町村の情報をコンピュータに放りこむ
- コンピュータがそれらのデータを使って、各市区町村が東京か神奈川か判別する方法を、なんかイイカンジに学習する←ここが機械学習
- かしこくなったコンピュータに町田市のデータを読み込ませると、いずれに属するか判定してくれる
という具合だ。
step1. 環境の構築、あるいはつまりchocoxinaはこれから何をしようとしているのか
※1 本記事は、機械学習の知識はおろか、30行以上のコードを書いた経験すらない人間が執筆しています。内容に大きな誤りを含む可能性があるので、半笑いでご覧ください。 ※2 そういうわけなので、内容についてご指摘頂いても、言葉の意味さえ分からない可能性が高いです。
今回は、機械学習に使われるモデルの中でも「サポートベクターマシン」と呼ばれるものを用いる。
リンク先にはなにやら小難しい説明が並んでいるが、出てくる数式などについては筆者もビタイチ理解していないので、どうか安心してついて来ていただきたい。
他のサイトをもとにしながら、把握できた限りの内容をかいつまんで説明すると…
画像出典:左から http://hats.jp/ 、 https://www.irasutoya.com/ 、 http://oyj.co.jp/
例えば、お手元にある「音楽に強いもじゃもじゃ」が、パパイヤ鈴木なのか葉加瀬太郎なのか、機械学習によって判別したいとき。
こういった、「正体」「ボリューム」「スピード」のわかっているデータサンプル(教師と呼ばれる)を読み込ませると、
コンピュータが何らかの方法で、未知のデータを振り分ける基準となる線(二次元以上であることがほとんどなので「超平面」と呼ばれる)を引いてくれる。
あとはこうして出来た判別機に、未知のもじゃもじゃのスピードとボリュームを読み込ませれば、パパイヤ鈴木か葉加瀬太郎かわかる、というのが基本的な流れのだが、
前述のサポートベクターマシンとやらはこの線を引く方法の一種で、引き方が他のモデルとくらべてかなりイイカンジ(境界の近くにあるデータから、なるべく距離を取って線を引くようにしている。グレーの矢印を参照)だということらしい。
へー。
※ちなみに、ちかごろプロ騎士やらプロポーカープレイヤーやらを倒すために使われている「深層学習」とやらは、上の図でいうところの「線を引く」操作がめちゃめちゃ難しい問題(入力が数値じゃなくて画像だったりとか)に対して、人間の脳を模した仕組みで何段階も計算をさせて挑む、というものらしいです。
上の例で言えば、例えばまずスピードだけを頼りに予想をし、外れる度に予想材料の中でスピードの比重を減らしていく、というようなことをしているっぽいんですが、正直よくわかりませんでした。
最近はインターネットにさまざまな情報がアップされているので、この程度しか理解していないchocoxinaでも機械学習に手を出すことができる。おかげで領土問題も解決するわけだし大変ありがたいことだ。
さて、サポートベクターマシン(略してサベマ)は、
なんかすごいフリーソフト(R言語の実行環境)に、別のなんかすごいやつ(e1071というパッケージ)をインストールすると簡単に実行できるようなので、試しにやってみよう。
その筋では有名なirisデータとやら(アヤメの花150本について、ガクや花びらの大きさと品種名を一覧にしたもの)を用意し、
1~149件目のデータをもとに150件目の品種を予想させてみると…
あまりにもあっけなく正解が出てしまった。
動画でお見せできない(地味すぎるから)のが残念だが、プログラムを実行してから結果が出るまでわずか3秒ほどで、コードを書く時間を含めてもせいぜい10分程度のものだ。
機械学習とかいう仰々しいものが、こんなに簡単にできてしまっていいのだろうか。この調子でいけば俺も来月あたり羽生善治に勝てるぞ。
アヤメはもう生えていなかったので、代わりに近所にあった色の似ている花をご覧ください。俺はこの花が何かも分からないのに、コンピュータを使えばアヤメの品種を見分けることができる。
step2. データの用意
ともかく、機械学習が存外にチョロい(言うまでもなく、先人達の多大なる努力の賜物です)ことが判明したので、今度は機械に読ませるデータを作成しよう。
ざっと調べた結果、政府の調べた各種統計情報が以下のサイトにまとまっていたので、ありがたく使わせていただく。
最初のうちは「どんなデータを読ませれば判別しやすくなるかな」などと考えながらデータを見繕っていたのだが、途中であまりの量にめんどくさくなってやめた。そういうのはコンピュータさんサイドで判断するべきだと思う。
最終的に、役所の緯度経度や人口、他の自治体に働きに出ている人の数やもろもろの施設数など、90件以上のデータを見境なく放り込んだ。
ところで、各市区町村の人口について、はじめは神奈川県のサイトから調べようとしていたのだが
いらん空白とかがやたら入っていて使いにくい、いわゆる「ネ申エクセル」が出てきて軽くイラつきました。
イラついた話で段落を終えるのも何なので、先ほどとはまた別の花をご覧ください。
step3. モデル(?)のチューニング(?)
さて、さきほどアヤメの品種を予想する際には省略したが、機械学習によってより高精度な結果を出すには、いくつかの設定をこちらで追加してやる必要がある。
具体的には
- γ(ガンマ値):判別に使う平面をどのくらい複雑な形にするか(数値が少ないほど「ズバっとした感じ」で分類する)
- C(コスト):学習時に、一見例外っぽいデータ(かなり速いのに葉加瀬太郎だったもじゃもじゃ等)をどのくらい考慮するか
以上の二つだ。
γとかいう難しい記号が見えて面食らった方もいるかも知れないが、もう二度と出さないので安心して読み進めてほしい。
ともかく、万一このあたりの調整を誤ると、例えば
図抜けてスピードの低いもじゃもじゃをなぜかパパイヤ鈴木に分類したり、
既存のデータを完璧に分類することにこだわり過ぎて、新しいデータに対応できなくなってしまったりする(いわゆる「過学習」というやつだ)。
このあたりの、いわゆるハイパーパラメータ(かっこいい)を調整するのはきっと相当骨の折れる作業なのだろう、と覚悟していたのだが、
ネットで見つけたコードを一行書いて一晩放っておいたら、勝手に最適な値を見つけてくれた。こういうのもコンピュータさんサイドで判断してくれるのか。
ちなみに、この値を用いて分類を行うと、正答率は80%強だとのこと。
機械学習の成果が必要とされるほとんどの場面では不十分な値だが、そもそも我々は町田の所属を高々5割の精度でしか判別できないのだから、あまり文句を付けないでほしい。 じゃあお前プロ棋士に勝てるのかよコンピュータは勝ってるんだぞ
step4. 本試験
道具もデータもそろったので、いよいよコンピュータに町田市領土問題を解決してもらおう。
最終的に、コードはこのような内容になった(むろん興味のない人は読まなくていいです)。
#パソコンさん向けの下準備 library(e1071) setwd('/hoge/machida') #データの読み込み shikuchoson.data <- read.csv("shikuchoson.csv", fileEncoding = "UTF-8-BOM") #データを町田とそれ以外に分ける machida <- grep("町田市", shikuchoson.data$"市区町村") test<- shikuchoson.data[machida,] train <- shikuchoson.data[-machida,] #町田以外の例を使って、データから都道府県を判定する方法を学習 shikuchoson.svm <- svm(都道府県~., data=train,type="C",gamma=0.00000001,cost=10000000) #町田が東京か神奈川か判定する (predict(shikuchoson.svm, test))
「学習」「判定」がそれぞれ一行で済んでいるのは何度見てもソワソワするというか、パンツを履き忘れたまま外に出てしまったみたいな落ち着かなさがある。
ともかく、このコードをうやうやしく実行したところ
5秒ほどで結果が出た。
機械学習による分類の結果、町田は東京都であることが判明しました。知ってた。
さいごに
以上、機械学習を用いた分類の結果、町田市は(80%以上の確率で)東京都であることがわかった。
みなさんが今後の人生でこの手の領土問題に遭遇したら、ぜひ当記事を紹介し、紛争の解決に役立てていただきたい。
正直「神奈川」って言ってくれたほうが美味しかったんだけど、どこを弄ればズルできるのかよくわかりませんでした。
また個人的には、その手の冗談を抜きにしても「いわゆる機械学習」に触れられたのは単純に収穫だったし、よりシンプルなデータが相手なら、自分でも実用的に使えるんじゃないか、という手ごたえが感じられた。
皆様も、例えば仕事で何らかの意見を求められたときなどに、この記事を参考にしながら適当な数字をPCに放り込めば「機械学習の結果によれば――」とか言って上司をビビらせられるはずだ。
ちなみに、今回のコードで筆者の生まれ故郷、東京都の東大和市について調べてみたところ
神奈川県だとのことでした。コンピュータさんが言うからにはそうだったんだろうと思います。
以下、技術的(?)な考察
gamma=0.00000001,cost=10000000という設定ではおそらくかなり明快な超平面を引いてると思うんだけど、そのくらいハッキリした面が引けるデータなら、どこかに目視で見てもわかるような傾向があるのだろうか。少なくとも自分が試した限りは目がチカチカしてよくわかんなかったです。
この手の判別器はでかい数字に引っ張られる(意訳)というような話を聞いたことがあるので、たぶん「人口が多ければ東京都」みたいな雑な分け方をしていると思われます。
最後までお読みいただきありがとうございます。こちらは神奈川県東大和市にあった花です。