百人一首AIを作る

今回のテーマは百人一首AI
と言っても、音を聞いてとるまではパパッとは作れないので、とりあえず決まり字で札を判別できるようなAIを作ってみます!
ルールベースでいけるじゃんと思った方いますよね?
その通りです。。。
ただ、ここはデータサイエンティストとしてあえてルールベースを使わず、上の句と下の句のデータで学習を行い、勝手に決まり字で取れるように進化させることを目標にします!

## 百人一首とは?
百人一首は5.7.5の上の句と7.7の下の句に分けられ、上の句を読んでいる間に下の句の札を取るという競技です。
例えば「秋の田の　かりほの庵の　苫をあらみ　わが衣手は　露にぬれつつ」という俳句は「秋の田の　かりほの庵の　苫をあらみ」と読んでいるうちに「わが衣手は　露にぬれつつ」という札を取ります。
しかし百人一首には決まり字というものがあり、「あき」までであれば他に「秋風に たなびく雲の たえ間より もれ出づる 月の影のさやけさ」という句があるのでまだどちらの札を取ればいいか判断できませんが、「あきの」で始まる札は他にないのでここまで読まれば「わが衣手は　露にぬれつつ」を取ることができるのです。
<img width="646" alt="pic3.png" src="https://qiita-image-store.s3.amazonaws.com/0/185304/bf50cb40-7a42-2450-1064-1b7ed10a2eab.png">

## 今回やること!
<img width="388" alt="pic4.png" src="https://qiita-image-store.s3.amazonaws.com/0/185304/45770396-261e-9d32-e8e0-6aedd7606d92.png">
こんな感じでAIを鍛えます!
学習によりAIは上の句を全部読むと下の句がどれか判断できるようになります。
<img width="742" alt="pic1.png" src="https://qiita-image-store.s3.amazonaws.com/0/185304/347ce57a-d5c3-0010-cce4-1377c769af86.png">


このAIに、決まり字までの上の句を読んだ場合、取るべき札を予測できるかというのがテーマです。
<img width="776" alt="pic2.png" src="https://qiita-image-store.s3.amazonaws.com/0/185304/fa313f4d-82ea-1330-de32-ec3eec23cba4.png">

## 使う手法
Deep Leaningの時系列モデルの1つであるLSTMを使います。
詳しい説明は([こちらのページ](https://qiita.com/t_Signull/items/21b82be280b46f467d1b))をみてください!

## データの準備
データは[こちらのページ](http://kysmo.hatenablog.jp/entry/2017/11/07/124156)に上がっていた百人一首のcsvを少し改変して使いました。

```py

import pandas as pd
df = pd.DataFrame("data.csv")
df.head(5)
```

|No	|上の句（ひらがな）	|下の句（ひらがな）	|決まり字|
|---|---|---|---|
|1	|あきのたのかりほのいほのとまをあらみ	|わがころもではつゆにぬれつつ	|あきの|
|2	|はるすぎてなつきにけらししろたへの	|ころもほすてふあまのかぐやま	|はるす|
|3	|あしびきのやまどりのをのしだりをの	|ながながしよをひとりかもねむ	|あし|
|4	|たごのうらにうちいでてみればしろたへの	|ふじのたかねにゆきはふりつつ	|たご|
|5	|おくやまにもみぢふみわけなくしかの	|こゑきくときぞあきはかなしき	|おく|

上の句(ひらがな)から下の句(ひらがな)を予測するAIを作り、決まり字のひらがなだけで下の句(ひらがな)を予測できるか検証します。

## コーディング
keras使ってLSTMのモデル組みました〜
コードは[github](https://github.com/okotaku/hyakunin-issyu-lstm)にあげておきくので見たい人はぜひ!!


## 結果
上の句全体から下の句を予測する学習は精度100%になりました。
果たして決まり字から予測できたのか!?
結果は。。。**4%!?**
100枚あって正解は4枚だけ。。。全然ダメでした。笑
合っていたのは決まり字が「あまの」「やまざ」「あさぼらけう」「たま」の4つでした。

## なぜだめだったのか?
<img width="640" alt="pic5.png" src="https://qiita-image-store.s3.amazonaws.com/0/185304/bb7a5745-914b-0937-81b4-bd1fc444f58e.png">
今回使用したLSTMという手法は忘却層というものがあり、最初の方の入力、つまり1文字目や2文字目の情報をどんどん忘れていきます。
本来はこれはより複雑なデータを精度良く予測できるのですが、今回は上の句の前半の方から予測するというタスクだったので、前半の方を忘却してしまい、うまくいかなかったのかもしれません。

## 入力を逆さにすればいけるんじゃないか?
逆さにすることで決まり字のあたりの忘却を防ごう!と考え、学習する時に逆さに読むようにしました。
<img width="516" alt="pic6.png" src="https://qiita-image-store.s3.amazonaws.com/0/185304/69dabd65-d7f4-26ef-c21e-69684a521243.png">
しかし結果は。。。**精度2%**。。。
ダメダメですね。

## またまたなぜダメだったのか?
少し簡略化して説明します。厳密には式がもう少し複雑だったりしますがそこは目を瞑りましょう。
例えばアイスの売り上げを予測するAIはどういう風に予測するのかというと、下の式のようになります。
<img width="521" alt="pic7.png" src="https://qiita-image-store.s3.amazonaws.com/0/185304/54500e94-097d-5950-def0-19681058c5e0.png">
この時、気温が28度、駅からの距離が100mの場合、
<img width="318" alt="pic8.png" src="https://qiita-image-store.s3.amazonaws.com/0/185304/5246e065-16bb-dede-18a3-a6f1190a1a4b.png">
から、アイスの売り上げが80本と求められます。
今回やったタスクは、この時に気温だけからアイスの売り上げを求めるというものになっていました。
<img width="288" alt="pic9.png" src="https://qiita-image-store.s3.amazonaws.com/0/185304/28644f12-dae5-c790-96d8-8d021ed59d79.png">
全然違う値になっちゃうんですよね。

今回も「あきのたのかりほのいほのとまをあらみ」から予測するような式を作っていたのに
、「あきの」だけから予測しようとしてもできるはずがないですよね。
<img width="398" alt="pic10.png" src="https://qiita-image-store.s3.amazonaws.com/0/185304/108d95a2-eda7-e5d6-4f01-c43de46a8e41.png">
失敗を引き起こす原因は以上です。

上の句の文字数を増やしながら予測していくと、12文字で精度100%になりました。
上の句は5.7.5で17文字くらい。それよりは少ない文字でも予想できましたね。
文字数を増やすと段々精度がよくなっていることも分かります。つまり学習のデータと検証のデータが似ているほど、AIのパフォーマンスが上がるということですね。
<img width="398" alt="pic11.png" src="https://qiita-image-store.s3.amazonaws.com/0/185304/4ccee88d-ce6e-c04e-98e3-0b1b3b9216e0.png">

## 結論
AIを学習するときは、ちゃんと本番と同じ環境のデータで学習しましょう。
今回のように学習のデータは上の句全てで行なったのに、予測の時には決まり字までの数文字で予測するというのではうまくいきません。
これは実社会でも一緒で、学習の時には北海道のアイスの売り上げで学習して、沖縄のお店でアイスの売り上げを予測しようとしてもうまくいきません。
この場合は沖縄のデータで学習しましょう。