{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# STK player bot detector with SageMaker Linear Regression - Logistic Regression¶\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Install packages" ] }, { "cell_type": "code", "execution_count": 707, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: mysql-connector-python in /home/ec2-user/anaconda3/envs/pytorch_latest_p36/lib/python3.6/site-packages (8.0.21)\n", "Requirement already satisfied: protobuf>=3.0.0 in /home/ec2-user/anaconda3/envs/pytorch_latest_p36/lib/python3.6/site-packages (from mysql-connector-python) (3.13.0)\n", "Requirement already satisfied: six>=1.9 in /home/ec2-user/anaconda3/envs/pytorch_latest_p36/lib/python3.6/site-packages (from protobuf>=3.0.0->mysql-connector-python) (1.15.0)\n", "Requirement already satisfied: setuptools in /home/ec2-user/anaconda3/envs/pytorch_latest_p36/lib/python3.6/site-packages (from protobuf>=3.0.0->mysql-connector-python) (49.2.0.post20200714)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "bash: line 2: /home/ec2-user/SageMaker/amazon-aurora-call-to-amazon-sagemaker-sample/stk-sample/env-build/sagemaker/env: No such file or directory\n", "WARNING: You are using pip version 20.1.1; however, version 20.2.3 is available.\n", "You should consider upgrading via the '/home/ec2-user/anaconda3/envs/pytorch_latest_p36/bin/python -m pip install --upgrade pip' command.\n" ] } ], "source": [ " %%bash \n", "home=`pwd`\n", ". $home/env\n", "pip3 install mysql-connector-python" ] }, { "cell_type": "code", "execution_count": 708, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "arn:aws:iam::163538056407:role/service-role/AmazonSageMaker-ExecutionRole-20200913T212219\n" ] } ], "source": [ "import sagemaker\n", "execution_role = sagemaker.get_execution_role()\n", "print(execution_role)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get training and test data from Aurora DB" ] }, { "cell_type": "code", "execution_count": 711, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 6.05 ms, sys: 0 ns, total: 6.05 ms\n", "Wall time: 5.6 ms\n" ] } ], "source": [ "%%time\n", "\n", "import json\n", "import boto3\n", "import csv\n", "import mysql.connector\n", "import sys\n", "import os\n", "import configparser\n", "\n", "config = configparser.ConfigParser()\n", "\n", "config.read('rds.ini')\n", "\n", "ENDPOINT=config['default']['ENDPOINT']\n", "USR=config['default']['USR']\n", "PASWD=config['default']['PASWD']\n", "REGION=config['default']['REGION']\n", "DBNAME=config['default']['DBNAME']\n", "\n", "client = boto3.client('rds')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Getting the right size of the grouping" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%time\n", "import pandas as pd\n", "\n", "group_size=100\n", "\n", "try:\n", " conn = mysql.connector.connect(host=ENDPOINT, user=USR, passwd=PASWD, port=3306, database=DBNAME)\n", " cur = conn.cursor()\n", " cur.execute(\"\"\"SELECT count(id) from actions where class is not null\"\"\")\n", " actions_size_list=cur.fetchall()\n", " actions_size_df=pd.DataFrame(actions_size_list)\n", " actions_size=actions_size_df[0].values[0]\n", " print(\"actions_size=\"+str(actions_size))\n", " modulo_size=actions_size/group_size\n", " print(\"modulo_size=\"+str(modulo_size))\n", "except Exception as e:\n", " print(\"Database connection failed due to {}\".format(e))" ] }, { "cell_type": "code", "execution_count": 681, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Database connection failed due to 2005 (HY000): Unknown MySQL server host 'stk-instance-1.ccgqlhzmgy9f.us-west-2.rds.amazonaws.com' (0)\n", "CPU times: user 1.89 ms, sys: 0 ns, total: 1.89 ms\n", "Wall time: 55.5 ms\n" ] } ], "source": [ "%%time\n", "import pandas as pd\n", "\n", "modulo_size=100\n", "\n", "try:\n", " conn = mysql.connector.connect(host=ENDPOINT, user=USR, passwd=PASWD, port=3306, database=DBNAME)\n", " cur = conn.cursor()\n", " \n", " cur.execute(\"\"\"SELECT id,m_ticks,m_action,m_value,m_value_l,m_value_r,class FROM actions WHERE class=1 order by id\"\"\")\n", " bot_action_list=cur.fetchall()\n", " cur.execute(\"\"\"SELECT id,m_ticks,m_action,m_value,m_value_l,m_value_r,class FROM actions WHERE class=0 order by id\"\"\")\n", " player_action_list=cur.fetchall() \n", " cur.execute(\"\"\"\n", " SELECT FLOOR(id/100) sessionid,id,m_ticks,m_kart_id,m_action,m_value,m_value_l,m_value_r,class\n", " FROM actions \n", " WHERE class IS NOT NULL\n", " ORDER BY id,m_kart_id \n", " \"\"\")\n", " action_list=cur.fetchall() \n", "except Exception as e:\n", " print(\"Database connection failed due to {}\".format(e))\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Investigate and process the data" ] }, { "cell_type": "code", "execution_count": 682, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "bot_actions = pd.DataFrame(bot_action_list)\n", "player_actions = pd.DataFrame(player_action_list)" ] }, { "cell_type": "code", "execution_count": 683, "metadata": {}, "outputs": [], "source": [ "bot_actions.rename(columns={0:'id',\n", " 1:'m_ticks',\n", " 2:'m_action',\n", " 3:'m_value',\n", " 4:'m_value_l',\n", " 5:'m_value_r',\n", " 6:'class'\n", " }, \n", " inplace=True)" ] }, { "cell_type": "code", "execution_count": 684, "metadata": {}, "outputs": [], "source": [ "player_actions.rename(columns={0:'id',\n", " 1:'m_ticks',\n", " 2:'m_action',\n", " 3:'m_value',\n", " 4:'m_value_l',\n", " 5:'m_value_r',\n", " 6:'class'\n", " }, \n", " inplace=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Let's look for interesting data patterns" ] }, { "cell_type": "code", "execution_count": 685, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Corralation between ticks in bots and humans" ] }, { "cell_type": "code", "execution_count": 686, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "bot_actions.plot(kind='scatter',x='id',y='m_ticks',color='red')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 687, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "player_actions.plot(kind='scatter',x='id',y='m_ticks',color='blue')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Correlation between action values in bots and humans" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that `m_ticks` are random for humans and consistent for bots.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Correlation between action values in bots and humans" ] }, { "cell_type": "code", "execution_count": 688, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "bot_actions.plot(kind='scatter',x='id',y='m_value',color='red')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 689, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEGCAYAAABVSfMhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3df5RU9X3/8ecbdhcQgj9HDwV0sdJEYlKIK1/7NSdtIqJJf6ipNmzaisk25Ic2RtM0mvTYX1/Pqe2JNtZoMMFCfnSVmh/SHG0ENWmbWmENGn/Fr5uwCEplUiMCQWDh/f3j85nvzu7OLvfOzp2Zu/t6nDNn7nzmfmY+H5id99zPfd/Px9wdERGRepnU6AaIiMjEosAjIiJ1pcAjIiJ1pcAjIiJ1pcAjIiJ11dLoBjTCCSec4O3t7Y1uhohIrjz22GM/c/fCWF9nQgae9vZ2enp6Gt0MEZFcMbOttXgdDbWJiEhdKfCIiEhdKfCIiEhdKfCIiEhdKfCIiEhdTcistmr94Afw9a9DWxuccQacfDIsWgSFAhSL8PDD0NsLp50GRx0Fv/3bjW7xxDIR57v95CfhpptGfn7ePPjpT7Ntg1m2ry+197Wvwe//fuPe3ybi7NQdHR2eNp166VJYv354eVsbrFgBt90Ghw/XqIFStYn0cZ48OflnLqt/FwWd/Jo7F154IV0dM3vM3TvG+t4aakvgBz+oHHQADhyAW29V0GkWE+WL8JOfTPeZO/XU2rdhovxbj1fbtoURnEZQ4EnggQca3QKRwe65J93+W7Zk0w7Jt7VrG/O+CjwJLF3a6BaIDHbJJen2nzcvm3ZIvv3e7zXmfRV4EjjnnJGDT1sbXHklTNK/ZFOYKOd4Pve5dENdWSQYTJR/6/Fq7tzGJRgoqy2h73539Ky2669XVlujTaQvwmIRpk6FfftG3y/rrDZ3nevJo0ZntSnwpHDOOeFWSaEw/LB1In0RSn319YUfQOWBZ+ZM2LABzjqrvm3R51zS0gCRSA61t4eMynIHD4ZykWanwCOSQ4UCrFoF06aFI51p08LjwphXShHJnobaRHKqsxOWLAnDbu3tCjqSHwo8IjlWCjZ9fYMfizQzDbXVULEImzaFe5F66O6GU06B884L993djW6RyJEp8NSIvgCk3opF6OoKmW27doX7ri798JHmp8BTA/oCkEYopVSXa20dGHYTaVYKPDWgLwBpBKVUS14p8NSAvgCkEZRSLXmVaeAxs6lmttHMnjCzp83sL2P5cWa23syej/fHltW5zsx6zew5Mzu/rPxMM3syPneLWZiow8ymmNndsfxRM2vPsk+VlH8BTJ+uLwCpn85O2Lo1zFiwdWt4LNLssj7i2Q+8y91/FVgIXGBmZwPXAg+6+3zgwfgYM1sALAPeDFwA3GZmk+Nr3Q6sAObH2wWxvAv4ubufBtwM3Jhxn0bMXitNHaIpRKSeCoUwTY5+6EheZBp4PNgTH7bGmwMXAmti+Rrgorh9IXCXu+939y1AL7DYzGYBM939EQ9Lpn5lSJ3Sa90DnFs6GspCpey1UnLB66/D3r3hXskFIiKVZX6Ox8wmm9njwE5gvbs/Cpzk7jsA4v2JcffZwLay6ttj2ey4PbR8UB137wd2AcdXaMcKM+sxs55ilRFhpOy1zZuVXCAiklTmgcfdD7n7QmAO4ejljFF2r3Sk4qOUj1ZnaDvucPcOd+8oVDkmMVL2Gii5QEQkqbpltbn7q8D3COdmXo7DZ8T7nXG37cDcsmpzgJdi+ZwK5YPqmFkLcDTwShZ9GCl7bdEiZReJiCSVdVZbwcyOidvTgCXAj4F1wPK423Lg3ri9DlgWM9XmEZIINsbhuN1mdnY8f3PZkDql17oEeCieB6q50dJXlV0kIpJM1pOEzgLWxMy0ScBad/+OmT0CrDWzLuAF4FIAd3/azNYCzwD9wBXufii+1keB1cA04P54A1gFfNXMeglHOsuy7NBoMwIXCjrKERE5Esvo4KCpdXR0eE9PT6ObISKSK2b2mLt3jPV1NHOBiIjUlQKPiIjUlQKPSM5pHSjJGwWeDOkLQbKmdaAkjxR4MqIvBMma1oGSvFLgyYC+EKQetA6U5JUCTwb0hSD1oHWgJK8UeDKgLwSph0IhHEmX6+rSRczS/BR4qnCkpAGtDCn1UCyGz1W5Vas0pCvNT4Enpe5uOPlkeOc7w/1ISQOau02ypiFdyaus52obV4pFWL48DJuVLF8e5m6rdDSjudskSxrSlbzSEU8KmzcPDjoQHm/e3Jj2yMSmIV3JKx3xiOTYaLOlizQrHfGksGjRwIqjJW1toVxERJJR4Elhw4bBj1tbYfVq/cqUxtEMGZJHWo8noWIx/GHv2zdQNnUqvPCCAo80RqXP5LRpIYtSn0nJgtbjqbNKqattbUpdlcZROrXklQJPQkpdlWajz6TklQJPQkpdlWajKXMkr3SOJ6ViUamr0hx0jkfqrVbneHQdT0qajUCaRekcT3ngKZ3j0WdUmlmmQ21mNtfMHjazZ83saTO7Kpb/hZm9aGaPx9t7yupcZ2a9ZvacmZ1fVn6mmT0Zn7vFzCyWTzGzu2P5o2bWnmWfQCuLSnPQOR7Jq6zP8fQDn3T304GzgSvMbEF87mZ3Xxhv9wHE55YBbwYuAG4zs8lx/9uBFcD8eLsglncBP3f304CbgRuz7JCum5BmofOOkleZBh533+HuP4zbu4FngdmjVLkQuMvd97v7FqAXWGxms4CZ7v6Ih5NSXwEuKquzJm7fA5xbOhqqNa0sKs1Gs6BLHtUtqy0OgS0CHo1FV5rZj8zsTjM7NpbNBraVVdsey2bH7aHlg+q4ez+wCzi+wvuvMLMeM+spVhkpVq4cPJ4Oum5CGq9QgLPO0pGO5EddAo+ZzQC+AXzC3V8jDJv9MrAQ2AF8rrRrheo+SvlodQYXuN/h7h3u3lGo4i+0WIQbbhherjF1EZF0Mg88ZtZKCDpfd/dvArj7y+5+yN0PA18CFsfdtwNzy6rPAV6K5XMqlA+qY2YtwNHAK7XuR18fVBrA+63f0i9NEZE0ss5qM2AV8Ky731RWPqtst4uBp+L2OmBZzFSbR0gi2OjuO4DdZnZ2fM3LgHvL6iyP25cAD3kGFyfNmDF8mA3gX/5F53ikcZRhKXmU9XU85wB/CDxpZo/Hss8AnWa2kDAk1gd8GMDdnzaztcAzhIy4K9z9UKz3UWA1MA24P94gBLavmlkv4UhnWRYd2bMHpkyB/fsHl0+erOsmpDG6u0NyS1tbSKtetUrJBZIPmrkgoWIRTj4ZXn99cLmuFJdG0KwF0gianbrOCgW4887BC8G1tem6CWkMzUwteaYpc1IoLTO8eXN4vGiRgo40hmYtkDxT4EmpUIClSxvdCpnoSrMWfPCD4TzjoUM6+pb80FBbFZJkEinbSOqhlOKfzVwdItlQ4EkpyVxtms9NslY+fdPeveH+/e9XAJJ8UFZbCkkyiZRtJPWwaRMsXjzy8xPwz1rqQFltDZAkk0jZRlIPv/M7oz+vIx9pZgo8KSTJJFK2kdTDf/93o1sgUj0FnhQ2bID+/oHHra3DM4m0RorUw+zRFhcRaXJKp06odDL34MGBsoMH4bXXhu9but6nry8c6SjoSK1t3z76cJrO8Ugz0xFPQn190FIhTF9xReWUaa2RIlkqFsPRdCUKOtLsFHgSam8fPkEohAv3SjMZiNRLpSSWGTNg48aGNEckFQWehAoFuOaaRrdCJKiUxHLokJJYJB8UeFK45prBk4SWbNlS/7bIxKYkFskzBZ4UNmyoPH5+9dWaGkfqr7MzXJi8YUO411o8khcKPAmVstrK06lLJk+G++5T8JH6UxKL5JECT0KVTuaW7NkDf/zHmpdNRCQJBZ6E2tsHz7821O7d4fmuLh35iIiMRoEnhaHndyZNCims5TQvm4jI6BR4Eurrg6OOGlx21FGDZzIAzcsmInIkCjwJjXTdxOc/H1JZp09XSquISBKZBh4zm2tmD5vZs2b2tJldFcuPM7P1ZvZ8vD+2rM51ZtZrZs+Z2fll5Wea2ZPxuVvMwkxVZjbFzO6O5Y+aWXsWfRnpuomZMweG4DRViYjIkWW6EJyZzQJmufsPzewNwGPARcDlwCvu/jdmdi1wrLt/2swWAN3AYuCXgA3Ar7j7ITPbCFwF/BdwH3CLu99vZh8D3uruHzGzZcDF7v6+0dpV7UJwEBIHSpN/ghZ9E5GJIxcLwbn7Dnf/YdzeDTwLzAYuBNbE3dYQghGx/C533+/uW4BeYHEMYDPd/REPkfIrQ+qUXuse4NzS0VAWyq+b0KJvIiLp1e0cTxwCWwQ8Cpzk7jsgBCfgxLjbbGBbWbXtsWx23B5aPqiOu/cDu4DjK7z/CjPrMbOe4hjynYvFsOxwsahF30REqlGXwGNmM4BvAJ9w9wor2AzsWqHMRykfrc7gAvc73L3D3TsKVY6DdXeHobXzzgv3GzZoviwRkbQyXwjOzFoJQefr7v7NWPyymc1y9x1xGG1nLN8OzC2rPgd4KZbPqVBeXme7mbUARwOv1LofpSlz9u0bOKfT1RXO52zdqkXfRESSyjqrzYBVwLPuflPZU+uA5XF7OXBvWfmymKk2D5gPbIzDcbvN7Oz4mpcNqVN6rUuAhzyDjInRzudoviwRkeRSHfGY2duB+e7+j2ZWAGbEJICRnAP8IfCkmT0eyz4D/A2w1sy6gBeASwHc/WkzWws8A/QDV7j7oVjvo8BqYBpwf7xBCGxfNbNewpHOsjR9SqrS+Zz9+4fPXCAiIqNLnE5tZn8OdABvdPdfMbNfAv7Z3c/JsoFZqDadurs7DK8dPhyCztSpYd37Vas0Jb2IjH+1SqdOc8RzMSErrZQe/VK8NmfC6OyEF1+ET30qPH799XD/gQ/Az34GS5bA6ac3rn0iInmQ5hzPgXjuxAHMbHo2TWpexSL82Z8NL9+/Hz7+cViwICyPIFJP5Sn+InmQJvCsNbOVwDFm9iHCrAJfyqZZzWm0NXlKbr0Vnn02bOsLQbI2NMVf60FJHqSaMsfMzgOWEq6d+a67r8+qYVmq9hxPsTh8ipxKVq8OAaqrK9wfOKDzQFJ7lT6PmrJJstSQKXPcfb27f8rd/ySvQWcsShOFTp0alkRoGeEM2WmnDVzzs2uXFoiTbGjKJsmrxIHHzHab2Wvx9rqZHTKz0WYhGLfMwq21FZYuHfzclVeGLwN9IUjWNGWT5FXirDZ3H5TBZmYXEWaRnjDKZy8o+fd/h//4D+jthcWLQ1ZbsagvBMleoQA33wxXXRV+6PT3a8omyYeqZy5w928D76phW5reSEMbbW2wfPlAKvVIa/foC0Fqqbsbrr564DzizTfrPKLkQ5oLSN9b9nAS4WLSX3f3X8uiYVkaS3LB7NmDl7tubQ3X9gwNKsUibN4cthctUtCR2lJigTRCIy4g/e2y7X6gj7AWzoRWaeWf0gwHymiTrJSOvssDT/ncgSLNLM05ng9k2ZA8WLly8NEOhAy38j/2kWaxXrJEXwhSO0oskDw7YuAxs3+gwvo2Je7+8Zq2qEkVi3DDDcPLh/6x65eo1EPpPGJXV/h8HTyo84iSH0mOeNKfDBmH+voqD6t95jOD/9j1S1TqpbMzHEmXn0sUyYMjBh53X1OPhjS7GTMqz1jwu787+LF+iUo9bdig84mSP4nP8cT1dz4NLACmlsrdfUKkVO/ZMxBISlpaQvlQnZ2wcCFs3DhwbY9Irel8ouRVmqy2rwN3A78JfISw6ueEmQRmxozhiQX9/aF8aOq0foVKPYw0E4bOJ0qzSxN4jnf3VWZ2lbt/H/i+mX0/q4Y1m23bKpevWQM33TQQlFpbw/3Bg/oVKtmqNPy7b59WxZXml2bmgtLv/R1m9ptmtgiYk0GbmtKrr1YuLw86ELaHHhlpnjbJwp494aLRclOnVh7+FWkmaY54/o+ZHQ18EvgHYCZwdSatakLHHFO5fFKC0L1vn7LapPYqfabM9FmT5pcm8Dzq7ruAXcA7M2pP01q0aOCcTUlLS+UUa5F6UAal5FWaobb/NLMHzKzLzI7NrEVNqlAIC7yVr8EzaRL80R8d+ainNLuBSK11dob52TZsCPdKYpE8SBx43H0+8GfAm4HHzOw7ZvYHo9UxszvNbKeZPVVW9hdm9qKZPR5v7yl77joz6zWz58zs/LLyM83syfjcLWbhOMPMppjZ3bH8UTNrT9zzKrz2WshkKzlwAL785SMvh93fr+EPyU6hAGedpSMdyY+0K5BudPdrCOvwvAIc6eLS1cAFFcpvdveF8XYfgJktAJYRAtsFwG1mNjnufzuwApgfb6XX7AJ+7u6nATcDN6bpTxrFYlj3ZKhJk4YnE5TTkggiIoOlWYF0ppktN7P7gf8EdnCEheDc/d8IASqJC4G73H2/u28BeoHFZjYLmOnuj3hYw+ErwEVldUrB7x7g3NLRUK1VWosH4Be/gEOHKteZPh2+/W0Nf4iIlEtzxPMEsBD4K3f/FXf/tLs/VuX7XmlmP4pDcaXzRbOB8qtltsey2XF7aPmgOu7eT0h8OL7SG5rZCjPrMbOeYjH9da/t7YOH2QZed+Q6hw9r/iwRkaHSBJ5T3f1qd3+k0pNxFuskbgd+mRDEdgCfK71EhX19lPLR6gwvdL/D3TvcvaNQxbhXKYOodIEowOTJg5MNyrW0aIhNRKSSNMkFR1qq9JyEr/Oyux9y98PAlxgYrtsOzC3bdQ7wUiyfU6F8UB0zawGOJvnQXmqvvTb4fM6hQ6Of31myJKuWiIjkV6rkglqI52xKLgZKGW/rgGUxU20eIYlgo7vvAHab2dnx/M1lwL1ldZbH7UuAhxIEyKoUi/CxjyXfv79/YP42EREZkOYC0tTMrBv4DeAEM9sO/DnwG2a2kDAk1gd8GMDdnzaztcAzhKW1r3D30mn7jxIy5KYB98cbwCrgq2bWSzjSWZZVXzZvDudsRERkbGoZeIadb3H3Svlcq0Z6AXe/ARi2zqe79wBnVCh/Hbg0XTPro6VFiQUiIpWkWY+nA/gscEqsZ4RTP2+Nu3y+9s1rHpWmzBnNrbcqsUBEpJK06/F8CngSGDbo5O6ra9SmplSaMqerKwy57d8/8r4tLTBzZt2aJiKSK2mSC4ruvs7dt7j71tIts5Y1odK8WOvWDZ+Ovlx/fwhQVVwuJCIy7qUJPH9uZl82s04ze2/pllnLmlShAEuXhmt0RtPfDw8/XJ82iYjkSZqhtg8AbwJaGRhqc+CbtW5UsysWYe/e0fc5eBDe9z544IEwkaiIiARpAs+vuvtbMmtJTnR3h2G0keZnG2rVKnjTm+BP/iTbdomI5EWaobb/ijNIT1jFYgg6+/Ylz24D+Oxndb5HRKQkTeB5O/B4XCvnR3F9nB9l1bBmNNIM1UfS1qaF4EREStIMtVVaV2dCaW9Pd6RTcuiQFoITESlJHHgmWup0JRs2VF4aYTRtbZqlWkSkXN0nCc2rYhEuv3z02agr+cIXtBCciEg5BZ6ENm+uPMw2Zcro9U4+OZv2iIjklQLPGI02dQ6E5a9FRGSAAk9CixbBpCr+tb72tdq3RUQkzxR4EioUYFkVq/2sXq1reEREyinwJFQswre+lb6eruERERlMgSehai8ePXhQ1/CIiJRT4EmovR1+8Yv09T70IV3DIyJSToEnBRu2uPeRffGLYWJREREJFHgS6uuDyZPT1ztwIFx4qgQDEZFAgSehGTPCrNTVOHAgXIAqkoViETZt0o8byY9MA4+Z3WlmO83sqbKy48xsvZk9H++PLXvuOjPrjTNgn19WfmacDbvXzG4xC4NeZjbFzO6O5Y+aWXtWfXnyyaxeWaR63d1wyilw3nnhXsO6kgdZH/GsZvis1tcCD7r7fODB+Ji41s8y4M2xzm1mVhrcuh1YAcyPt9JrdgE/d/fTgJuBG7PqyMsvV1+3tTVcgCpSS+XrQ+3aFe67unTkI80v08Dj7v8GvDKk+EJgTdxeA1xUVn6Xu+939y1AL7DYzGYBM939EXd34CtD6pRe6x7g3NLRUK0tWVJdvZYWWLNGmW1Se5VS/Ftbdd2YNL9GnOM5yd13AMT7E2P5bGBb2X7bY9nsuD20fFAdd+8HdgHHZ9Ho00+HK69MX6+lpfqgJTKaSutD6boxyYNmSi6odKTio5SPVmf4i5utMLMeM+spVjkWcf31MHVqujqTJ+sXqGSjUAhrPU2bBjNnhnut/SR50IjA83IcPiPe74zl24G5ZfvNAV6K5XMqlA+qY2YtwNEMH9oDwN3vcPcOd+8oVPmX2dcXjmDS0C9QyVJnJ2zdGhYp3LpVaz9JPjQi8KwDlsft5cC9ZeXLYqbaPEISwcY4HLfbzM6O528uG1Kn9FqXAA/F80CZWLkS9uxJV6e/P3wpiGSlUICzztKRjuRH1unU3cAjwBvNbLuZdQF/A5xnZs8D58XHuPvTwFrgGeBfgSvc/VB8qY8CXyYkHPwEuD+WrwKON7Ne4BpihlwWnn02DGOkdfgwLF+uTCMRkZKUA0fpuPtIB/7njrD/DcANFcp7gDMqlL8OXDqWNia1cWP1dQ8eDBeQLl1au/aIiORVMyUXNLXFixvdAhGR8UGBJ6HTT6/+iGXyZF1AKiJSosCTULEI3/tedXWzS3cQEckfBZ6ENm8efrFeUocPa5JQEZESBZ46efXVRrdARKQ5KPAktGhRdQvBlRxzTO3aIiKSZwo8Cf3sZ2M7VzN9eu3aIiKSZwo8CY3lOh6AH/6wNu0QEck7BZ6ETjttbPX7+2vTDhGRvFPgSaitLf0EoeXGUldEZDxR4EmovX1sweNtb6tZU0REck2BJ6FCAS6+uPr6e/fWri0iInmmwJPQypXQ3d3oVogMVyzCpk2aAV3yQ4EngWIRrrqq+vqaq02ysnIlzJ0L554Lp5yiH0eSDwo8CYx16eozz9QiXVJ7K1fCRz4C+/fD7t2wbx90denIR5qfAk8CM2aEP+5qbdwYvhBEamWko/CWlrH/UBLJmgJPAtu2jf017rwzrGIqUgt9fSHFf6gDB0IGpkgzU+Cpo7HOfiBS0t5e+aLkz39ew7rS/BR4EhjrBKElWsVUaqVQgFWrYNq0MA9gayv83d/Bhz/c6JaJHJkCT0JjnXngrW8Nq5iK1EpnJ9x8czjymToVrr9eWW2SDwo8CfT1jT3wvOlNNWmKyP9XLMLVVyurTfJHgSeBGTPCH/VYrFunLwSprUoJBq2tymqT5tewwGNmfWb2pJk9bmY9sew4M1tvZs/H+2PL9r/OzHrN7DkzO7+s/Mz4Or1mdotZLc7GDLZnz9jP8bS16QtBaqu9ffhy7AcPKqtNml+jj3je6e4L3b0jPr4WeNDd5wMPxseY2QJgGfBm4ALgNjObHOvcDqwA5sfbBbVu5IEDY1sErvQa+kKQWipPMJg5M9yvWqWsNml+jQ48Q10IrInba4CLysrvcvf97r4F6AUWm9ksYKa7P+LuDnylrE7N1GIRt8sv1xeC1F5nJ2zdChs2hPvOzka3SOTIGhl4HHjAzB4zsxWx7CR33wEQ70+M5bOB8ss4t8ey2XF7aPkwZrbCzHrMrKeY8mTLSSel2r2ij3987K8hIjIeNDLwnOPubwPeDVxhZu8YZd9KZ1h8lPLhhe53uHuHu3cUUh56vOUtqXYfZtIkePzxsb2GSCXd3WFy0PPO0yShkh8NCzzu/lK83wl8C1gMvByHz4j3O+Pu24G5ZdXnAC/F8jkVymtqrFPmHD6sNFepvWIxfK727YNdu5ROLfnRkMBjZtPN7A2lbWAp8BSwDlged1sO3Bu31wHLzGyKmc0jJBFsjMNxu83s7JjNdllZnZp59dWxv4bSXKXWlE4teTXGyyKrdhLwrZj53AL8k7v/q5ltAtaaWRfwAnApgLs/bWZrgWeAfuAKdz8UX+ujwGpgGnB/vDWdX/xCWW1SW0qnlrxqSOBx958Cv1qh/H+Ac0eocwNwQ4XyHuCMWrex3DHHjP01Dh068j4iaZTSqbu6wpHOwYNKp5Z8aLZ06qZUi0lC3WHz5tq0R6RE6dSSR40aassds7FfRFqLc0UiQxUKOsqRfNERTwJ9fWEoY6xqMWQnUq5YhE2blMkm+aLAk0B7e0iJHguzMGQnUiu6hkfySoEngUIBLr10bK8xSf/SUkO6hkfyTF+HCRSL8I1vjO01NDu11JKu4ZE8U+BJoNIfeVruur5Caqe9ffgaUa+/rs+Y5IMCTwLt7WF54bH4xCeUeSS1NTTLcqxZlyL1osCTQKEAf/VXY3sNJRZILfX1wVFHDS6bNk1DbZIPCjwJjfVoRRePSi1Vmi5Hiw1KXijwJLR48djqf+5zyjiS2ilNl1N+fdnhw2EGA5Fmp8CT0AknjG3anIMHddQjtbVkCbSUzT1y4IBSqiUfFHgS6uuDKVMa3QqRAUqplrxS4EloxoyQrlqt1lYlGEhtKaVa8kqBJ6E9e2Dq1OT7lw/LtbbCmjVKp5baU0q15JECT0Jpf0W6w/veB3ffDS++qOnqpfaUUi15pcCTUKEQLgJN4+674fLLlWkk2dAKpJJXCjwpVDNUpskbJSullOpp02DmzHCvFUglD7QQXAq9vdXVK2Ua6QtBam3JEvj2t8P2okX6jEk+6IgnhWoDj4Y/JAul9Xje+1646CIN6Up+KPAkVCzC+vXp62n4Q7JQLIbzh/v2wd694f7yyzWkK/kwLgKPmV1gZs+ZWa+ZXZvFe1Q768C+ffD+94f0at2yvU0kmzdXnqvtxBMH/5ucemr2bWn0/7tu6W9/+7fZfy5Gk/vAY2aTgS8A7wYWAJ1mtqCxrZJGmEjB59VXk+23ZUu2/y4T6d98PPn0p8NF8Y2S+8ADLAZ63f2n7n4AuAu4sNZvMndurV9RsjBRvgg/+MF0+2dx5DNR/q3Hq717G3fkMx4Cz2xgW9nj7bFsEDNbYWY9ZtZTrGIgfM+ecL5GpBns3Ztu/y1bsmmH5Ft3d2PedzwEnkq/u4ZNHOLud7h7h7t3FKo409/ePsKb61efNMBxx6Xbf968bNoh+daoGVXGQ+DZDpQPhM0BXqr1mwy9WG/qVPjrv4aXX4YvflEBqFlMlLnK/ud/0u3/03nwiEUAAAXeSURBVJ/Wvg0T5d96vJo+Hf70Txvz3uY5//SYWQvwf4FzgReBTcD73f3pkep0dHR4T09PVe9XLIaLQdvbB6dIF4vw8MPwxBPhP/TXfx3e/vaq3kKqlPOPclWOPx5eeWXk5+fNyybolNOPrvy58cbqgo6ZPebuHWN9/9wHHgAzew/w98Bk4E53v2G0/ccSeEREJqpaBZ5xMWWOu98H3NfodoiIyJGNh3M8IiKSIwo8IiJSVwo8IiJSVwo8IiJSV+Miqy0tMysCW6usfgLwsxo2pxmMtz6Nt/7A+OvTeOsPTIw+neLuY55rf0IGnrEws55apBM2k/HWp/HWHxh/fRpv/QH1KQ0NtYmISF0p8IiISF0p8KR3R6MbkIHx1qfx1h8Yf30ab/0B9SkxneMREZG60hGPiIjUlQKPiIjUlQJPCmZ2gZk9Z2a9ZnZto9tTzszuNLOdZvZUWdlxZrbezJ6P98eWPXdd7MdzZnZ+WfmZZvZkfO4WszDpvZlNMbO7Y/mjZtaecX/mmtnDZvasmT1tZleNgz5NNbONZvZE7NNf5r1P8T0nm9lmM/vOOOlPX2zL42bWk/c+mdkxZnaPmf04/j39WsP74+66JbgRllz4CXAq0AY8ASxodLvK2vcO4G3AU2VlfwtcG7evBW6M2wti+6cA82K/JsfnNgK/RljZ9X7g3bH8Y8AX4/Yy4O6M+zMLeFvcfgNhzaUFOe+TATPidivwKHB2nvsU3+ca4J+A7+T9cxffpw84YUhZbvsErAH+KG63Acc0uj+Z/geOp1v8B/9u2ePrgOsa3a4hbWxncOB5DpgVt2cBz1VqO/Dd2L9ZwI/LyjuBleX7xO0WwtXMVse+3QucN176BBwF/BD4X3nuE2HF3weBdzEQeHLbn/g+fQwPPLnsEzAT2DL09RvdHw21JTcb2Fb2eHssa2YnufsOgHh/YiwfqS+z4/bQ8kF13L0f2AUcn1nLy8RD90WEI4Rc9ykOSz0O7ATWu3ve+/T3wJ8Ch8vK8twfAAceMLPHzGxFLMtrn04FisA/xuHQL5vZdBrcHwWe5Cot8JvXXPSR+jJaHxvSfzObAXwD+IS7vzbarhXKmq5P7n7I3RcSjhQWm9kZo+ze1H0ys98Cdrr7Y0mrVChrmv6UOcfd3wa8G7jCzN4xyr7N3qcWwhD87e6+CNhLGFobSV36o8CT3HZgbtnjOcBLDWpLUi+b2SyAeL8zlo/Ul+1xe2j5oDpm1gIcDbySWcvD+7QSgs7X3f2bsTjXfSpx91eB7wEXkN8+nQP8jpn1AXcB7zKzr5Hf/gDg7i/F+53At4DF5LdP24Ht8cga4B5CIGpofxR4ktsEzDezeWbWRjiJtq7BbTqSdcDyuL2ccJ6kVL4sZqPMA+YDG+Mh924zOztmrFw2pE7ptS4BHvI4qJuF+P6rgGfd/aZx0qeCmR0Tt6cBS4Af57VP7n6du89x93bC38ND7v4Hee0PgJlNN7M3lLaBpcBTee2Tu/83sM3M3hiLzgWeaXh/sjxJN95uwHsI2VU/AT7b6PYMaVs3sAM4SPgF0kUYZ30QeD7eH1e2/2djP54jZqfE8g7CH9pPgFsZmN1iKvDPQC8hu+XUjPvzdsLh+o+Ax+PtPTnv01uBzbFPTwHXx/Lc9qmsPb/BQHJBbvtDOCfyRLw9Xfo7z3mfFgI98XP3beDYRvdHU+aIiEhdaahNRETqSoFHRETqSoFHRETqSoFHRETqSoFHRETqSoFHpMHM7D9HKF9tZpfUuz0iWVPgEWkwd//fjW6DSD21NLoBIhOdme1x9xnxivB/IMz0vIXKc2CJ5J6OeESax8XAG4G3AB8CdCQk45ICj0jzeAfQ7WEG65eAhxrdIJEsKPCINBfNYSXjngKPSPP4N8LMwJPjVPXvbHSDRLKg5AKR5vEtQmLBk4RZ0L/f2OaIZEOzU4uISF1pqE1EROpKgUdEROpKgUdEROpKgUdEROpKgUdEROpKgUdEROpKgUdEROrq/wEeq4u7dySTxwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "player_actions.plot(kind='scatter',x='id',y='m_value',color='blue')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alright, enough with the graphs, lets build a data structure for a model training" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Build few models - full data, m_ticks, and m_value" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Full data - (ticks,action,value,value_l,value_r) - prepare the data " ] }, { "cell_type": "code", "execution_count": 690, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index(['sessionid', 'id', 'm_ticks', 'm_kart_id', 'm_action', 'm_value',\n", " 'm_value_l', 'm_value_r', 'class'],\n", " dtype='object')\n", "sessionid 42790\n", "id 42790\n", "m_ticks 42790\n", "m_kart_id 42790\n", "m_action 42790\n", "m_value 42790\n", "m_value_l 42790\n", "m_value_r 42790\n", "class 42790\n", "dtype: int64\n" ] } ], "source": [ "actions = pd.DataFrame(action_list)\n", "actions.rename(columns={0:'sessionid',\n", " 1:'id',\n", " 2:'m_ticks',\n", " 3:'m_kart_id',\n", " 4:'m_action',\n", " 5:'m_value',\n", " 6:'m_value_l',\n", " 7:'m_value_r',\n", " 8:'class'\n", " }, \n", " inplace=True)\n", "print(actions.columns)\n", "print(actions.count())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We used `id` for sorting the session actions but now we dont need it anymore." ] }, { "cell_type": "code", "execution_count": 704, "metadata": {}, "outputs": [], "source": [ "full_actions=actions.drop('id',axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Checking the amount of data we lose in aggreagtion. The session length is 25 so we are going loose all the session that are smaller than 25" ] }, { "cell_type": "code", "execution_count": 705, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sessionid\n", "0 26\n", "1 29\n", "2 25\n", "3 28\n", "4 27\n", " ... \n", "575 100\n", "576 100\n", "577 100\n", "578 100\n", "579 14\n", "Length: 450, dtype: int64\n", "42601\n" ] }, { "data": { "text/plain": [ "sessionid 42790\n", "m_ticks 42790\n", "m_kart_id 42790\n", "m_action 42790\n", "m_value 42790\n", "m_value_l 42790\n", "m_value_r 42790\n", "class 42790\n", "dtype: int64" ] }, "execution_count": 705, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(full_actions.groupby(['sessionid'],axis=0).size())\n", "sum=0\n", "for i in full_actions.groupby(['sessionid'],axis=0).size():\n", " #print(i,end='####')\n", " if(i>25):\n", " sum=sum+i\n", "print(sum)\n", "full_actions.count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Checking the size of sessions. Session is an ordered set of actions grouped by the sessiondid, the player kart id and the classification. \n", "\n", "Classification is set as 1 in case of human, and 0 as bot.\n", "\n", "The `sum` is the number of remaining data after aggregating on both the kartid and class." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Construct a dictonary based on `sessionid` and action classification `class`" ] }, { "cell_type": "code", "execution_count": 706, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "42790\n" ] } ], "source": [ "player_session_dict = {}\n", "i=0\n", "\n", "for index, row in full_actions.iterrows():\n", " i=i+1\n", " play_action_val=row['m_ticks'],row['m_action'],row['m_value'],row['m_value_l'],row['m_value_r']\n", " play_action_key=row['sessionid'],row['m_kart_id'],row['class']\n", " if(player_session_dict.get(play_action_key)):\n", " session_list=player_session_dict[play_action_key]\n", " session_list.append(play_action_val)\n", " player_session_dict[play_action_key]=session_list \n", " else:\n", " session_list=[]\n", " session_list.append(play_action_val)\n", " player_session_dict[play_action_key]=session_list\n", "print(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check the session length (number of actions in a session)" ] }, { "cell_type": "code", "execution_count": 694, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "number of actions pulled from aurora=42790\n", "number of actions after initial aggregations=41513\n" ] }, { "data": { "text/plain": [ "939" ] }, "execution_count": 694, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum=0\n", "for key in player_session_dict.keys():\n", " if (len(player_session_dict[key])>=25):\n", " #print(len(player_session_dict[key]),end = '###')\n", " sum=sum+len(player_session_dict[key])\n", "print()\n", "print('number of actions pulled from aurora={}'.format(i))\n", "print('number of actions after initial aggregations={}'.format(sum))\n", "len(player_session_dict)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Transpose the dataframe to a new column strucutre that concatenates series of consecutive actions in a fixed size of 25" ] }, { "cell_type": "code", "execution_count": 695, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1306\n" ] } ], "source": [ "import numpy as np\n", "session_len=25\n", "#a line in the array is five set of actions plus the classification \n", "size_of_arr_line=session_len*5+1\n", "sessions_array = np.zeros((1306,size_of_arr_line), dtype=float, order='C')\n", "\n", "i=0\n", "sum_of_actions=0\n", "for key in player_session_dict:\n", " raw_session=player_session_dict[key]\n", " #break the session into equal parts 25 actions long\n", " sessions_list=[raw_session[i:i + session_len] for i in range(0, len(raw_session), session_len)] \n", " #every session has 25 action set\n", " for session in sessions_list:\n", " #including only the full sessions with excatly 25 actions\n", " if(len(session)==session_len):\n", " new_row=[]\n", " for action in session:\n", " new_row.append(action[0])\n", " new_row.append(action[1])\n", " new_row.append(action[2])\n", " new_row.append(action[3])\n", " new_row.append(action[4])\n", " #add class field to the last column \n", " new_row.append(key[2])\n", " sessions_array[i]=np.asarray(new_row)\n", " i=i+1 \n", "print(i)" ] }, { "cell_type": "code", "execution_count": 696, "metadata": {}, "outputs": [], "source": [ "df=pd.DataFrame(sessions_array) " ] }, { "cell_type": "code", "execution_count": 697, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123456789...116117118119120121122123124125
09114.01.03159.02218.0-3296.09145.00.032768.02218.0-3159.0...0.00.032768.00.01385.02.032768.00.00.00.0
11443.01.032768.00.00.01521.01.00.00.0-32768.0...0.00.032768.00.03047.02.00.00.00.00.0
23967.00.032768.00.00.04082.02.032768.032768.00.0...0.032768.00.00.05361.00.00.032768.00.00.0
35420.01.032768.00.00.05480.01.00.00.0-32768.0...1.00.00.0-32768.07166.00.032768.00.00.00.0
47963.01.032768.032768.00.07964.00.00.032768.0-32768.0...1.032768.00.00.09307.01.00.00.0-32768.00.0
\n", "

5 rows × 126 columns

\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 7 8 \\\n", "0 9114.0 1.0 3159.0 2218.0 -3296.0 9145.0 0.0 32768.0 2218.0 \n", "1 1443.0 1.0 32768.0 0.0 0.0 1521.0 1.0 0.0 0.0 \n", "2 3967.0 0.0 32768.0 0.0 0.0 4082.0 2.0 32768.0 32768.0 \n", "3 5420.0 1.0 32768.0 0.0 0.0 5480.0 1.0 0.0 0.0 \n", "4 7963.0 1.0 32768.0 32768.0 0.0 7964.0 0.0 0.0 32768.0 \n", "\n", " 9 ... 116 117 118 119 120 121 122 \\\n", "0 -3159.0 ... 0.0 0.0 32768.0 0.0 1385.0 2.0 32768.0 \n", "1 -32768.0 ... 0.0 0.0 32768.0 0.0 3047.0 2.0 0.0 \n", "2 0.0 ... 0.0 32768.0 0.0 0.0 5361.0 0.0 0.0 \n", "3 -32768.0 ... 1.0 0.0 0.0 -32768.0 7166.0 0.0 32768.0 \n", "4 -32768.0 ... 1.0 32768.0 0.0 0.0 9307.0 1.0 0.0 \n", "\n", " 123 124 125 \n", "0 0.0 0.0 0.0 \n", "1 0.0 0.0 0.0 \n", "2 32768.0 0.0 0.0 \n", "3 0.0 0.0 0.0 \n", "4 0.0 -32768.0 0.0 \n", "\n", "[5 rows x 126 columns]" ] }, "execution_count": 697, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 698, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "125\n", "0.0 1186\n", "1.0 120\n", "dtype: int64\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123456789...116117118119120121122123124125
09114.01.03159.02218.0-3296.09145.00.032768.02218.0-3159.0...0.00.032768.00.01385.02.032768.00.00.00.0
\n", "

1 rows × 126 columns

\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 7 8 9 \\\n", "0 9114.0 1.0 3159.0 2218.0 -3296.0 9145.0 0.0 32768.0 2218.0 -3159.0 \n", "\n", " ... 116 117 118 119 120 121 122 123 124 125 \n", "0 ... 0.0 0.0 32768.0 0.0 1385.0 2.0 32768.0 0.0 0.0 0.0 \n", "\n", "[1 rows x 126 columns]" ] }, "execution_count": 698, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(df.groupby(125,axis=0).size())\n", "df.head(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To check if we did not loose data we need to multiple the number by 25" ] }, { "cell_type": "code", "execution_count": 699, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "class\n", "0 38973\n", "1 3817\n", "dtype: int64" ] }, "execution_count": 699, "metadata": {}, "output_type": "execute_result" } ], "source": [ "min_actions.groupby(['class'],axis=0).size()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check how much data was lost during transformation." ] }, { "cell_type": "code", "execution_count": 700, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.03143830233167409\n", "0.03237606464293514\n" ] } ], "source": [ "print(120/3817)\n", "print(1186/36632)" ] }, { "cell_type": "code", "execution_count": 701, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "RangeIndex(start=0, stop=126, step=1)\n", "feature_columns=RangeIndex(start=0, stop=125, step=1)\n", "label_column=125\n" ] } ], "source": [ "print(df.columns)\n", "feature_columns = df.columns[:-1]\n", "label_column = df.columns[-1]\n", "\n", "print('feature_columns={}'.format(feature_columns))\n", "print('label_column={}'.format(label_column))\n", "\n", "features = df[feature_columns].values.astype('float32')\n", "labels = (df[label_column].values).astype('float32')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Prepare Data and Upload to S3" ] }, { "cell_type": "code", "execution_count": 658, "metadata": {}, "outputs": [], "source": [ "import io\n", "import sagemaker.amazon.common as smac\n", "\n", "buf = io.BytesIO()\n", "smac.write_numpy_to_dense_tensor(buf, features, labels)\n", "buf.seek(0);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we upload the data to S3 using boto3." ] }, { "cell_type": "code", "execution_count": 659, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Uploaded training data location: s3://stk-events/anticheat-model/train/recordio-pb-data\n", "Training artifacts will be uploaded to: s3://stk-events/anticheat-model/output\n" ] } ], "source": [ "import boto3\n", "import os\n", "import sagemaker\n", "\n", "session = sagemaker.Session()\n", "bucket = 'stk-events'\n", "\n", "prefix = 'anticheat-model'\n", "key = 'recordio-pb-data'\n", "\n", "boto3.resource('s3').Bucket(bucket).Object(os.path.join(prefix, 'train', key)).upload_fileobj(buf)\n", "\n", "s3_train_data = 's3://{}/{}/train/{}'.format(bucket, prefix, key)\n", "print('Uploaded training data location: {}'.format(s3_train_data))\n", "\n", "output_location = 's3://{}/{}/output'.format(bucket, prefix)\n", "print('Training artifacts will be uploaded to: {}'.format(output_location))" ] }, { "cell_type": "code", "execution_count": 660, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "'get_image_uri' method will be deprecated in favor of 'ImageURIProvider' class in SageMaker Python SDK v2.\n", "Parameter image_name will be renamed to image_uri in SageMaker Python SDK v2.\n", "'s3_input' class will be renamed to 'TrainingInput' in SageMaker Python SDK v2.\n" ] } ], "source": [ "from sagemaker.amazon.amazon_estimator import get_image_uri\n", "\n", "container = get_image_uri(boto3.Session().region_name, 'linear-learner')\n", "\n", "from sagemaker import get_execution_role\n", "\n", "linear = sagemaker.estimator.Estimator(container,\n", " get_execution_role(), \n", " train_instance_count=1, \n", " train_instance_type='ml.c4.xlarge',\n", " output_path=output_location,\n", " sagemaker_session=session)\n", "linear.set_hyperparameters(feature_dim=features.shape[1],\n", " predictor_type='binary_classifier',\n", " mini_batch_size=200)\n", "\n", "linear.fit({'train': s3_train_data},wait=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Host Linear Classifier" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we deploy the estimator to and endpoint.\n" ] }, { "cell_type": "code", "execution_count": 662, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Parameter image will be renamed to image_uri in SageMaker Python SDK v2.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "-------------------!" ] } ], "source": [ "from sagemaker.predictor import csv_serializer, json_deserializer\n", "\n", "linear_predictor = linear.deploy(initial_instance_count=1,\n", " endpoint_name=\"stk-bot-detector\",\n", " instance_type='ml.m4.xlarge')\n", "# Specify input and output formats.\n", "linear_predictor.content_type = 'text/csv'\n", "linear_predictor.serializer = csv_serializer\n", "linear_predictor.deserializer = json_deserializer" ] }, { "cell_type": "code", "execution_count": 663, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Endpoint name: stk-bot-detector\n" ] } ], "source": [ "print('Endpoint name: {}'.format(linear_predictor.endpoint))" ] }, { "cell_type": "code", "execution_count": 664, "metadata": {}, "outputs": [], "source": [ "from sagemaker.predictor import csv_serializer, json_deserializer\n", "\n", "linear_predictor.content_type = 'text/csv'\n", "linear_predictor.serializer = csv_serializer\n", "linear_predictor.accept = 'application/json'\n", "linear_predictor.deserializer = json_deserializer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calling the endpoint" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "prepare the parameters for the model endpoint call.\n", "\n", "This SQL will return a game session actions (25 actions) that we trained the model with" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```sql\n", "select concat(id,\"-\",m_kart_id) id, m_ticks,m_action,m_value,m_value_l,m_value_r \n", "from (\n", " select id,m_kart_id,m_ticks,m_action,m_value,m_value_l,m_value_r \n", " from actions order by m_kart_id,id limit 25) t;\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is an example result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "mysql> select * from tmp\n", " -> ;\n", "+-------+---------+----------+---------+-----------+-----------+\n", "| id | ticks | action | value | value_l | value_r |\n", "+-------+---------+----------+---------+-----------+-----------+\n", "| 0 | 31 | 1 | 4479 | 0 | 0 |\n", "| 1 | 32 | 2 | 32768 | 0 | -4479 |\n", "| 2 | 62 | 1 | 5423 | 0 | -4479 |\n", "| 3 | 93 | 1 | 6317 | 0 | -5423 |\n", "| 4 | 124 | 1 | 5064 | 0 | -6317 |\n", "| 5 | 155 | 1 | 5729 | 0 | -5064 |\n", "| 6 | 186 | 1 | 6469 | 0 | -5729 |\n", "| 7 | 217 | 1 | 6714 | 0 | -6469 |\n", "| 8 | 248 | 0 | 32768 | 0 | -6714 |\n", "| 9. | 279 | 1 | 7953 | 32768 | -6714 |\n", "| 10 | 310 | 1 | 14415 | 32768 | -7953 |\n", "| 11 | 341 | 0 | 3698 | 32768 | -14415 |\n", "| 12 | 372 | 0 | 5492 | 3698 | -14415 |\n", "| 13 | 403 | 0 | 20817 | 5492 | -14415 |\n", "| 14 | 434 | 0 | 26290 | 20817 | -14415 |\n", "| 15. | 465 | 0 | 24373 | 26290 | -14415 |\n", "| 16. | 496 | 0 | 11402 | 24373 | -14415 |\n", "| 17. | 527 | 0 | 10370 | 11402 | -14415 |\n", "| 18. | 558 | 0 | 12071 | 10370 | -14415 |\n", "| 19. | 589 | 0 | 15223 | 12071 | -14415 |\n", "| 20. | 620 | 0 | 17070 | 15223 | -14415 |\n", "| 21. | 651 | 0 | 19485 | 17070 | -14415 |\n", "| 22. | 682 | 0 | 16294 | 19485 | -14415 |\n", "| 23. | 713 | 0 | 12267 | 16294 | -14415 |\n", "| 24. | 744 | 0 | 10856 | 12267 | -14415 |\n", "+-------+---------+----------+---------+-----------+-----------+\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We need to concatenate the 25 results into a single line to send it to the model endpoint." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "+---------+----------+---------+-----------+-----------+ +---------+---------+--------+----------+----------+\n", "| ticks_0 | action_0 | value_0 | value_l_0 | value_r_0 |..... |ticks_24 |action_24|value_24|value_l_24|value_r_24|\n", "+---------+----------+---------+-----------+-----------+ +---------+---------+--------+----------+----------+\n", " 31 1 4479 0 0 744 0 10856 12267 -14415\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```sql\n", "select group_concat(concat(m_ticks,',',m_action,',',m_value,',',m_value_l,',',m_value_r)) as col \n", "from (select concat(id,\"-\",m_kart_id) id, m_ticks,m_action,m_value,m_value_l,m_value_r \n", " from ( \n", " select id,m_kart_id,m_ticks,m_action,m_value,m_value_l,m_value_r \n", " from actions order by m_kart_id,id limit 25) \n", " t) \n", "t1;\n", "```" ] }, { "cell_type": "code", "execution_count": 665, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 19.4 ms, sys: 0 ns, total: 19.4 ms\n", "Wall time: 98.7 ms\n" ] } ], "source": [ "%%time\n", "import pandas as pd\n", "\n", "modulo_size=224\n", "\n", "try:\n", " conn = mysql.connector.connect(host=ENDPOINT, user=USR, passwd=PASWD, port=3306, database=DBNAME)\n", " cur = conn.cursor()\n", " cur.execute(\"\"\"\n", " select group_concat(concat(m_ticks,',',m_action,',',m_value,',',m_value_l,',',m_value_r)) as sample\n", " from (\n", " select concat(id,\"-\",m_kart_id) id, m_ticks,m_action,m_value,m_value_l,m_value_r\n", " from (\n", " select id,m_kart_id,m_ticks,m_action,m_value,m_value_l,m_value_r\n", " from (\n", " select id,m_kart_id,m_ticks,m_action,m_value,m_value_l,m_value_r\n", " from actions order by id desc limit 70) t1 order by m_kart_id limit 25) t2) t3; \n", " \"\"\")\n", " sample_list=cur.fetchall() \n", "except Exception as e:\n", " print(\"Database connection failed due to {}\".format(e))" ] }, { "cell_type": "code", "execution_count": 666, "metadata": {}, "outputs": [], "source": [ "sample=''.join(sample_list[0])" ] }, { "cell_type": "code", "execution_count": 667, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'80447,0,0,32768,0,78329,1,0,0,-32768,76364,1,32768,0,0,78647,1,0,0,-32768,76891,0,0,32768,0,79382,1,32768,0,0,77409,4,0,32768,0,79825,1,0,0,-32768,77971,1,32768,0,0,80669,3,0,0,0,78484,1,32768,0,0,76713,1,32768,0,0,79121,1,0,0,-32768,77126,0,32768,0,0,79600,1,32768,0,0,77585,0,32768,0,0,80430,0,32768,0,0,78299,1,32768,0,0,76239,1,0,0,-32768,78622,1,32768,0,0,76875,0,32768,0,0,79270,1,0,0,-32768,77261,0,32768,0,0,79774,1,32768,0,0,77882,1,0,0,-32768'" ] }, "execution_count": 667, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sample" ] }, { "cell_type": "code", "execution_count": 668, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'predictions': [{'score': 0.0001962552487384528, 'predicted_label': 0}]}\n" ] } ], "source": [ "results = linear_predictor.predict(sample)\n", "print(results)" ] }, { "cell_type": "code", "execution_count": 671, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 19.1 ms, sys: 0 ns, total: 19.1 ms\n", "Wall time: 63.7 ms\n" ] }, { "data": { "text/plain": [ "'62,1,846,0,-672,589,0,32768,32768,-32768,899,0,30620,19736,-1848,279,0,765,0,-102,651,7,32768,32768,-5391,31,1,672,0,0,837,0,3445,11325,-1848,217,1,69,0,-287,1085,0,32768,18005,-3301,434,0,32768,32768,-20774,775,0,11325,11227,-9552,155,1,456,0,-282,31,2,32768,0,-672,527,1,32768,32768,-29192,1023,1,3301,16818,-1848,372,1,9534,32768,-102,713,1,9552,32768,-19031,93,1,209,0,-846,930,0,32768,30620,-1848,310,0,508,765,-102,868,0,19736,3445,-1848,248,1,102,0,-69,806,1,1848,11325,-9552,186,1,287,0,-456,682,1,19031,32768,-5391'" ] }, "execution_count": 671, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "import pandas as pd\n", "\n", "modulo_size=224\n", "\n", "try:\n", " conn = mysql.connector.connect(host=ENDPOINT, user=USR, passwd=PASWD, port=3306, database=DBNAME)\n", " cur = conn.cursor()\n", " cur.execute(\"\"\"\n", " select group_concat(concat(m_ticks,',',m_action,',',m_value,',',m_value_l,',',m_value_r)) as sample\n", " from (\n", " select concat(id,\"-\",m_kart_id) id, m_ticks,m_action,m_value,m_value_l,m_value_r\n", " from (\n", " select id,m_kart_id,m_ticks,m_action,m_value,m_value_l,m_value_r\n", " from (\n", " select id,m_kart_id,m_ticks,m_action,m_value,m_value_l,m_value_r\n", " from actions where class=1 order by id limit 70) t1 order by m_kart_id limit 25) t2) t3; \n", " \"\"\")\n", " sample_list=cur.fetchall() \n", "except Exception as e:\n", " print(\"Database connection failed due to {}\".format(e))\n", "sample=''.join(sample_list[0])\n", "sample" ] }, { "cell_type": "code", "execution_count": 672, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'predictions': [{'score': 0.15919774770736694, 'predicted_label': 0}]}\n" ] } ], "source": [ "results = linear_predictor.predict(sample)\n", "print(results)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Clean up\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will leave the prediction endpoint running at the end of this notebook so we can handle incoming event streams. However, don't forget to delete the prediction endpoint when you're done. You can do that at the Amazon SageMaker console in the Endpoints page. Or you can run linear_predictor.delete_endpoint()" ] } ], "metadata": { "kernelspec": { "display_name": "conda_pytorch_latest_p36", "language": "python", "name": "conda_pytorch_latest_p36" }, "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.6.10" } }, "nbformat": 4, "nbformat_minor": 4 }