はじめに
初投稿です。
社内のLT用に拵えたネタを書き記します。
(今後も継続してアウトプットしていけるよう精進します、、)
目次
- 前置き・目的
- システム全体の流れ
- 詳細
- 実践結果発表
- 結論
- TODO
1.前置き・目的
タイトル:『趣味 × 機械学習』
という大々的なタイトルなんですが、
私の趣味は**パチスロ**です。
パチスロとは
パチンコ店に設置されているスロットマシンのことで、法律では『回胴式遊技機』という名前を付けられている。
パチンコ店にあるスロットマシンだから、パチスロと呼ばれている。
パチスロには**6段階(※)**の設定と呼ばれるものがあり、閉店後にパチンコ店員が手作業で変えている。
※すべての機種が6段階というわけではありません。
具体的な例を挙げて説明していきます。
『ゴーゴージャグラーKK(北電子様)』
(こちらの顔ならご存じの方も多いかと思います。)
先ほど説明したように、スロットの台には設定というものがあり、
おおよそ6段階に設定されています。
そして、設定が上がっていくにつれて機械割という台のスペックも上がっていきます。
この設定というものは、毎晩パチンコ屋の店員さんが手作業で変更しているものになります。
※据え置きということもあります。
そこで私は考えました。
手作業で設定を入れているなら、
無意識に法則性が生まれているのでは...?
ということで、目的
パチスロのデータを収集し、機械学習を用いて法則を導いて、必ず勝利する。
2.システム全体の流れ
今回のシステムをめちゃくちゃアバウトに説明すると以下の構図です。
それぞれ順を追って説明していきます。
3.詳細
① データ収集
本システムはPythonを用いて実装しています。
環境
Windows10 + Anaconda3
使用したライブラリ
収集期間
2019/7/15 - 2019/9/14
※毎日23:20に収集
実際に収集してきたデータ
年 | 月 | 日 | 曜日 | 台 | 台番号 | BIG | REG | 合成確率 | 累計ゲーム |
---|---|---|---|---|---|---|---|---|---|
2019 | 7 | 16 | 火 | ハナハナホウオウEX-30-2 | 1353 | 12 | 7 | 1/199.2 | 3784 |
2019 | 7 | 16 | 火 | ハナハナホウオウEX-30-2 | 1355 | 12 | 8 | 1/121.9 | 2438 |
2019 | 7 | 16 | 火 | ハナハナホウオウEX-30-2 | 1356 | 4 | 1 | 1/338.4 | 1692 |
2019 | 7 | 16 | 火 | ハナハナホウオウEX-30-2 | 1357 | 9 | 9 | 1/176.7 | 3179 |
2019 | 7 | 16 | 火 | ハナハナホウオウEX-30-2 | 1358 | 2 | 1 | 1/148.4 | 445 |
■ つまずきポイント
パチンコの出玉情報を見れるサイトがスマホからのアクセスのみ対応だった。
chromedriverのオプションでデバイスを指定して解決
mobile_emulation = { "deviceName": "Nexus 5" } chrome_options = webdriver.ChromeOptions() chrome_options.add_experimental_option("mobileEmulation", mobile_emulation) driver = webdriver.Chrome("C:/chromedriver.exe", desired_capabilities = chrome_options.to_capabilities()) driver.get("パチ屋のURL")
② 機械学習
scikitlearnの『ランダムフォレスト』を利用。
今回はジャグラーの拡大でデータを止めて学習、
学習させたモデルから、その台がその日、設定いくつなのかを予測!!
- 目的変数:設定
- 説明変数:年月日、曜日
全然スマートじゃない前処理
# ごちゃごちゃdataframeをいじくった後に、、 # 確率から設定を推測(目的変数なのに推測値という...) tmp = line[1][8].split("/") hoge = float(tmp[0]) / float(tmp[1]) if hoge >= my_pro[5]: hoge_np = np.append(hoge_np, 5) elif hoge >= my_pro[4]: hoge_np = np.append(hoge_np, 4) elif hoge >= my_pro[3]: hoge_np = np.append(hoge_np, 3) elif hoge >= my_pro[2]: hoge_np = np.append(hoge_np, 2) elif hoge >= my_pro[1]: hoge_np = np.append(hoge_np, 1) else: hoge_np = np.append(hoge_np, 0) # ほかにもいろいろとごちゃごちゃ...
いじったら学習モデルにポイ投げ
# 訓練用と評価用に分ける x_train, x_test, y_train, y_test = model_selection.train_test_split(x, y, test_size=0.2) # 学習 model = RandomForestClassifier() model.fit(x_train, y_train)
③ 実践
■ 実践日
2019/10/5(土)
■ ロケーション
某パチンコ屋
#### 運命の予測結果は、、、こちら!!! ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443963/d14d46a6-96b7-4682-4a4a-b6231c44e941.png)
これは1257番のジャグラー(設定は5!!)を打てば絶対勝てる!!
ということで、
4.実践結果発表
普段打ちに行くときは諭吉を三人ほど連れて行くのですが、
今回は勝てるので、諭吉二人で実践に臨みました!!
果たして結果は、、!!!
### ↓
はい、見事に諭吉二人を持っていかれました。
5.結論
そんなに甘くない。
6.TODO
以下反省点を踏まえ、絶対に勝てるようブラッシュアップしていきます。
目指せ億万長者!!
※次負けたら引退します。
最後までお付き合いいただきありがとうございました。
反省点
- 説明変数が尤もらしくない。
- 前日の設定や左右の台の設定は考慮すべき。
- 店の傾向を観察すべき。
- そもそもデータ数が多くない。
- というか傾向とかあるかわからない。
- 設定推測できたとしても勝てるとは限らない。(パチスロの闇)