このエントリーをはてなブックマークに追加

2017年1月21日土曜日

配牌からあがれる可能性を予測する!(その2 教師データの作成)

こんにちは、Taroです。
前回の記事の記事の続きになります。
配牌からあがれる可能性を予測する!(その1 推論処理)
次回は学習を実装する、と記載しましたが、その前に教師データを取得する方法を実装したいと思います。
今回はDeep LearningというよりはPythonの勉強といった感じです。

教師データの選定


麻雀のようなギャンブルにおいて、教師になるデータは何なのか?
考え出すとキリがなさそうなので、ひとまずプロの対局からデータを作成しました。
プロであれば、(もちろん技術や個性、状況で異なってくるとは思いますが)あがりやすい配牌は必ず仕上げてくれるはずです。
そのため、Youtubeでプロの対局を見続けました(ある種これが苦行かもしれません笑)。
余談ですが、個人的に好きなプロ雀士は土田浩翔プロです。

CSVファイルの作成


教師データはCSVファイルにまとめます。
今回必要なデータは、 配牌結果 なので、下記のようにまとめました。
tile_1 tile_2 tile_3 tile_4 tile_5 tile_6 tile_7 tile_8 tile_9 tile_10 tile_11 tile_12 tile_13 win loss
11 13 17 21 25 27 29 31 31 31 35 43 47 1 0
このデータを読み込んでいきたいと思います。

CSVファイルの読み込み


Pythonのcsvモジュールを利用して簡単に実装します。
(というよりこれくらいしか分からない。。。)
   def load_trainig_data(self):
        u"""
        CSVファイルから教師データを読み込み、データを返します。
        @return array
        [0]で教師データの配牌、[1]で結果を返します
        """
        with open('csv/training_data.csv', 'r', newline='') as csvfile:
            reader = csv.reader(csvfile)
            header = next(reader)
            hand = []
            results = []
            for row in reader:
                tmp_hand = []
                for tile in range(0, 12):
                    tmp_hand.append(row[tile])

                results.append([row[13], row[14]])
                hand.append(tmp_hand)

        return hand, results
このメソッドをMyHandクラスに追加しました。
from my_hand import *
my_hand = MyHand()
input_data, results = my_hand.load_trainig_data()
print(input_data)
[['47', '26', '17', '21', '47', '12', '42', '43', '34', '15', '45', '37'], ['42', '42', '41', '17', '39', '21', '39', '15', '37', '11', '11', '21'], ['47', '35', '22', '22', '23', '26', '12', '13', '17', '18', '39', '38'], ['22', '24', '24', '25', '28', '31', '32', '33', '13', '13', '14', '16'], ['41', '47', '31', '12', '29', '18', '45', '34', '19', '22', '18', '39'], ['46', '15', '15', '16', '16', '47', '45', '11', '43', '32', '34', '27'], ['41', '41', '43', '44', '44', '17', '14', '13', '13', '23', '23', '33'], ['35', '38', '39', '39', '23', '25', '26', '27', '28', '16', '42', '42'], ['45', '47', '39', '44', '43', '21', '36', '27', '13', '32', '39', '16'], ['21', '28', '32', '35', '21', '23', '35', '12', '18', '37', '45', '14'], ['12', '14', '15', '17', '41', '44', '34', '35', '22', '23', '23', '26'], ['24', '24', '29', '31', '32', '36', '37', '38', '39', '13', '17', '47']]
print(results)
[['0', '1'], ['1', '0'], ['0', '1'], ['0', '1'], ['0', '1'], ['0', '1'], ['1', '0'], ['0', '0'], ['1', '0'], ['0', '0'], ['0', '0'], ['0', '0']]
これだとちょっと分かりづらいので、1つ目の要素だけ抜き出します。
print(input_data[0])
['47', '26', '17', '21', '47', '12', '42', '43', '34', '15', '45', '37']
print(results)
['0', '1']
これで、教師データが読み込めました。
(これで正しいのかは置いておきます笑)

Jupyter Notebookで書いてみたよ!


Jupyterという単語は見たことがあったのですが、ずっとライブラリの1つだと思っていました笑。
実はエディタのようで、データサイエンティストの人などが、実際に実行したプログラムを確認しながら文章を書いたりするもののようです。
Anacondaをインストールすると一緒についてきます。
詳しいことは諸先輩方が記述しておりますので、割愛しますが、本記事も下図のように書きました。
プロジェクト上に配置しておけば、自作のコードも読み込んで実行してくれます。
Python以外の言語もサポートしているようなので、コードと実行結果をブログにのせたいときは使用を検討しても良いのではないでしょうか?

2017.01.21 追記


何も考えずに、Jupyterが生成してくれたソースコードを貼り付けたら、Google bloggerのCSSなどを上書きしてしまったようで、不都合が生じました。
急いで書き直したので、結局普通になってしまいました。。。笑
ブログなどに貼り付けるときは事前に検討が必要です。

おわりに


今回のソースコードは下記になります。
Jupyter Notebookで作成したファイルは.ipynb拡張子で保存されています。
https://github.com/naoki85/python_mahjong
次回は、今度こそ学習ロジックの実装をしたいと思います!

0 件のコメント:

コメントを投稿