Skip to content

Instantly share code, notes, and snippets.

@DGrady
Last active June 24, 2019 23:01
Show Gist options
  • Save DGrady/3953c5cbbbcb2710142a9c79b0cd99fb to your computer and use it in GitHub Desktop.
Save DGrady/3953c5cbbbcb2710142a9c79b0cd99fb to your computer and use it in GitHub Desktop.
A template for XGBoost models
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:16.632190Z",
"start_time": "2019-06-24T22:55:15.702112Z"
}
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:16.648380Z",
"start_time": "2019-06-24T22:55:16.640108Z"
}
},
"outputs": [],
"source": [
"get_ipython().display_formatter.formatters['text/plain'].for_type(int, lambda n, p, cycle: p.text('{:_}'.format(n)))\n",
"from IPython.display import display"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:19.550571Z",
"start_time": "2019-06-24T22:55:16.653550Z"
}
},
"outputs": [],
"source": [
"from pathlib import Path\n",
"import pickle as _pickle\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import scipy\n",
"import sklearn\n",
"import xgboost as xgb\n",
"\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:19.564300Z",
"start_time": "2019-06-24T22:55:19.557807Z"
}
},
"outputs": [],
"source": [
"plt.style.use('seaborn-darkgrid')\n",
"plt.rcParams['figure.figsize'] = (16, 9)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:19.580838Z",
"start_time": "2019-06-24T22:55:19.570578Z"
}
},
"outputs": [],
"source": [
"def pickle(p: Path, data):\n",
" with open(p, 'wb') as f:\n",
" _pickle.dump(data, f)\n",
"\n",
"def unpickle(p: Path):\n",
" with open(p, 'rb') as f:\n",
" data = _pickle.load(f)\n",
" return data"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:19.619307Z",
"start_time": "2019-06-24T22:55:19.585935Z"
}
},
"outputs": [],
"source": [
"def ks_score(y_true, y_pred):\n",
" \n",
" is_positive = y_true.astype(bool)\n",
" \n",
" return scipy.stats.ks_2samp(y_pred[is_positive], y_pred[~is_positive]).statistic\n",
"\n",
"\n",
"def tpr_at_3_percent_score(y_true, y_pred):\n",
" \n",
" is_positive = y_true.astype(bool)\n",
" \n",
" quantile = np.percentile(y_pred, 97.0)\n",
" \n",
" is_selected = y_pred >= quantile\n",
" \n",
" tp = np.sum(is_selected & is_positive)\n",
" p = np.sum(is_positive)\n",
" \n",
" return tp / p\n",
"\n",
"\n",
"def xgb_metrics_panel(y_pred, dtrain):\n",
" y_true = dtrain.get_label().astype(bool)\n",
" return [\n",
" ('ks_score', ks_score(y_true, y_pred)),\n",
" ('tpr_at_3_percent_score', tpr_at_3_percent_score(y_true, y_pred)),\n",
" ('roc_auc_score', sklearn.metrics.roc_auc_score(y_true, y_pred)),\n",
" ('auc_at_3_percent_fpr', sklearn.metrics.roc_auc_score(y_true, y_pred, max_fpr=0.03)),\n",
" ]\n",
"\n",
"\n",
"def tidy_xgb_metrics(model, dataset_names: list = None) -> pd.DataFrame:\n",
" \"\"\"\n",
" Convert the evaluation metrics of a trained XGBoost model into a tidy data frame\n",
" \n",
" The metrics that XGBoost provides from the `model.evals_result()` call are\n",
" in a nested dictionary. Often it’s more convenient to have a flat data frame.\n",
" \"\"\"\n",
" \n",
" d = model.evals_result()\n",
" \n",
" if dataset_names is None:\n",
" name_conversion = dict(zip(d.keys(), d.keys()))\n",
" else:\n",
" name_conversion = dict(zip(d.keys(), dataset_names))\n",
" \n",
" metrics = pd.concat(\n",
" [\n",
" pd.DataFrame(d[k]).assign(dataset=name_conversion[k])\n",
" for k in d.keys()\n",
" ]\n",
" )\n",
"\n",
" metrics.index.name = 'iteration'\n",
"\n",
" metrics.reset_index(inplace=True)\n",
"\n",
" metrics = pd.melt(metrics, id_vars=('iteration', 'dataset'), var_name='metric')\n",
"\n",
" return metrics"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:19.636066Z",
"start_time": "2019-06-24T22:55:19.624729Z"
}
},
"outputs": [],
"source": [
"def print_dots_callback(n):\n",
" \n",
" def callback(env):\n",
" if env.iteration % n == 0:\n",
" print('\\n', end='')\n",
" print('.', end='')\n",
" \n",
" return callback"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:19.678816Z",
"start_time": "2019-06-24T22:55:19.641089Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"4195"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Generate some random imbalanced data\n",
"\n",
"n = 100_000\n",
"\n",
"X = np.random.rand(n, 2)\n",
"y = X.sum(axis=1)/2 < (0.25 * np.random.rand(n))\n",
"\n",
"y.sum()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:19.778265Z",
"start_time": "2019-06-24T22:55:19.684088Z"
}
},
"outputs": [],
"source": [
"# Stratified train / validation split\n",
"\n",
"Xt, Xv, yt, yv = sklearn.model_selection.train_test_split(X, y, test_size=0.1, stratify=y)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:22.926790Z",
"start_time": "2019-06-24T22:55:19.782884Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
".........................\n",
".........................\n",
".........................\n",
"........................."
]
},
{
"data": {
"text/plain": [
"XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n",
" colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,\n",
" max_depth=3, min_child_weight=1, missing=None, n_estimators=100,\n",
" n_jobs=1, nthread=None, objective='binary:logistic', random_state=0,\n",
" reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,\n",
" silent=True, subsample=1)"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Shows progress, but doesn't compute evaluation metrics\n",
"\n",
"model = xgb.XGBClassifier()\n",
"\n",
"model.fit(\n",
" Xt, yt,\n",
" callbacks=[print_dots_callback(25)]\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:23.233938Z",
"start_time": "2019-06-24T22:55:22.930305Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0]\tvalidation_0-error:0.031667\tvalidation_0-logloss:0.606548\tvalidation_0-auc:0.968243\tvalidation_1-error:0.0342\tvalidation_1-logloss:0.606763\tvalidation_1-auc:0.969714\n",
"[1]\tvalidation_0-error:0.031322\tvalidation_0-logloss:0.535489\tvalidation_0-auc:0.971454\tvalidation_1-error:0.0338\tvalidation_1-logloss:0.536035\tvalidation_1-auc:0.973325\n",
"[2]\tvalidation_0-error:0.031056\tvalidation_0-logloss:0.47674\tvalidation_0-auc:0.973638\tvalidation_1-error:0.0337\tvalidation_1-logloss:0.47698\tvalidation_1-auc:0.974518\n",
"[3]\tvalidation_0-error:0.031056\tvalidation_0-logloss:0.426676\tvalidation_0-auc:0.974904\tvalidation_1-error:0.0337\tvalidation_1-logloss:0.427204\tvalidation_1-auc:0.975611\n",
"[4]\tvalidation_0-error:0.030433\tvalidation_0-logloss:0.383782\tvalidation_0-auc:0.979836\tvalidation_1-error:0.0341\tvalidation_1-logloss:0.384444\tvalidation_1-auc:0.979334\n"
]
},
{
"data": {
"text/plain": [
"XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n",
" colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,\n",
" max_depth=3, min_child_weight=1, missing=None, n_estimators=5,\n",
" n_jobs=1, nthread=None, objective='binary:logistic', random_state=0,\n",
" reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,\n",
" silent=True, subsample=1)"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Use built-in evaluation metrics\n",
"# Prints evaluation metrics after every round by default\n",
"\n",
"model = xgb.XGBClassifier(n_estimators=5)\n",
"\n",
"model.fit(\n",
" Xt, yt,\n",
" eval_metric=['error', 'logloss', 'auc'],\n",
" eval_set=[(Xt, yt), (Xv, yv)],\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:32.952930Z",
"start_time": "2019-06-24T22:55:23.237105Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
".........................\n",
".........................\n",
".........................\n",
"........................."
]
},
{
"data": {
"text/plain": [
"XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n",
" colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,\n",
" max_depth=3, min_child_weight=1, missing=None, n_estimators=100,\n",
" n_jobs=1, nthread=None, objective='binary:logistic', random_state=0,\n",
" reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,\n",
" silent=True, subsample=1)"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Use a panel of custom evaluation metrics\n",
"# Silence evaluation messages, but show progress\n",
"\n",
"model = xgb.XGBClassifier()\n",
"\n",
"model.fit(\n",
" Xt, yt,\n",
" eval_metric=xgb_metrics_panel,\n",
" eval_set=[(Xt, yt), (Xv, yv)],\n",
" verbose=False,\n",
" callbacks=[print_dots_callback(25)]\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:32.959876Z",
"start_time": "2019-06-24T22:55:32.956485Z"
}
},
"outputs": [],
"source": [
"# Do you want to save the results?\n",
"\n",
"# pickle('DELETEME.pkl', model)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:33.013115Z",
"start_time": "2019-06-24T22:55:32.962423Z"
}
},
"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>iteration</th>\n",
" <th>dataset</th>\n",
" <th>metric</th>\n",
" <th>value</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>train</td>\n",
" <td>error</td>\n",
" <td>0.031667</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>train</td>\n",
" <td>error</td>\n",
" <td>0.031322</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>train</td>\n",
" <td>error</td>\n",
" <td>0.031056</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>train</td>\n",
" <td>error</td>\n",
" <td>0.031056</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>train</td>\n",
" <td>error</td>\n",
" <td>0.030433</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" iteration dataset metric value\n",
"0 0 train error 0.031667\n",
"1 1 train error 0.031322\n",
"2 2 train error 0.031056\n",
"3 3 train error 0.031056\n",
"4 4 train error 0.030433"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"t = tidy_xgb_metrics(model, ['train', 'validation'])\n",
"t.head()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"ExecuteTime": {
"end_time": "2019-06-24T22:55:33.346461Z",
"start_time": "2019-06-24T22:55:33.018859Z"
}
},
"outputs": [
{
"data": {
"image/png": "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vTLyBbqK6t8tgNK5KankVHhaIQI9QKAHlj1vIDJt2cQCnkTkEcbImDRnAyQYEL526KXpmftERERERDSZsSyWDElCxNWY+aZIhgGlowkRV+Po1wgFas1iWJKMTencGH2UsMD+4aNJrTFZCW9rbKbpgXTH4KxTD8+dEhERERElg8lpklRXI+S+7UAkczOChGdPdMvuWMkpgIhrCZTuZkBXE36GpWsTDGFBYMklsLa8CsFkK8owIHtaoTlGSU4HK6qCTZGIiIiIiJLC5DRJqqsRkqHD0vVhxp5p6WiKPXssqqsRkhqE3PtRws9QOpqgVh+GwOKLAcOAbcsfk4p1spFC/ZDUwKiVU22wSZLMcTJERERERElhcpokc2ttJrf2Kp0bYQgr1Kr5Y15nJq8Jb+01dChdm6C6GqGXTkV4xqmwb/5jtMlPgTO362qjJKdQ7NDt1aw0ExERERElKa7k9IYbbsB5552HVatWYdOmTcPe27BhA1auXInzzjsPd999NwAgEAhgzZo1uPDCC3Huuedi3bp1w+558803MW/evBR9CdlhFNdAc9RnNjnt2gS1esG43WC1shnQraUJxyb3fwIR9kCtWQIACC5cDRHoQtHHLyUd82RhJp36KNt6gWjiylmnRERERETJGbdb77vvvouWlhasXbsWO3bswNVXX42nn3469v6vfvUrPPjgg6itrcUFF1yAz372s/joo4+waNEiXHrppWhtbcUll1yCk08+GQAQCoVw//33o6amJn1fVYaoriWZS04NHUrnh/F14JXEYGybxr92CPNridRGK6/hacuglU6DrfkRhOZ8PuGQJxNzxumolVMAuqMect+OTIVERERERDSpjFs5feedd3DaaacBAGbPng232w2v1wsA2LNnD8rKylBXVwchBE466SS88847WL58OS699FIAwL59+1BbWxtb77777sMFF1wAqzX/Z0FGXEuhDOyCFOxP+7Pkvp0QEe/YnXqHUF2NUHq2Aloo7mconU0wFDu0ijnRF4SMwMKvwNr296TOr04mwtsGQy6CMdp8WQxWTj2tgGFkMDIiIiIioslh3Mppd3c3Fi5cGPvnqqoqdHV1weFwoKurC5WV+39Yr66uxp49e2L/vGrVKrS3t+O+++4DAHzyySfYtm0b1qxZg//6r/9K5deRFebZTqXrQ0QOOSGtzzKrmqprSVzX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c05vvfVWnX/++Vq8eLE+/vjjg4699957WrRokc4//3zdf//9kiSv16srrrhCF1xwgc477zy9/vrrXec//vjjKiwsVEtLSxhfxvDhTomXJJU3+Abl+mX1XrUHDO1k3isAAACACNJr19z69eu1e/durV69WiUlJVq2bJmeeeaZruM333yzHn74YWVnZ2vJkiVauHChduzYoalTp+riiy+Wx+PRD37wA5188sl68cUXVVtbq6ysrEF9UdHM7XJIkjz1Pk3I7Hleaqg89Z2h1zNI4RcAAAAAQtFrOC0qKtL8+fMlSQUFBWpsbFRzc7OcTqdKS0vlcrmUm5srSZo3b56Kiop04YUXdj2+oqJC2dnZkqT58+fL6XTq5ZdfHozXMix0hdPB6jltIJwCAAAAiDy9htPa2loVFhZ23U5PT1dNTY2cTqdqamqUlpbWdSwjI0OlpaVdtxcvXqzKykqtXLlSkuR0hr8ncLhJdtjljLMNWnj01HslSdVNbeoIBBVjYzchAAAAAObrNZwahnHIbYvF0u0xSV3HJGnVqlXavn27rrrqKq1Zs+agYz1xOuNkt0f2KrI2m1UpKQmDdv0xaYmqbmkflOeoaumQJBmSWmTREYP4OjD4BrstAv1Be0QkoT0iktAeEUkiuT32Gk6zs7NVW1vbdbu6uloZGRndHquqqlJmZqa2bNmi9PR05ebmasqUKQoEAqqrq1N6eu97dzY3t4XyOoZUSkqC6usHb0GhbGesdu5tGZTn2L23RZnOWNU0t2t76T6l2Hr/wgCRa7DbItAftEdEEtojIgntEZEkEtpjZmZSt/f3OqZzzpw5Wrt2rSRp27ZtysrK6hqeO2rUKDU3N6usrEx+v1+vv/665syZow0bNuiRRx6R1DksuLW1VampqeF6LcOe2+VQeYNPwW56pgciEDRU3uDTcWNSJH25OBIAAAAAmK3XntNZs2apsLBQixcvlsVi0fLly/X8888rKSlJCxYs0IoVK3TllVdKks444wzl5+crNzdX119/vZYsWSKfz6cbbrhBVqtVDzzwgN577z3V1NTo4osv1syZM3X11VcP+ouMNm6XQ+0BQ7XN7cpKigvbdaub2+QPGprudumfn9awKBIAAACAiNFrOJWkn//85wfdnjx5ctf/H3vssVq9evVBxx0Oh37zm98ccp1LLrlEl1xySSh1jijulC9X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M1MrVqyQJE2aNEk33nijuUViRNixY4cuvfRSff/739cFF1ygioqKbt8X16xZoz/96U+yWq06//zztWjRItNqpue0j9avX6/du3dr9erVuvnmm3XTTTeZXRJGmPfff1+fffaZVq9erYceeki33nqr7rnnHi1ZskRPPvmk3G63nn32WbPLxAjzwAMPKCUlRZJojzDNvn37dP/99+vJJ5/UypUr9eqrr9IeYZoXXnhB+fn5evzxx3X33Xfrlltu0S233KLrrrtOq1atUn19vd58802zy8Qw19raqptuukmzZ8/uuq+798XW1lbdf//9euyxx/T444/roYceUn19vWl1E077qKioSPPnz5ckFRQUqLGxUc3NzSZXhZHk2GOP1d133y1Jcrlc8nq9WrdunU499VRJ0qmnnqqioiIzS8QI8/nnn6ukpEQnnXSSJNEeYZqioiLNnj1bTqdTWVlZuummm2iPME1qamrXH/eNjY1KSUmRx+PpGnFHe8RQiI2N1R//+EdlZWV13dfd+2JxcbGmTZumpKQkORwOHXPMMdq4caNZZRNO+6q2tlapqaldt9PT01VTU2NiRRhpbDabEhISJEnPPPOM5s6dK6/X2zVMLTMzkzaJIfXrX/9a1157bddt2iPMUlZWJsMw9LOf/UxLlixRUVER7RGmOfPMM1VeXq4FCxboggsu0NVXX63k5OSu47RHDAW73S6Hw3HQfd29L9bW1iotLa2lq7G5AAAFoElEQVTrnIyMDFPbJ3NO++jr28EahiGLxWJSNRjJXn31VT377LN65JFHtHDhwq772bIYQ+nFF1/UzJkzNXr06K77vvqeSHvEUKuqqtJ9992n8vJyXXTRRbRHmOall15SXl6eHn74YX3yySe6/PLLu75clmiPME9374uRlnEIp32UnZ2t2trartvV1dXKyMgwsSKMRG+//bZWrlyphx56SElJSYqPj5fP55PD4VBVVdVBQzeAwfTGG2+otLRUb7zxhiorKxUbG0t7hGnS09N11FFHyW63a8yYMUpMTJTNZqM9whQbN27UCSecIEmaPHmyWltb1dra2nWc9gizdPc5nZ2drTfeeKPrnOrqas2cOdO0GhnW20dz5szR2rVrJUnbtm1TVlaWnE6nyVVhJGlqatLtt9+uBx98sGsBmuOPP76rXf7jH//QiSeeaGaJGEHuuusuPffcc3r66ad13nnn6dJLL6U9wjQnnHCC3n//fQWDQdXV1am1tZX2CNOMHTtWxcXFkiSPx6PExERNnDhRGzZskER7hHm6e1+cMWOGNm/erMbGRrW0tGjjxo065phjTKvRYjC2oM/uvPNObdiwQRaLRcuXL9fkyZPNLgkjyOrVq3XvvfcqPz+/675f/epX+sUvfqG2tjbl5eXptttuU0xMjIlVYiS699575Xa7dcIJJ+iaa66hPcIUq1at0iuvvCKv16tLLrlE06ZNoz3CFC0tLbruuuu0d+9e+f1+XXHFFcrMzNQNN9ygYDCoGTNmaNmyZWaXiWFuy5Yt+vWvfy2PxyO73a7s7Gzdeeeduvbaaw95X/z73/+uhx9+WBaLRRdccIHOPvts0+omnAIAAAAATMewXgAAAACA6QinAAAAAADTEU4BAMD/b+9+QtmP4ziOv7ZM+VMuSjlworCmhB2cnFyUaHLA0i5SSiitcCFtURy27CDJvk0udnZQyk0WsdMiN6dvopRm+PY7rNQvuRi+0fNx+tb33bvv+3v59urz6fMFAMB2hFMAAAAAgO0IpwAAAAAA2xFOAQD4pKOjI+3s7Gh/f7/gXicnJ7q9vZUkjY2NFdwPAIDfhl/JAABQoL6+PiWTyYJ6BINBBQIB1dfXf9FTAQDwuxBOAQD4pGQyqdnZWTmdTnV2dioajWptbU2pVEqvr68aGhpSd3e3gsGgXC6X7u/vFQqFND09rcfHR2WzWc3Pz+vh4UETExOqra1VJBJRb2+vjo+PlclktLCwIKfTqbKyMoXDYWUyGSUSCTkcDl1fX6urq0vj4+N2vwoAAArGtl4AAAowMjKi8vJyRaNRpVIp3dzcKJFIKB6PKxaLKZvNSpIqKioUiURkmqb6+/tlGIampqa0sbGhjo4ONTQ0KBQKqbq6+q330tKSZmZmZBiG2traFI/HJUkXFxcKh8Pa3d2VYRi2zA0AwFcrsvsBAAD4K05PT3V+fq7h4WFJkmVZMk1TkuTxeCRJlZWVWl9f1+bmpnK5nEpLSz/sd3V1pebmZklSa2urYrGYvF6vGhsbVVJS8s3TAADwswinAAB8keLiYvl8Po2Ojr6753K5JEnb29uqqqrSysqK0um0lpeXP+zncDjeri3LktOZ3/BUVMTnGwDw97CtFwCAAr28vEjKr44eHh7Ksiw9PT1pcXHxXe3d3Z1qamokSQcHB3p+fpaUD6K5XO6/2rq6Op2dnUnKn+brdru/cwwAAGxFOAUAoEBut1s+n08tLS3yer0aGBjQ4OCgmpqa3tX29PRoa2tLgUBAHo9Hpmlqb29P7e3tmpyc1OXl5Vvt3NycVldX5ff7lU6n5ff7f3IsAAB+FKf1AgAAAABsx8opAAAAAMB2hFMAAAAAgO0IpwAAAAAA2xFOAQAAAAC2I5wCAAAAAGxHOAUAAAAA2I5wCgAAAACwHeEUAAAAAGC7f6vJTy3VLeflAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 1152x648 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"(\n",
" t\n",
" .set_index(['iteration', 'dataset', 'metric'])\n",
" ['value'] # Get a Series\n",
" .unstack().unstack() # Pivot metrics and data sets into column headers\n",
" ['error'] # Look at 'error' metric for all data sets\n",
" .plot.line()\n",
")\n",
"\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.7.1"
},
"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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment