Skip to content

Instantly share code, notes, and snippets.

@tomohxx
Last active January 11, 2021 09:04
Show Gist options
  • Save tomohxx/286d73b383892ece9c9e152056b33de6 to your computer and use it in GitHub Desktop.
Save tomohxx/286d73b383892ece9c9e152056b33de6 to your computer and use it in GitHub Desktop.
牌の危険度推定(多変量RNN)
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 牌の危険度推定(多変量RNN)\n",
"\n",
"## 概要\n",
"- 立直者の捨て牌から牌の危険度を推定する\n",
"- マルチラベルクラス分類"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import math\n",
"import tensorflow as tf\n",
"from tensorflow import keras\n",
"from tensorflow.keras import layers\n",
"from sklearn.model_selection import train_test_split"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"model = keras.Sequential()\n",
"model.add(layers.Masking(input_shape=(None, 35), mask_value=-1.0))\n",
"model.add(layers.SimpleRNN(35, return_sequences=False))\n",
"model.add(layers.Dense(34, activation=\"sigmoid\"))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: \"sequential\"\n",
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"masking (Masking) (None, None, 35) 0 \n",
"_________________________________________________________________\n",
"simple_rnn (SimpleRNN) (None, 35) 2485 \n",
"_________________________________________________________________\n",
"dense (Dense) (None, 34) 1224 \n",
"=================================================================\n",
"Total params: 3,709\n",
"Trainable params: 3,709\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"model.summary()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"model.compile(\n",
" optimizer=keras.optimizers.RMSprop(),\n",
" loss=keras.losses.binary_crossentropy,\n",
" metrics=[keras.metrics.binary_accuracy],\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv('riichi_river.csv', header=None)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(129932, 20, 35)\n",
"(129932, 34)\n"
]
}
],
"source": [
"x, y = [], []\n",
"\n",
"for row in df.itertuples(name=None, index=None):\n",
" # 待ち牌のリスト\n",
" waits = [int(el) for el in row[1].split()]\n",
" # 捨て牌のリスト\n",
" discards = [int(el) for el in row[2].split()[0:][::2]]\n",
" # ツモ切りフラグのリスト(ツモ切り: 1, 手出し: 0)\n",
" tsumos = [int(el) for el in row[2].split()][1:][::2]\n",
" \n",
" tmp_x = [[0]*35]*20\n",
" \n",
" for i in range(len(discards)):\n",
" tmp_x[i][discards[i]] = 1\n",
" tmp_x[i][-1] = tsumos[i]\n",
" \n",
" for i in range(len(discards), 20):\n",
" tmp_x[i] = [-1 for _ in range(35)]\n",
" \n",
" tmp_y = [1 if i in waits else 0 for i in range(34)]\n",
"\n",
" x.append(tmp_x)\n",
" y.append(tmp_y)\n",
" \n",
"x = np.array(x)\n",
"y = np.array(y)\n",
"\n",
"print(x.shape)\n",
"print(y.shape)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.2344 - binary_accuracy: 0.9313\n",
"Epoch 2/20\n",
"1625/1625 [==============================] - 16s 10ms/step - loss: 0.1947 - binary_accuracy: 0.9470\n",
"Epoch 3/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1920 - binary_accuracy: 0.9470\n",
"Epoch 4/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1903 - binary_accuracy: 0.9471\n",
"Epoch 5/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1895 - binary_accuracy: 0.9470\n",
"Epoch 6/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1887 - binary_accuracy: 0.9471\n",
"Epoch 7/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1888 - binary_accuracy: 0.9470\n",
"Epoch 8/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1882 - binary_accuracy: 0.9471\n",
"Epoch 9/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1881 - binary_accuracy: 0.9471\n",
"Epoch 10/20\n",
"1625/1625 [==============================] - 16s 10ms/step - loss: 0.1878 - binary_accuracy: 0.9471\n",
"Epoch 11/20\n",
"1625/1625 [==============================] - 18s 11ms/step - loss: 0.1874 - binary_accuracy: 0.9471\n",
"Epoch 12/20\n",
"1625/1625 [==============================] - 18s 11ms/step - loss: 0.1872 - binary_accuracy: 0.9472\n",
"Epoch 13/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1870 - binary_accuracy: 0.9471\n",
"Epoch 14/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1873 - binary_accuracy: 0.9470\n",
"Epoch 15/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1873 - binary_accuracy: 0.9470\n",
"Epoch 16/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1870 - binary_accuracy: 0.9471\n",
"Epoch 17/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1867 - binary_accuracy: 0.9471\n",
"Epoch 18/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1868 - binary_accuracy: 0.9470\n",
"Epoch 19/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1867 - binary_accuracy: 0.9471\n",
"Epoch 20/20\n",
"1625/1625 [==============================] - 15s 9ms/step - loss: 0.1866 - binary_accuracy: 0.9470\n"
]
}
],
"source": [
"history = model.fit(x_train, y_train, batch_size=64, epochs=20)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Evaluate on test data\n",
"407/407 [==============================] - 2s 4ms/step - loss: 0.1873 - binary_accuracy: 0.9471\n",
"test loss, test acc: [0.18734900653362274, 0.9471310973167419]\n"
]
}
],
"source": [
"# Evaluate the model on the test data using `evaluate`\n",
"print(\"Evaluate on test data\")\n",
"results = model.evaluate(x_test, y_test, batch_size=64)\n",
"print(\"test loss, test acc:\", results)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"predictions = model.predict(x[1].reshape(1, 20, 35))[0]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# 危険度をプロット\n",
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# 当たりの牌にマーク\n",
"mark_point = [i for i in range(34) if y[1][i]]\n",
"\n",
"plt.plot(range(34), predictions, marker=\"o\", markevery= mark_point)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment