{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Source: https://github.com/vgrabovets/benchmarkit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from benchmarkit import benchmark, benchmark_analyze, benchmark_run"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Benchmark time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "N = 10000\n",
    "seq_list = list(range(N))\n",
    "seq_set = set(range(N))\n",
    "\n",
    "SAVE_PATH = '/tmp/benchmark_time.jsonl'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "@benchmark(num_iters=100, save_params=True)\n",
    "def search_in_list(num_items=N):\n",
    "    return num_items - 1 in seq_list\n",
    "\n",
    "\n",
    "@benchmark(num_iters=100, save_params=True)\n",
    "def search_in_set(num_items=N):\n",
    "    return num_items - 1 in seq_set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "File: \u001b[36mbenchmark_time.jsonl\u001b[0m\n",
      "Function: \u001b[36msearch_in_list\u001b[0m\n",
      "         date      time  branch   commit commit_date                   comment  best_time  mean_time  num_items  mean_time_diff\n",
      "0  2019-05-21  18:50:44  master  3a1e755  2019-05-20  initial benchmark search     0.1022     0.1125      10000             NaN\n",
      "-------------------------------------------------------------------------------------------------------------------------------\n",
      "\n",
      "File: \u001b[36mbenchmark_time.jsonl\u001b[0m\n",
      "Function: \u001b[36msearch_in_set\u001b[0m\n",
      "         date      time  branch   commit commit_date                   comment  best_time  mean_time  num_items  mean_time_diff\n",
      "0  2019-05-21  18:50:47  master  3a1e755  2019-05-20  initial benchmark search      0.003     0.0041      10000             NaN\n",
      "-------------------------------------------------------------------------------------------------------------------------------\n",
      "\n",
      "File: \u001b[36mbenchmark_time.jsonl\u001b[0m\n",
      "\u001b[36mTotal\u001b[0m\n",
      "         date      time  branch   commit commit_date                   comment  best_time  mean_time  mean_time_diff\n",
      "0  2019-05-21  18:50:44  master  3a1e755  2019-05-20  initial benchmark search     0.1052     0.1166             NaN\n",
      "--------------------------------------------------------------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "benchmark_results = benchmark_run([search_in_list, search_in_set], SAVE_PATH, comment='initial benchmark search', extra_fields=['num_items'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Change `N` and repeat benchmark (enough to change `N` in cell 2 and restart cells 3 and 4):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "File: \u001b[36mbenchmark_time.jsonl\u001b[0m\n",
      "Function: \u001b[36msearch_in_list\u001b[0m\n",
      "         date      time  branch   commit commit_date                   comment  best_time  mean_time  num_items  mean_time_diff\n",
      "\u001b[32m0  2019-05-21  18:50:44  master  3a1e755  2019-05-20  initial benchmark search     0.1022     0.1125      10000             NaN\u001b[0m\n",
      "\u001b[31m1  2019-05-21  18:51:02  master  3a1e755  2019-05-20             million items     9.6100    10.1782    1000000         10.0657\u001b[0m\n",
      "-------------------------------------------------------------------------------------------------------------------------------\n",
      "\n",
      "File: \u001b[36mbenchmark_time.jsonl\u001b[0m\n",
      "Function: \u001b[36msearch_in_set\u001b[0m\n",
      "         date      time  branch   commit commit_date                   comment  best_time  mean_time  num_items  mean_time_diff\n",
      "\u001b[32m0  2019-05-21  18:50:47  master  3a1e755  2019-05-20  initial benchmark search     0.0030     0.0041      10000             NaN\u001b[0m\n",
      "\u001b[31m1  2019-05-21  18:51:06  master  3a1e755  2019-05-20             million items     0.0032     0.0043    1000000          0.0002\u001b[0m\n",
      "-------------------------------------------------------------------------------------------------------------------------------\n",
      "\n",
      "File: \u001b[36mbenchmark_time.jsonl\u001b[0m\n",
      "\u001b[36mTotal\u001b[0m\n",
      "         date      time  branch   commit commit_date                   comment  best_time  mean_time  mean_time_diff\n",
      "\u001b[32m0  2019-05-21  18:50:44  master  3a1e755  2019-05-20  initial benchmark search     0.1052     0.1166             NaN\u001b[0m\n",
      "\u001b[31m1  2019-05-21  18:51:02  master  3a1e755  2019-05-20             million items     9.6132    10.1825         10.0659\u001b[0m\n",
      "--------------------------------------------------------------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "N = 1000000\n",
    "seq_list = list(range(N))\n",
    "seq_set = set(range(N))\n",
    "\n",
    "@benchmark(num_iters=100, save_params=True)\n",
    "def search_in_list(num_items=N):\n",
    "    return num_items - 1 in seq_list\n",
    "\n",
    "\n",
    "@benchmark(num_iters=100, save_params=True)\n",
    "def search_in_set(num_items=N):\n",
    "    return num_items - 1 in seq_set\n",
    "\n",
    "benchmark_results = benchmark_run([search_in_list, search_in_set], SAVE_PATH, comment='million items', extra_fields=['num_items'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`benchmark_results` contains benchmark data for the last run"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'name': 'search_in_list',\n",
       "  'best_time': 9.61,\n",
       "  'mean_time': 10.1782,\n",
       "  'date': '2019-05-21',\n",
       "  'time': '18:51:02',\n",
       "  'branch': 'master',\n",
       "  'commit': '3a1e755',\n",
       "  'commit_date': '2019-05-20',\n",
       "  'num_items': 1000000,\n",
       "  'comment': 'million items',\n",
       "  '_id': 'b443bfb9-78ef-4894-9fa5-aaa41025731c'},\n",
       " {'name': 'search_in_set',\n",
       "  'best_time': 0.0032,\n",
       "  'mean_time': 0.0043,\n",
       "  'date': '2019-05-21',\n",
       "  'time': '18:51:06',\n",
       "  'branch': 'master',\n",
       "  'commit': '3a1e755',\n",
       "  'commit_date': '2019-05-20',\n",
       "  'num_items': 1000000,\n",
       "  'comment': 'million items',\n",
       "  '_id': 'b443bfb9-78ef-4894-9fa5-aaa41025731c'}]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "benchmark_results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "run `benchmark_run` from command line (without `!` in the real terminal):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\r\n",
      "File: \u001b[36mbenchmark_functions.jsonl\u001b[0m\r\n",
      "Function: \u001b[36msearch_in_list\u001b[0m\r\n",
      "         date      time  branch   commit commit_date        comment  best_time  mean_time  num_items  mean_time_diff\r\n",
      "0  2019-05-21  18:51:16  master  3a1e755  2019-05-20  million items      9.591    10.0661    1000000             NaN\r\n",
      "--------------------------------------------------------------------------------------------------------------------\r\n",
      "\r\n",
      "File: \u001b[36mbenchmark_functions.jsonl\u001b[0m\r\n",
      "Function: \u001b[36msearch_in_set\u001b[0m\r\n",
      "         date      time  branch   commit commit_date        comment  best_time  mean_time  num_items  mean_time_diff\r\n",
      "0  2019-05-21  18:51:19  master  3a1e755  2019-05-20  million items     0.0022     0.0032    1000000             NaN\r\n",
      "--------------------------------------------------------------------------------------------------------------------\r\n",
      "\r\n",
      "File: \u001b[36mbenchmark_functions.jsonl\u001b[0m\r\n",
      "\u001b[36mTotal\u001b[0m\r\n",
      "         date      time  branch   commit commit_date        comment  best_time  mean_time  mean_time_diff\r\n",
      "0  2019-05-21  18:51:16  master  3a1e755  2019-05-20  million items     9.5932    10.0693             NaN\r\n",
      "---------------------------------------------------------------------------------------------------------\r\n"
     ]
    }
   ],
   "source": [
    "!benchmark_run ../test_data/time/benchmark_functions.py --save_dir /tmp/ --comment \"million items\" --extra_fields num_items"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`benchmark_analyze` outputs results of benchmark stored in the file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "File: \u001b[36mbenchmark_time.jsonl\u001b[0m\n",
      "Function: \u001b[36msearch_in_list\u001b[0m\n",
      "         date      time  branch   commit commit_date                   comment  best_time  mean_time  num_items  mean_time_diff\n",
      "\u001b[32m0  2019-05-21  18:50:44  master  3a1e755  2019-05-20  initial benchmark search     0.1022     0.1125      10000             NaN\u001b[0m\n",
      "\u001b[31m1  2019-05-21  18:51:02  master  3a1e755  2019-05-20             million items     9.6100    10.1782    1000000         10.0657\u001b[0m\n",
      "-------------------------------------------------------------------------------------------------------------------------------\n",
      "\n",
      "File: \u001b[36mbenchmark_time.jsonl\u001b[0m\n",
      "Function: \u001b[36msearch_in_set\u001b[0m\n",
      "         date      time  branch   commit commit_date                   comment  best_time  mean_time  num_items  mean_time_diff\n",
      "\u001b[32m0  2019-05-21  18:50:47  master  3a1e755  2019-05-20  initial benchmark search     0.0030     0.0041      10000             NaN\u001b[0m\n",
      "\u001b[31m1  2019-05-21  18:51:06  master  3a1e755  2019-05-20             million items     0.0032     0.0043    1000000          0.0002\u001b[0m\n",
      "-------------------------------------------------------------------------------------------------------------------------------\n",
      "\n",
      "File: \u001b[36mbenchmark_time.jsonl\u001b[0m\n",
      "\u001b[36mTotal\u001b[0m\n",
      "         date      time  branch   commit commit_date                   comment  best_time  mean_time  mean_time_diff\n",
      "\u001b[32m0  2019-05-21  18:50:44  master  3a1e755  2019-05-20  initial benchmark search     0.1052     0.1166             NaN\u001b[0m\n",
      "\u001b[31m1  2019-05-21  18:51:02  master  3a1e755  2019-05-20             million items     9.6132    10.1825         10.0659\u001b[0m\n",
      "--------------------------------------------------------------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "benchmark_df = benchmark_analyze(SAVE_PATH, extra_fields=['num_items'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`benchmark_df` contains pandas DataFrame with the results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>time</th>\n",
       "      <th>name</th>\n",
       "      <th>branch</th>\n",
       "      <th>commit</th>\n",
       "      <th>commit_date</th>\n",
       "      <th>comment</th>\n",
       "      <th>best_time</th>\n",
       "      <th>mean_time</th>\n",
       "      <th>num_items</th>\n",
       "      <th>mean_time_diff</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2019-05-21</td>\n",
       "      <td>18:50:44</td>\n",
       "      <td>search_in_list</td>\n",
       "      <td>master</td>\n",
       "      <td>3a1e755</td>\n",
       "      <td>2019-05-20</td>\n",
       "      <td>initial benchmark search</td>\n",
       "      <td>0.1022</td>\n",
       "      <td>0.1125</td>\n",
       "      <td>10000.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2019-05-21</td>\n",
       "      <td>18:51:02</td>\n",
       "      <td>search_in_list</td>\n",
       "      <td>master</td>\n",
       "      <td>3a1e755</td>\n",
       "      <td>2019-05-20</td>\n",
       "      <td>million items</td>\n",
       "      <td>9.6100</td>\n",
       "      <td>10.1782</td>\n",
       "      <td>1000000.0</td>\n",
       "      <td>10.0657</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2019-05-21</td>\n",
       "      <td>18:50:47</td>\n",
       "      <td>search_in_set</td>\n",
       "      <td>master</td>\n",
       "      <td>3a1e755</td>\n",
       "      <td>2019-05-20</td>\n",
       "      <td>initial benchmark search</td>\n",
       "      <td>0.0030</td>\n",
       "      <td>0.0041</td>\n",
       "      <td>10000.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2019-05-21</td>\n",
       "      <td>18:51:06</td>\n",
       "      <td>search_in_set</td>\n",
       "      <td>master</td>\n",
       "      <td>3a1e755</td>\n",
       "      <td>2019-05-20</td>\n",
       "      <td>million items</td>\n",
       "      <td>0.0032</td>\n",
       "      <td>0.0043</td>\n",
       "      <td>1000000.0</td>\n",
       "      <td>0.0002</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2019-05-21</td>\n",
       "      <td>18:50:44</td>\n",
       "      <td>total</td>\n",
       "      <td>master</td>\n",
       "      <td>3a1e755</td>\n",
       "      <td>2019-05-20</td>\n",
       "      <td>initial benchmark search</td>\n",
       "      <td>0.1052</td>\n",
       "      <td>0.1166</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2019-05-21</td>\n",
       "      <td>18:51:02</td>\n",
       "      <td>total</td>\n",
       "      <td>master</td>\n",
       "      <td>3a1e755</td>\n",
       "      <td>2019-05-20</td>\n",
       "      <td>million items</td>\n",
       "      <td>9.6132</td>\n",
       "      <td>10.1825</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10.0659</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         date      time            name  branch   commit commit_date  \\\n",
       "0  2019-05-21  18:50:44  search_in_list  master  3a1e755  2019-05-20   \n",
       "1  2019-05-21  18:51:02  search_in_list  master  3a1e755  2019-05-20   \n",
       "0  2019-05-21  18:50:47   search_in_set  master  3a1e755  2019-05-20   \n",
       "1  2019-05-21  18:51:06   search_in_set  master  3a1e755  2019-05-20   \n",
       "0  2019-05-21  18:50:44           total  master  3a1e755  2019-05-20   \n",
       "1  2019-05-21  18:51:02           total  master  3a1e755  2019-05-20   \n",
       "\n",
       "                    comment  best_time  mean_time  num_items  mean_time_diff  \n",
       "0  initial benchmark search     0.1022     0.1125    10000.0             NaN  \n",
       "1             million items     9.6100    10.1782  1000000.0         10.0657  \n",
       "0  initial benchmark search     0.0030     0.0041    10000.0             NaN  \n",
       "1             million items     0.0032     0.0043  1000000.0          0.0002  \n",
       "0  initial benchmark search     0.1052     0.1166        NaN             NaN  \n",
       "1             million items     9.6132    10.1825        NaN         10.0659  "
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "benchmark_df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "run `benchmark_analyze` from command line (without `!` in the real terminal):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\r\n",
      "File: \u001b[36mbenchmark_time.jsonl\u001b[0m\r\n",
      "Function: \u001b[36msearch_in_list\u001b[0m\r\n",
      "         date      time  branch   commit commit_date                   comment  best_time  mean_time  num_items  mean_time_diff\r\n",
      "\u001b[32m0  2019-05-21  18:50:44  master  3a1e755  2019-05-20  initial benchmark search     0.1022     0.1125      10000             NaN\u001b[0m\r\n",
      "\u001b[31m1  2019-05-21  18:51:02  master  3a1e755  2019-05-20             million items     9.6100    10.1782    1000000         10.0657\u001b[0m\r\n",
      "-------------------------------------------------------------------------------------------------------------------------------\r\n",
      "\r\n",
      "File: \u001b[36mbenchmark_time.jsonl\u001b[0m\r\n",
      "Function: \u001b[36msearch_in_set\u001b[0m\r\n",
      "         date      time  branch   commit commit_date                   comment  best_time  mean_time  num_items  mean_time_diff\r\n",
      "\u001b[32m0  2019-05-21  18:50:47  master  3a1e755  2019-05-20  initial benchmark search     0.0030     0.0041      10000             NaN\u001b[0m\r\n",
      "\u001b[31m1  2019-05-21  18:51:06  master  3a1e755  2019-05-20             million items     0.0032     0.0043    1000000          0.0002\u001b[0m\r\n",
      "-------------------------------------------------------------------------------------------------------------------------------\r\n",
      "\r\n",
      "File: \u001b[36mbenchmark_time.jsonl\u001b[0m\r\n",
      "\u001b[36mTotal\u001b[0m\r\n",
      "         date      time  branch   commit commit_date                   comment  best_time  mean_time  mean_time_diff\r\n",
      "\u001b[32m0  2019-05-21  18:50:44  master  3a1e755  2019-05-20  initial benchmark search     0.1052     0.1166             NaN\u001b[0m\r\n",
      "\u001b[31m1  2019-05-21  18:51:02  master  3a1e755  2019-05-20             million items     9.6132    10.1825         10.0659\u001b[0m\r\n",
      "--------------------------------------------------------------------------------------------------------------------\r\n"
     ]
    }
   ],
   "source": [
    "!benchmark_analyze /tmp/benchmark_time.jsonl --extra_fields num_items"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Benchmark model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_iris\n",
    "from sklearn.linear_model import LogisticRegression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "MODEL_BENCHMARK_SAVE_FILE = '/tmp/benchmark_model.jsonl'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "x, y = load_iris(return_X_y=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Only parameters, passed to the decorated function `log_regression` will be saved (regularization parameter `C` and `fit_intercept`).\n",
    "\n",
    "In order to save results, decorated function `log_regression` should return `dict` with the results that need to be saved."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "@benchmark(save_params=True, save_output=True)\n",
    "def log_regression(C=1.0, fit_intercept=True):\n",
    "    clf = LogisticRegression(\n",
    "        random_state=0, \n",
    "        solver='lbfgs', \n",
    "        multi_class='multinomial', \n",
    "        C=C,\n",
    "        fit_intercept=fit_intercept,\n",
    "    )\n",
    "    clf.fit(x, y)\n",
    "    score = clf.score(x, y)\n",
    "    return {'score': score}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "File: \u001b[36mbenchmark_model.jsonl\u001b[0m\n",
      "Function: \u001b[36mlog_regression\u001b[0m\n",
      "         date      time  branch   commit commit_date         comment  best_time  mean_time    C  fit_intercept     score  score_diff\n",
      "0  2019-05-21  18:51:35  master  3a1e755  2019-05-20  baseline model    26.2866    26.2866  1.0           True  0.973333         NaN\n",
      "------------------------------------------------------------------------------------------------------------------------------------\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/mnt/ubuntu_storage/home/vitaliy/scoutbee/benchmarkit/env/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:947: ConvergenceWarning: lbfgs failed to converge. Increase the number of iterations.\n",
      "  \"of iterations.\", ConvergenceWarning)\n"
     ]
    }
   ],
   "source": [
    "model_benchmark_results = benchmark_run(\n",
    "    log_regression,\n",
    "    MODEL_BENCHMARK_SAVE_FILE,\n",
    "    comment='baseline model',\n",
    "    extra_fields=['C', 'fit_intercept'],\n",
    "    metric='score',\n",
    "    bigger_is_better=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Change hyperparameter `C`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "File: \u001b[36mbenchmark_model.jsonl\u001b[0m\n",
      "Function: \u001b[36mlog_regression\u001b[0m\n",
      "         date      time  branch   commit commit_date                  comment  best_time  mean_time    C  fit_intercept     score  score_diff\n",
      "\u001b[32m0  2019-05-21  18:51:35  master  3a1e755  2019-05-20           baseline model    26.2866    26.2866  1.0           True  0.973333         NaN\u001b[0m\n",
      "\u001b[31m1  2019-05-21  18:51:37  master  3a1e755  2019-05-20  stronger regularization    22.2981    22.2981  0.5           True  0.966667   -0.006667\u001b[0m\n",
      "---------------------------------------------------------------------------------------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "@benchmark(save_params=True, save_output=True)\n",
    "def log_regression(C=0.5, fit_intercept=True):\n",
    "    clf = LogisticRegression(\n",
    "        random_state=0, \n",
    "        solver='lbfgs', \n",
    "        multi_class='multinomial', \n",
    "        C=C,\n",
    "        fit_intercept=fit_intercept,\n",
    "    )\n",
    "    clf.fit(x, y)\n",
    "    score = clf.score(x, y)\n",
    "    return {'score': score}\n",
    "\n",
    "model_benchmark_results = benchmark_run(\n",
    "    log_regression,\n",
    "    MODEL_BENCHMARK_SAVE_FILE,\n",
    "    comment='stronger regularization',\n",
    "    extra_fields=['C', 'fit_intercept'],\n",
    "    metric='score',\n",
    "    bigger_is_better=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'name': 'log_regression',\n",
       "  'best_time': 22.2981,\n",
       "  'mean_time': 22.2981,\n",
       "  'date': '2019-05-21',\n",
       "  'time': '18:51:37',\n",
       "  'branch': 'master',\n",
       "  'commit': '3a1e755',\n",
       "  'commit_date': '2019-05-20',\n",
       "  'C': 0.5,\n",
       "  'fit_intercept': True,\n",
       "  'score': 0.9666666666666667,\n",
       "  'comment': 'stronger regularization',\n",
       "  '_id': 'f3c3f2a0-fd11-4790-a58a-34aac1f44f5a'}]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_benchmark_results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "File: \u001b[36mbenchmark_model.jsonl\u001b[0m\n",
      "Function: \u001b[36mlog_regression\u001b[0m\n",
      "         date      time  branch   commit commit_date                  comment  best_time  mean_time    C  fit_intercept     score  score_diff\n",
      "\u001b[32m0  2019-05-21  18:51:35  master  3a1e755  2019-05-20           baseline model    26.2866    26.2866  1.0           True  0.973333         NaN\u001b[0m\n",
      "\u001b[31m1  2019-05-21  18:51:37  master  3a1e755  2019-05-20  stronger regularization    22.2981    22.2981  0.5           True  0.966667   -0.006667\u001b[0m\n",
      "---------------------------------------------------------------------------------------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "model_benchmark_df = benchmark_analyze(MODEL_BENCHMARK_SAVE_FILE, metric='score', bigger_is_better=True, extra_fields=['C', 'fit_intercept'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>time</th>\n",
       "      <th>name</th>\n",
       "      <th>branch</th>\n",
       "      <th>commit</th>\n",
       "      <th>commit_date</th>\n",
       "      <th>comment</th>\n",
       "      <th>best_time</th>\n",
       "      <th>mean_time</th>\n",
       "      <th>C</th>\n",
       "      <th>fit_intercept</th>\n",
       "      <th>score</th>\n",
       "      <th>score_diff</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2019-05-21</td>\n",
       "      <td>18:51:35</td>\n",
       "      <td>log_regression</td>\n",
       "      <td>master</td>\n",
       "      <td>3a1e755</td>\n",
       "      <td>2019-05-20</td>\n",
       "      <td>baseline model</td>\n",
       "      <td>26.2866</td>\n",
       "      <td>26.2866</td>\n",
       "      <td>1.0</td>\n",
       "      <td>True</td>\n",
       "      <td>0.973333</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2019-05-21</td>\n",
       "      <td>18:51:37</td>\n",
       "      <td>log_regression</td>\n",
       "      <td>master</td>\n",
       "      <td>3a1e755</td>\n",
       "      <td>2019-05-20</td>\n",
       "      <td>stronger regularization</td>\n",
       "      <td>22.2981</td>\n",
       "      <td>22.2981</td>\n",
       "      <td>0.5</td>\n",
       "      <td>True</td>\n",
       "      <td>0.966667</td>\n",
       "      <td>-0.006667</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         date      time            name  branch   commit commit_date  \\\n",
       "0  2019-05-21  18:51:35  log_regression  master  3a1e755  2019-05-20   \n",
       "1  2019-05-21  18:51:37  log_regression  master  3a1e755  2019-05-20   \n",
       "\n",
       "                   comment  best_time  mean_time    C  fit_intercept  \\\n",
       "0           baseline model    26.2866    26.2866  1.0           True   \n",
       "1  stronger regularization    22.2981    22.2981  0.5           True   \n",
       "\n",
       "      score  score_diff  \n",
       "0  0.973333         NaN  \n",
       "1  0.966667   -0.006667  "
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_benchmark_df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "run `benchmark_analyze` from command line (without `!` in the real terminal):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\r\n",
      "File: \u001b[36mbenchmark_model.jsonl\u001b[0m\r\n",
      "Function: \u001b[36mlog_regression\u001b[0m\r\n",
      "         date      time  branch   commit commit_date                  comment  best_time  mean_time    C  fit_intercept     score  score_diff\r\n",
      "\u001b[32m0  2019-05-21  18:51:35  master  3a1e755  2019-05-20           baseline model    26.2866    26.2866  1.0           True  0.973333         NaN\u001b[0m\r\n",
      "\u001b[31m1  2019-05-21  18:51:37  master  3a1e755  2019-05-20  stronger regularization    22.2981    22.2981  0.5           True  0.966667   -0.006667\u001b[0m\r\n",
      "---------------------------------------------------------------------------------------------------------------------------------------------\r\n"
     ]
    }
   ],
   "source": [
    "!benchmark_analyze /tmp/benchmark_model.jsonl --metric score --bigger_is_better --extra_fields C fit_intercept"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Source: https://github.com/vgrabovets/benchmarkit"
   ]
  }
 ],
 "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.6.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}