{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Fast Training of Support Vector Machines for Survival Analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This document demonstrates how to use the efficient implementation of *Survival Support Vector Machines* as proposed in\n", "\n", "> Pölsterl, S., Navab, N., and Katouzian, A.,\n", "> *Fast Training of Support Vector Machines for Survival Analysis*,\n", "> Machine Learning and Knowledge Discovery in Databases: European Conference,\n", "> ECML PKDD 2015, Porto, Portugal,\n", "> Lecture Notes in Computer Science, vol. 9285, pp. 243-259 (2015)\n", "\n", "The source code and installation instructions are available at https://github.com/sebp/scikit-survival.\n", "\n", "The main class of interest is ``sksurv.svm.FastSurvivalSVM``, which implements the different optimizers for training\n", "a Survival Support Vector Machine. Training data consists of $n$ triplets $(\\mathbf{x}_i, y_i, \\delta_i)$, where\n", "$\\mathbf{x}_i$ is a $d$-dimensional feature vector, $y_i > 0$ the survival time or time of censoring, and $\\delta_i \\in \\{0,1\\}$ the binary event indicator. Using the training data, the objective is to minimize the following function:\n", "\n", "\\begin{equation}\n", " \\arg \\min_{\\mathbf{w}, b} \\frac{1}{2} \\mathbf{w}^T \\mathbf{w}+ \\frac{\\alpha}{2} \\left[\n", " r \\sum_{i,j \\in \\mathcal{P}}\n", " \\max(0, 1 - (\\mathbf{w}^T \\mathbf{x}_i - \\mathbf{w}^T \\mathbf{x}_j))^2\n", "+ (1 - r) \\sum_{i=0}^n \\left( \\zeta_{\\mathbf{w},b} (y_i, x_i, \\delta_i) \\right)^2\n", "\\right]\n", "\\end{equation}\n", "\n", "\\begin{equation}\n", "\\zeta_{\\mathbf{w},b} (y_i, \\mathbf{x}_i, \\delta_i) =\n", "\\begin{cases}\n", " \\max(0, y_i - \\mathbf{w}^T \\mathbf{x}_i - b) & \\text{if $\\delta_i = 0$,} \\\\\n", " y_i - \\mathbf{w}^T \\mathbf{x}_i - b & \\text{if $\\delta_i = 1$,} \\\\\n", "\\end{cases}\n", "\\end{equation}\n", "\n", "\\begin{equation}\n", "\\mathcal{P} = \\{ (i, j)~|~y_i > y_j \\land \\delta_j = 1 \\}_{i,j=1,\\dots,n}\n", "\\end{equation}\n", "\n", "The hyper-parameter $\\alpha > 0$ determines the amount of regularization to apply: a smaller value increases the amount of regularization and a higher value reduces the amount of regularization. The hyper-parameter $r \\in [0; 1]$ determines the trade-off between the ranking objective and the regresson objective. If $r = 1$ it reduces to the ranking objective, and if $r = 0$ to the regression objective. If the regression objective is used, it is advised to log-transform the survival/censoring time first.\n", "\n", "In this example, I'm going to use the ranking objective ($r = 1$) and grid search to determine the best setting for the hyper-parameter $\\alpha$.\n", "\n", "The class ``sksurv.svm.FastSurvivalSVM`` adheres to interfaces used in [scikit-learn](http://scikit-learn.org) and thus it is possible to combine it with auxiliary classes and functions from scikit-learn. Here, I'm going to use [GridSearchCV](http://scikit-learn.org/stable/modules/generated/sklearn.module_selection.GridSearchCV.html) to determine which set hyper-parameters performs best for the Veteran's Lung Cancer data. Since, we require an event indicator $\\delta_i$, which is boolean, and the survival/censoring time $y_i$ for training, we have to create a structured array that contains both information.\n", "\n", "But first, we have to import the classes we are going to use." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/sebp/miniconda3/envs/sksurv/lib/python3.5/site-packages/IPython/html.py:14: ShimWarning: The `IPython.html` package has been deprecated. You should import from `notebook` instead. `IPython.html.widgets` has moved to `ipywidgets`.\n", " \"`IPython.html.widgets` has moved to `ipywidgets`.\", ShimWarning)\n" ] } ], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas\n", "import seaborn as sns\n", "from sklearn.model_selection import ShuffleSplit, GridSearchCV\n", "\n", "from sksurv.datasets import load_veterans_lung_cancer\n", "from sksurv.column import encode_categorical\n", "from sksurv.metrics import concordance_index_censored\n", "from sksurv.svm import FastSurvivalSVM" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, load data of the *Veteran's Administration Lung Cancer Trial* from disk and convert it to numeric values. The data consists of 137 patients and 6 features. The primary outcome measure was death (`Status`, `Survival_in_days`).\n", "The original data can be retrieved from http://lib.stat.cmu.edu/datasets/veteran.\n", "\n", "Note that it does not matter how you name the fields corresponding to the event indicator and time, as long as the event indicator comes first." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "data_x, y = load_veterans_lung_cancer()\n", "x = encode_categorical(data_x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we are essentially ready to start training, but before let's determine what the amount of censoring for this data is and plot the survival/censoring times." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6.6% of records are censored\n" ] } ], "source": [ "n_censored = y.shape[0] - y[\"Status\"].sum()\n", "print(\"%.1f%% of records are censored\" % (n_censored / y.shape[0] * 100))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqgAAAHcCAYAAAAa41gWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3X1cVHX6//H3MNwGDkkmJmplX1dDkVpvSVtNzcrUUiNv\nuiO3tjJbS+3G28zMvKssbdOystasvE2pzTTdym9R65Y3iPS1zNJEvANCERkYzu8Pf06RVg5zgI8z\nr+fj4QM558x1ruFy9O2ZM+c4LMuyBAAAABgipKYbAAAAAH6JgAoAAACjEFABAABgFAIqAAAAjEJA\nBQAAgFEIqAAAADAKARUAAABGIaACAADAKARUAAAAGIWACgAAAKNUOqBOnjxZzZo1kyT95z//UbNm\nzZScnKzk5GS1bNlSycnJ+uCDD2xrFAAAAMEhtDIPys7O1ooVK+RwOLzLEhIStHbtWtsaAwAAQHDy\n+QiqZVmaMGGCBg8eXBX9AAAAIMj5HFDffPNNRUREqGfPnhWWHzlyREOHDlX79u3VqVMnzZ8/364e\nAQAAEER8eov/4MGDmj17thYsWFBheUxMjJo2baq0tDTNnDlTX3zxhYYNGyaXy6W+ffva2jAAAAAC\nm8OyLOt0Nx45cqTq16+v4cOHa8+ePerWrZuys7NPue2MGTO0adOmk8Ls77EsSw6HQwuXvKUXMl5T\n5NlnnfZjf+38w3U1b9oLlX48AAAAasZpH0HNyMjQxo0bNWnSJEnHw+TvSUhI0OrVq31qxuFwqLCw\nWEVFxxTbuI7OqhPj0+N/KWRzqPLziyr9eFQtpzNELleUCguL5fGU13Q7qGLMO7gw7+DCvIPLiXlX\ntdMOqCtXrlReXp46d+4s6XhAtSxLKSkpeuSRR3T06FENHDjQu/2OHTvUsGFDnxvyeMpV7vH5YSex\nLEtlZbxQTOfxlDOnIMK8gwvzDi7MG3Y67YA6evRo3X///d7vc3Nz1b9/f61YsUKZmZmaMGGCzj//\nfLVt21ZffPGFli1bpmnTplVJ0wAAAAhcpx1Qa9WqpVq1anm/Lysrk8PhUN26ddW1a1eNHj1aEydO\nVG5ururUqaOxY8eqW7duVdI0AAAAAlelLtQvHT/H9JcfkEpNTVVqaqotTQEAACB4VfpWpwAAAEBV\nIKACAADAKARUAAAAGKXS56BWpaKio9r9r50KDQ+vdI2EmHgbOwIAAEB1MTKgRke6dG7DNEXVOrfS\nNc4t+a+NHQEAAKC68BY/AAAAjEJABQAAgFGMfIsfAABIbrdbWVmZ1brP5s2TFO7HZ0AAOxBQAQAw\nVFZWph56eplqndOoWvZ3+NAuTRsuXXppK9tqTp36hMrKSjVmzATbalbWs88+pffeW6m0tL9q0KBb\na7odbdz4pf7+97u1bt1nCgsLq+l2jEJABQDAYLXOaaSz6zWp6TZOafjwodq8eaMcDodKS8tkWeUK\nCwuTZUkOh7Rw4VI9/PCYmm5TklRYWKglS97StGnPKCWl40nrX3nlRc2fP8/bf2RkpJo0aaprr+2t\n7t2vtq2P995bqcsv7ySXK1aS5HA4bKsdSAioAACgUp5+erZCQ0NUu3a0pk9/Wp9/nqE5c16p6bZO\n6ejRIjkcDiUkNPzNbRITW3j7P3TooDZt+krPPfe0Nm36Ug895H/Q9ng8mjXrGSUlJXsDKk6ND0kB\nAIAqM3nyY5ow4Xi4e//9d3XbbQO1cuVyXXfdVbr22q56550l+vzzzzRgQF9ddVUnzZgxxfvYkpIS\nPf30VPXr11NXXvkXDRt2j77/fudv7mvnzu80bNg9uvrqK9Sz55WaMWOKSktLtXv3Lg0a1E+SlJY2\nSK+//sch+pxz6qhr1+565pnn9a9/pWvjxi8lSZZl6eWX56p//+vVrVtH3XnnbcrM3Ox93J49P2rE\niL/r2mu7qmfPbpowYYyKio5Ikq69tquOHi1SWtogzZ8/z/uYzZs36pZbblSXLpfpwQeH6ejRIh9+\nwoGJgAoAAKpNbm6ODh48oKVL39ONNw7SP/4xS2vWrNL8+Qs1deozWrFiqbZv/1qS9MILz+nbb7/R\nSy+9pvfe+1DNmiVqzJgHT1m3tLRUw4cPVfPmSUpPX60XX5yvTZu+0rx5c9SwYSMtXLhUlmXptdfe\n1K23Dj7tfhs3vkht2rTTv//9oSTp7bff0Nq1q/X007O1atVHuvrqa/Xww8NVUnJMkjRt2hM699xz\ntXLlai1cuFS7dv2g+fNfliTNn/+mt4e0tDskHQ+8a9eu1ty5r2rhwqX6+utsvfvuikr/fAMFARUA\nAFSbkpIS3XxzmkJDQ3XZZZfr2LFiXX99P0VGRuqSS/6s6OgY7d69W5Zl6f3331Va2h2KiztH4eHh\nuuOOu5Wbu1fZ2Vkn1f3880917NgxDR78N4WFhal+/QT163ej1q1bU2E7y7J87rlRo/O1d2+OpOPn\nkPbvf5MSEhooNDRU/frdqFq1aunTT/9XkjR9+rMaPvxhOZ1OuVyxatcuRV9/ve03e3A4HBo48Gad\ndVa06tU7Ty1aJGnXrh987jHQcA4qAACoNi5XrPcyVhERx7/WqfPznSMjIsLldpcoPz9PR48e1SOP\njNCJzxFZlmRZ5dq/f58uvrh5hbp79+aofv0EhYb+HG0aNGigffty/e7Z4/EoJOT4Mb09e/bo2Wdn\n6LnnnvpVT8f3k52dpblzn9eOHd+otLRM5eUeNWuW+Lv169Wr7/19eHiE3G633z2f6QioAACg2pzq\nU+sOx8lv6EZEREiS5s59RU2aNP3Dur8V6uz4lPz27f+nFi1aevsaNWq8/vKXzidtd/jwYT300P3q\n2/dGPfXULEVFRWnevDn673//87v1+ST/yXiLHwAAGCc6OkaxsbH69ttvKizPzd17yu0TEhooJ2eP\nysrKvMu+//57nXfez0cnKxMEN2z4Qlu3btGVV17l3c+3324/ZU8//PC9iouLNWDATYqKipIk7/m0\n8A1HUAEAMNjhQ7uqeV+tq21/0u+fE9q7d1+99trLat68herXb6ClS9/WggWvacmSdO8R1hPat++g\n0NBQzZ8/T7fd9lft3btHS5a8pR49ep3Wvn7N7Xbrf//3Ez3zzDQNHHiL9yjuddf11dy5z6tdu8t0\n8cWJ+ve/12rKlMf1xhuLVa9ePTkcDm3dmqlWrdpo5crlysvLU2HhTyovL/f2vHv3rgqnNeBkBFQA\nAAzVvHmSpg2vzj22VvPmSdW5w1Mc1fz5+7S0O1RUdERDhtyhsrIy/c///ElPPfXcSeFUkqKiojR9\n+kzNmvWMlix5W7Gxsbrmmp665Zbbf2dfFWVnZ6lr1w6SpJAQpxo3vkj33Te8woX6e/a8Tvv379OY\nMQ+qqKhI559/gZ58cobq1o2XJN1111BNnjxBDkeI+vS5QY8+Okn33XeXhgy5Q3PmvKJOnbpo3LhH\ndN11fU95mgCOc1iV+ThbFcrPL9KiJcu1eMMxRdWq/P8u6pb8V1MefcjGzmCnExd2zs8vUllZeU23\ngyrGvIML8w4uzDu4nJh3VeMcVAAAABiFgAoAAACjEFABAABgFAIqAAAAjEJABQAAgFEIqAAAADAK\nARUAAABGIaACAADAKNxJCgAAQ7ndbmVlZVbrPps3T1J4eLht9aZOfUJlZaUaM2aCbTUr69lnn9J7\n761UWtpfNWjQrTXdjt8GDeqnQYNuVc+e19V0K7YjoAIAYKisrEyNXf6YXA3jqmV/hbvzNEmP6tJL\nW53W9sOHD9XmzRvlcDhUWlomyypXWFiYLEtyOKSFC5fq4YfHVHHXp6ewsFBLlryladOeUUpKx1Nu\n43a7tXDh6/rwww+0b1+uIiOjdPHFibr55jS1bHlJNXf8xxYuXFrTLVQZAioAAAZzNYxT3EV1a7qN\nU3r66dneW19On/60Pv88Q3PmvFLTbZ3S0aNFcjgcSkhoeMr1Ho9HI0f+XceOHdP48Y/rT39qpoKC\nAi1fvljDht2j6dOfVevWbau56+BFQAUAAFVm8uTH5Ha7NWHCE3r//Xf11ltvqF+/G/Xyy3NUVlam\nO++8R/Xq1dfMmTOUn39IV155jUaOfESSVFJSouefn6lPP12vwsJCJSY21wMPPKQLLrjwlPvaufM7\nzZw5Xf/3f18rNDRUnTt31bBhI5Sbu1e33TZAkpSWNkhpaX/VrbcOrvDYf/0rXV9/na3Fi1coNvZs\nSdLZZ5+t22+/UxEREfrpp58kSZZl6ZVXXtTq1e/r0KGDuvDCi/T3vw9XUlKyJCk1tbduu22wPvnk\nI23c+JXi4uI0cuQotWnTTpZlafbsmfrwww909OhRNWjQQPfc83e1bdtekrR58yb94x/PaufO7xQd\nHa0ePXrpzjvvkSS98sqL+vrrbEVFReqLLzK0atVHSk3trZtvTtN11/XV5MmP6ayzzpLTGar3339X\nISEhGjToFu+pDHv2/Kjx40fphx92qlmzRF1/fT899thYrV+/wc5x24YPSQEAgGqTm5ujgwcPaOnS\n93TjjYP0j3/M0po1qzR//kJNnfqMVqxYqu3bv5YkvfDCc/r222/00kuv6b33PlSzZokaM+bBU9Yt\nLS3V8OFD1bx5ktLTV+vFF+dr06avNG/eHDVs2EgLFy6VZVl67bU3TwqnkvTJJ//WFVd09YbTXxo0\n6FZ17XqlJOntt9/Q2rWr9fTTs7Vq1Ue6+upr9fDDw1VScsy7/VtvvaHBg+/S+++v06WXttJzzz0l\nSVqz5gN99dUG/fOfi7R69cdKTR2oJ554VB6PR3l5hzRixFBdc01P/etfazVt2jN699139M47S7x1\nt23bqj//uY1WrfrolD+DDz9crT/9qanS01dryJC/a+7c55WXd0iSNHr0g2rYsJHee2+t7r13mObN\nmyOHw3EaE6sZBFQAAFBtSkpKdPPNaQoNDdVll12uY8eKdf31/RQZGalLLvmzoqNjtHv3blmWpfff\nf1dpaXcoLu4chYeH64477lZu7l5lZ2edVPfzzz/VsWPHNHjw3xQWFqb69RPUr9+NWrduTYXtLMs6\nZV85OXvUqNH5f9j/e++tVP/+NykhoYFCQ0PVr9+NqlWrlj799H+921x22eVq1uxihYaGqlOnLtq9\ne5ckqajoiJzOUEVEhMvhcKhHj15aseIDOZ1OffjhatWrV1/XX99PoaGhatKkqa666lqtXftz/05n\niK67ru9v9nbeefV11VU95HQ61bXrlSovL9fu3bt08OABfffdt7rlltsVERGhiy9uriuu6PaHz7Um\n8RY/AACoNi5XrPcqARERx7/WqXOud31ERLjc7hLl5+fp6NGjeuSRETpxoM+yJMsq1/79+3Txxc0r\n1N27N0f16ycoNPTnaNOgQQPt25d7Wn05HA6Vl5f/4XZ79uzRs8/O8B4VPdHTgQP7vNvUr1/f+/vI\nyEiVl5ertLRUXbt216pV7+n663uobdt2uuyyy9W1a3eFhoZq794cXXDBBRX21aBBQ/373x96v69b\nN/53e/vlfiMiIiUd/w/BwYMH5XA4VK9ePe/6X//8TENABQAA1eZUbys7HCe/oRsRESFJmjv3FTVp\n0vQP67rd7tPe36k0aNBQO3d+94fbRUREaNSo8frLXzr/5janej6S5HK5NHfuq9q6NVOffvqJXn55\nrt55Z4lmz35JpaWn7l/6uX+n8/dj22/t17KOB+9fhveQEHPf3pf8eIt/8uTJatasmff7jIwMpaam\nqlWrVurVq5fS09NtaRAAAASf6OgYxcbG6ttvv6mwPDd37ym3T0hooJycPSorK/Mu+/7773XeeT8f\nVfy9sNqpUxd99NE65eaefMR17tzn9fzzz3r38+2320+rp19zu90qKTmmFi2SdNdd9+r119/Wt99+\nqx07vlH9+g30ww/fV9j+hx92KiEh4bRq/57ateNkWVaF57Zt28mnSZikUgE1OztbK1as8A56//79\nGjJkiAYNGqSMjAyNHj1a48aNU1aW2U8eAADTFe7OU96O/dXyq3B3XrU/v986J1SSevfuq9dee1m7\ndn2vsrIyvf32G7rzzttUUlJy0rbt23dQaGio5s+fp9LSUu3a9b2WLHlL11zT87T2dfXV1yo5+RL9\n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\nrz59+mjDhg1KT0/XhRdeqD59+ig8PFwpKSnq0qWLFi9eLElatGiR+vbtq6SkJIWHh+uOO+6Qw+HQ\nunXravhZ4Y9YlqUJEyZo8ODB3mXMOzC9+uqreuCBB3T++ecrOjpaY8aM0ZgxY5h3ADpw4IAOHDig\n3r17KzQ0VLGxsbryyiuVnZ3NvANEZGSkFi9erEaNGp20zp8ZezweLV26VPfee6/i4+Plcrl0//33\n66OPPtKBAwdOq7caD6jbtm1TQkKCYmJivMsSExO1c+dOHT16tAY7Q2XUqlVLTzzxhOLi4rzL9u7d\nq/j4eGVlZal58+YVtk9MTFRmZqYkaevWrUpMTPSuczgcuvjii73rYa4333xTERER6tmzp3fZtm3b\nmHeA2bdvn3788UcVFBTo2muvVbt27TRs2DDl5eXx+g5A8fHxSkxM1KJFi3T06FEdOnRIq1evVufO\nnZl3gLj55psr5K9f8mfGu3bt0uHDh3XxxRd71zdu3FiRkZGnfapHjQfUgoICuVyuCsvOPvtsSfKe\n54IzV2Zmpt544w3dfffdp5x1bGysd86/td6nc1ZQ7Q4ePKjZs2drwoQJFZYz78Czb98+SdIHH3yg\n1157TStXrlRubq7GjRvHvAOQw+HQs88+qw8//FCtWrVSx44d5fF4NHz4cOYdBPyZcUFBgRwOh2Jj\nYyusd7lcp53tajygSsffHkTg+fLLL3XHHXdo5MiRSklJkcSsA9GUKVN0ww03qHHjxietY96B5cQ8\n77zzTtWpU0fx8fG67777vG/bMu/A4na7dc8996hHjx7673//q08++US1atXSyJEjJTHvYODvjP15\nfI0H1Li4uJP+R3Uief/ybWKcWdatW6e77rpLY8aM0U033SRJql279ilnfc4550g6/mfh1/+zKigo\n4M+BwTIyMrRx40YNGTJEUsW/jJh34KlTp46k46fynJCQkCDLslRWVsa8A0xGRob27Nmj4cOHKzo6\nWueee66GDh2qNWvWyOl0Mu8A58/f4XFxcbIs66TH//TTT6f9Z6DGA2qLFi20d+/eCk9iy5Ytuuii\nixQVFVWDnaGyvvrqK40aNUqzZs1S7969vctbtGhx0rknmZmZSk5OPuX68vJybdu2zbse5lm5cqXy\n8vLUuXNntW/fXv369ZNlWUpJSdGf/vQnbd26tcL2zPvMVq9ePcXExCg7O9u77Mcff1RYWJg6derE\nvANMeXm599cJbrdbDodDl112GfMOcJX9N/uSSy5Rw4YNFRsbW2H99u3bVVpaqqSkpNNrwK/rE9ik\nf//+1tixY63Dhw9b3377rdW1a1dr4cKFNd0WKqGsrMzq0aOHtWjRopPWHTp0yGrVqpW1ePFiq6Sk\nxProo4+sSy65xNq+fbtlWZb1ySefWG3atLE2bdpkFRcXW7NmzbKuuOIKq6SkpLqfBk5TYWGhlZub\n6/21adMmq2nTpta+ffusnJwc5h2AnnzySevKK6+0fvjhB+vgwYPWgAEDrDFjxvD6DkD5+flW+/bt\nrWeeecYqLi628vLyrHvuuce65ZZbmHeAeeSRR066zJS/M54xY4bVt29fa+/evVZeXp511113Wfff\nf/9p92REQM3NzbXuvPNOKzk52erQoYM1e/bsmm4JlbRhwwarWbNmVsuWLa2kpKQKX3NycqwNGzZY\n1113nZWUlGRdffXV1po1ayo8/s0337Q6d+5stWzZ0rrpppusb775poaeCSrjxx9/9F4H1bIs5h2A\nSkpKrIkTJ1pt27a1/vznP1ujRo2yjh49alkW8w5EWVlZ1i233GK1bdvW6tChgzV8+HBr//79lmUx\n70Bw4t/nxMREKzEx0fv9Cf7M2O12e/+uaNWqlTVy5Ejr8OHDp92bw7I4yxkAAADmqPFzUAEAAIBf\nIqACAADAKARUAAAAGIWACgAAAKMQUAEAAGAUAioAAACMQkAFAACAUQioAAAAMAoBFQAAAEYhoAIA\nAMAoBFQAAAAY5f8BH7Gl4s9eBtIAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "val, bins, patches = plt.hist((y[\"Survival_in_days\"][y[\"Status\"]],\n", " y[\"Survival_in_days\"][~y[\"Status\"]]),\n", " bins=30, stacked=True)\n", "plt.legend(patches, [\"Time of Death\", \"Time of Censoring\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we need to create an initial model with default parameters that is subsequently used in the grid search. We are going to use a Red-Black tree to speed up optimization." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "estimator = FastSurvivalSVM(optimizer=\"rbtree\", max_iter=1000, tol=1e-6, random_state=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we define a function for evaluating the performance of models during grid search. We use Harrell's concordance index." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def score_survival_model(model, X, y):\n", " prediction = model.predict(X)\n", " result = concordance_index_censored(y['Status'], y['Survival_in_days'], prediction)\n", " return result[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The last part of the setup specifies the set of parameters we want to try and how many repetitions of training and testing we want to perform for each parameter setting. In the end, the parameters that on average peformed best across all test sets (200 in this case) are selected. [GridSearchCV](http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html) can leverage multiple cores by evaluating multiple parameter settings concurrently (I use 4 jobs in this example)." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "param_grid = {'alpha': 2. ** np.arange(-12, 13, 2)}\n", "cv = ShuffleSplit(n_splits=200, train_size=0.5, random_state=0)\n", "gcv = GridSearchCV(estimator, param_grid, scoring=score_survival_model,\n", " n_jobs=4, iid=False, refit=False,\n", " cv=cv)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, start the hyper-parameter search. This can take a while since a total of ``13 * 200 = 2600`` fits have to be evaluated." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings(\"ignore\", category=UserWarning)\n", "gcv = gcv.fit(x, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check what is the best average performance across 200 random train/test splits we got and the corresponding hyper-parameters." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(0.71282371869380479, {'alpha': 0.00390625})" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gcv.best_score_, gcv.best_params_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we retrieve all 200 test scores for each parameter setting and visualize their distribution by box plots." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def plot_performance(gcv):\n", " n_splits = gcv.cv.n_splits\n", " cv_scores = []\n", " for i, params in enumerate(gcv.cv_results_[\"params\"]):\n", " validation_scores = np.empty(n_splits, dtype=float)\n", " for j in range(n_splits):\n", " validation_scores[j] = gcv.cv_results_[\"split%d_test_score\" % j][i]\n", " name = \"%.5f\" % params[\"alpha\"]\n", " cv_scores.append((name, validation_scores))\n", "\n", " sns.boxplot(pandas.DataFrame.from_items(cv_scores))\n", " _, xtext = plt.xticks()\n", " for t in xtext:\n", " t.set_rotation(\"vertical\")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAApwAAAIYCAYAAADAajxrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xl4VPXd/vF7QhKBhBgGSJAEWgUtoYlCWC2oiFVxQUGr\nJfgTQUBcggplUS+hRa0+KtQnFcVCtSnuKMri8rgh1rZulArRIBSkUQgkQDJsIfv5/UEzMiUJc0hO\nzvkm79d1cXVyzpmZm/QY7pzlMz7LsiwBAAAADolwOwAAAACaNwonAAAAHEXhBAAAgKMonAAAAHAU\nhRMAAACOonACAADAURROAAAAOIrCCQAAAEdROAEAAOAoCicAAAAcZbtw5ufna/LkyRo4cKCGDRum\nefPm1bpdZWWlsrKy9POf/1x9+vTRuHHj9P333zc4MAAAAMxiu3BmZmaqc+fOWr16tbKzs/Xee+8p\nOzv7mO3+8Ic/aMWKFXryySf12WefKT09XbfeemtjZAYAAIBBbBXOnJwcbd68WTNmzFBMTIy6deum\n8ePHa+nSpcds++GHH+raa6/VGWecoejoaE2ZMkXFxcVav359o4UHAACA99kqnLm5uUpKSlJsbGxw\nWa9evbRt2zaVlJQcs73P5wt5HBsbq40bNzYgLgAAAExjq3AGAgHFxcWFLIuPj5ckFRcXhywfOnSo\nXn75ZW3evFnl5eV6/vnnVVBQoH379jUwMgAAAEwSafcJlmWFtd1NN92k/fv3a8KECbIsS1dffbX6\n9++vVq1a2Q4JAAAAc9kqnH6/X4FAIGRZIBCQz+eT3+8PWR4dHa177rlH99xzT3DZiBEjlJiYGPb7\nWZYVcloe3nbo0CFdf/31OnjwYKO9ZmxsrJ599lnFxMQ02mvWxuTsEvlrY/K+I5mdn30nfCbnNzm7\nRP7aOJnfZ4V7yFLSxo0b9Ytf/EJ/+9vfgqfSn3vuOb388statWpVyLa5ubnav3+/Bg0aJEkqKCjQ\nsGHD9M477yg5OTms99u796AiIiicJikpOaQdO3bUuf7777/TH/7whCRp8uTb1LVrt3pfLykpSW3b\nOv8frnT87JK9/E2ZXWr++VvSviOZnZ99xx6T87PvhGqp+du3P/5zbB3hTElJUVpamubPn69Zs2ap\noKBA2dnZmjBhgiRp+PDhevDBB5Wenq5NmzZp/vz5euGFF+T3+zV37lxdcMEFYZdNSaqutlRdHXYf\nhgdER7fRqaf2qHN9VVV18HGXLsn1blujsrL6uNs0huNll+znb6rsUvPP39L2Hcns/Ow74TM5P/vO\nschfO9vXcGZlZWn27NkaMmSIYmNjlZGRoYyMDElSXl5e8G71UaNGafPmzbrmmmtUXV2t888/X3Pm\nzGnc9M1QSckh5efX/9uiJJWWlkqSWrduXe92Xbo07W9bAAAA/8124UxMTNSiRYtqXfffI49mzZql\nWbNmnViyFqik5JDuuOMWlZQcarTXbNs2RllZCymdAADANXyWOgAAABxl+wgnnFNzNPJ4p9S3b/9O\nixcvlCRNmnSLkpPrvgiYU+oAAMBtFE6Pads2Rj16nBH29snJ3WxtDwAA0NQ4pQ4AAABHUTgBAADg\nKAonAAAAHEXhBAAAgKMonAAAAHAUhRMAAACOonACAADAURROAAAAOIrCCQAAAEdROAEAAOAoCicA\nAAAcReEEAACAoyLdDtDYSkoOKT9/x3G3Ky0tlSS1bt263u26dElS27YxjZINAACgJWpWhbOk5JDu\nuOMWlZQcarTXbNs2RllZCymdAAAAJ4hT6gAAAHBUszrCWXM08nin1Ldv/06LFy+UJE2adIuSk7vV\nuS2n1AEAABqmWRVO6Ujp7NHjjLC3T07uZmt7AAAA2MMpdQAAADiKwgkAAABHUTgBAADgKAonAAAA\nHEXhBAAAgKMonAAAAHAUhRMAAACOonACAADAURROAAAAOIrCCQAAAEdROAEAAOAoCicAAAAcReEE\nAACAoyicAAAAcBSFEwAAAI6icAIAAMBRFE4AAAA4isIJAAAAR1E4AQAA4CgKJwAAABxF4QQAAICj\nKJwAAABwFIUTAAAAjqJwAgAAwFEUTgAAADiKwgkAAABHUTgBAADgKAonAAAAHEXhBAAAgKMonAAA\nAHCU7cKZn5+vyZMna+DAgRo2bJjmzZtX63aWZen3v/+9hg0bpvT0dF155ZV66623GhwYAAAAZom0\n+4TMzEylpaVp9erV2rt3ryZNmqSOHTtq3LhxIdu98MILWrZsmZYsWaJu3brpo48+UmZmpnr06KEz\nzjijsfIDAADA42wd4czJydHmzZs1Y8YMxcTEqFu3bho/fryWLl16zLa5ubnq27evfvSjH8nn82no\n0KGKj4/Xpk2bGi08AAAAvM9W4czNzVVSUpJiY2ODy3r16qVt27appKQkZNuhQ4fq888/1zfffKOK\n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\nJ5i/Q4cOOuuss/TLX/5Sp59+ussJ6+fV/M1+8PuCBQvqXPfHP/5RGRkZiomJUWZmZhOmCt9bb72l\nmTNnKj4+XqWlpXrooYd09913a9CgQSovL9enn36qBx54QFdccYXbUU/YWWedpfXr17sd4xgffPCB\n7rzzTsXExOjQoUPq3bu3srKyQn7YezW7dOSHzuTJk+Xz+ZSSkqKTTz5ZkhQIBJSbm6uTTjpJixYt\nUo8ePVxOWjvyu8fk7NKRnHfffbfWrFmj1q1bKy4uTpK0b98+VVRU6KKLLtL999+v2NhYl5PWzvT8\n2dnZWrp0qbZt2xZc5vP51L17d40ZMyb46YRetGrVKs2ePVvDhg1Tr169Qvb9nJwcffzxx3r00Uf1\n85//3OWktfN0fquZ69Onj9W/f39rxowZ1l133RXyJy0tzbrjjjusu+66y+2YdbriiiusDz/80LIs\ny3r//fet3r17W2vWrAmu//jjj63LL7/cpXTH9+233x73T1pamtsxazVy5EjrlVdesSzLsvbt22dN\nmTLFuuyyy6xAIBDcxqvZLcuyxowZYy1atMiqrq4+Zl1VVZX1+OOPW9ddd50LycJDfveYnN2yLOv2\n22+3pkyZYm3duvWYdZs2bbImT55sTZ8+3YVk4TE5/6OPPmpddNFF1osvvmitX7/eysvLs/Ly8qz1\n69dbzz77rHXBBRdYCxYscDtmnS6//HLr73//e53r16xZYw0fPrwJE9nj5fzNvnDu2rXLyszMtC69\n9FLrs88+C1k3cOBAa9euXS4lC0+fPn2CP/TLy8utnj17WmVlZcH1lZWVVp8+fdyKd1w/+clPrJ49\ne1o/+clPjvlTs7xnz55ux6xVnz59rMrKypBl06ZNs8aMGWOVl5dblmVZZ555phvRwtK3b9+QfeW/\nHT58mPwOMjm/ydkty7IGDRpk7du3r871RUVFVt++fZswkT0m5z///POtvLy8Otdv2bLFGjx4cBMm\nsic9Pb3efb+srMzTBxq8nL/Z3zSUmJioxx9/XDNnztQ999yjmTNnqqioyO1YYYuPj9d3330nSdq6\ndassy9K//vWv4PotW7Z4+nqeyy+/XCNHjtQHH3xwzJ/3339f77//vqKiotyOWauEhATl5OSELHv4\n4Yd10kknacqUKSorK3MpWXg6duyoTZs21bl+06ZNnt53yO8ek7NLUnR0tA4fPlzn+rKyMrVq1aoJ\nE9ljcv5Dhw7Ve19EYmKiDh482ISJ7DnttNP05ptv1rl+5cqVOu2005owkT1ezt9ibho677zzNGjQ\nIC1YsECXX365MjMz5fP53I51XCNHjtTYsWPVt29fff7557r11ls1ZcoUjR49WlVVVXrllVc0cuRI\nt2PW6b777tNVV12lTZs2adiwYW7HseWGG27QTTfdpGnTpmn06NGSpMjISC1cuFBTp07ViBEjVFVV\n5XLKuo0ZM0YTJ07UVVddpV69egWvAysuLtbXX3+tFStWaNq0aS6nrBv53WNydunIz/vMzEzddttt\nwWtQLctSIBDQ119/rYULF+ryyy93O2adTM7fu3dvPfLII5oxY8Yx15gGAgHNnz/f0ze6Tps2Tbfe\nequeffZZ/fSnP1VcXFzI937Hjh166qmn3I5ZJy/nb/Y3DdVmy5Ytmjt3rtauXas1a9YoMTHR7Uh1\nsixLL7zwgnJzczV06FBdeOGFWr58uZ5//nlVVVVp2LBhuvnmmxUZ6d3fHQoLC1VUVKSePXvWun7h\nwoW65ZZbmjhVeN555x2VlZXVelPWypUr9dprryk7O7vpg4Vp9erVWrp0qb766quQO41TU1OVkZGh\nc845x+WE9SO/e0zOXl5ert/97ndatmyZDhw4EDy4YFmWTj75ZF177bW6/fbbPXt2xeT8+fn5yszM\n1ObNm5WUlBRSeHbu3Km0tDRlZWV5+t/dwsJCrVq1Srm5ucF9v3379kpNTdUVV1zh6aP7knfzt8jC\nWSM/P1+nnHKKEUc6AQD2VFVV6bvvvgspzF27dlVEhBlXk5mcPycnJ6Tw1PyykpKS4nKy8Jk61qmG\n1/J797BYI1q1apW++OILJSYmKiMjI9juu3TpIkm65JJL9Pbbb7sZsV67du3SypUr9c0332jfvn1q\n1aqVEhMTlZ6erksuuUStW7d2O2K96srfp08fXXrppZ7NX15ernfeeUcjRoxQdXW1nnvuOb399tva\ns2ePunTpoquvvtrT46jeeecdXXzxxcGvX3vtNb322msqLCxU165dlZGR4dnRHjW8Ok8uXCbnNzm7\nVPcc0d69e+u8887z/BxR0/N37txZe/fuDeb0+/2ePqp5NJPHOknezd/sj3AuXLhQzzzzjM4++2zt\n2rVL33//vRYuXKjevXsHtznzzDO1YcMGF1PW7W9/+5vuuOMODRkyRHFxcfrwww81atQolZSU6G9/\n+5tKS0v1xz/+Ud27d3c7aq1Mzj9nzhzt2LFDTz/9tObPn69XX31V11xzjZKSkrRjxw69+uqrmjhx\nom688Ua3o9bq6Bmh2dnZWrBggUaPHq2kpCRt3bpVr732mu69915dddVVLietnafnyYXB5PwmZ5fM\nnyNqcn7TZ4jOmzdP7733nsaPH69evXopPj5e0pG/14YNG5Sdna1Ro0bptttuczlp7Tyd34U745vU\nBRdcYK1fvz749ZIlS6z+/ftbGzduDC7z8niPyy+/3Prggw+CX3/++efWnXfeGfz6ySef9PQ8PJPz\nDxgwIDg269xzzw3ZjyzLsnJzcz093uPo0Rfnnnuu9de//jVk/V//+lfrggsuaOpYYfPyPLlwmJzf\n5OyWZf4cUZPzmzxD1LLMH+vk5fzNvnCmp6cfM0vx2Weftc455xxr586dlmV5u3D27t3bqqioCH5d\nXl5u9evXL/h1ZWWl1bt3bzeihcXk/Onp6cFZeEOGDLFKSkpC1u/fv9+z2S0rdL8eOHBgyP8PlmVZ\nFRUV1llnndXUscLm5Xly4TA5v8nZLcv8OaIm5zd5hqhlHTnQcPDgwTrXHzhwwNM/N72c3/tXHjfQ\n6aefrmXLloUs+3//7/9p1KhRuv7667VlyxaXkoWna9eu+uijj4Jff/zxxyF3mH388cdq3769G9HC\nYnL+n//855ozZ46Kioo0fvx4PfbYY6qsrJR05DPWZ82a5enxHkfr16+fvvzyy5Bln3/+uTp37uxS\nouPz8jy5cJic3+TskvlzRE3Ob/IMUemHsU61zQoNBAJ6+OGHPf1z38v5m/1NQ9OmTdPkyZO1detW\n3X333cHlU6dOVXx8vK699lpVVFS4mLB+N910k+644w4NGDBAPp9Pn332mebMmSNJevPNNzVr1iz9\n9re/dTll3UzOP3v2bN1zzz0677zz1KVLF+3atUsvvPCCWrdurUOHDumnP/2pnnjiCbdj1qmsrEwX\nXHCBJOngwYPav3+/lixZIkl68cUX9cgjj+iee+5xM2K9vDxPLhwm5zc5u2T+HFGT85s8Q1SSfv3r\nXyszM1ODBg2qd6yTV3k5f7O/aUiSdu7cqT179igtLe2Ydd9//71WrVqlW2+91YVk4fniiy/04Ycf\nSpLOP/989e/fX5JUUFCgsrIydevWzc14x2V6/vz8fP3jH//Qrl27ZFmWOnXqpO7du+vMM890O1q9\nPv/885CvY2Nj1atXL0nS//3f/ykqKipYSL3Kq/PkwmVyfpOzS2bPEZXMzW/yDNGjmT7WyYv5W0Th\nrOG1mVR2mZ7/aMXFxYqKivLsnYp1qaioUFFRkRISEprF/NadO3fqlFNOcTvGcZm+75uc3+TscI/J\nM0Qlaffu3fr6669D9v20tDTP/6JVw4v5W0Th9OpMqnCZnH/Pnj2aO3euNm/erMsuu0xTpkzR9OnT\n9eabb8rn86lfv36aP3++EhIS3I56jAceeED33nuvJOnw4cOaO3eu3njjDVVVVSk6Olq//OUvNX36\ndM/Owzt48KAefvjh4AzaW265RYMGDQrZ5ujRSV5k8r4vmZ3f5OyS+XNETc5v8gxR08c6eTl/sy+c\nnp5JFQbT80+dOlV79uzRRRddpNdff11nnnmmtm3bpqlTp8rn82nBggWKi4vT/Pnz3Y56jKPL2Jw5\nc/Tll19q+vTpwTmWv//973Xuuedq5syZLiet3d13361//etfGjVqlPLz8/X8889rxowZuu6664Lb\neHkGren7vsn5Tc4umT9H1OT8Js8QlaQ77rhDlmXpzjvvPObGuM2bN+t3v/ud2rVrp0cffdSlhPXz\ndP6mvi2+qXl5JlU4TM8/ePBgq6ioyLIsy9q6dauVkpIS8vfZu3ev9bOf/cytePU6euxL//79j5kr\n9+2331qDBg1q6lhhGzx4cHCOqGVZ1oYNG6wBAwZYK1asCC7z6mgVyzJ/3zc5v8nZLcv8OaIm5zd5\nhqhlmT/Wycv5zbiYogEOHTqkDh061Lk+MTGx1vEBXmF6/tLS0uCh+9NOO00REREhNwm1bdtWJSUl\nbsWr19HXaMbExKhr164h65OSklRWVtbUscJWUVERPLogSWlpaXryySd133336ZNPPpF05EJ+rzJ9\n3zc5v8nZpSM3+vXt27fO9WeffbZ27NjRhInsMTn/pk2bdMMNN9R6jXtERIQmTpyonJwcF5KFx/Sx\nTl7O3+wLp5dnUoXD9Pypqal6+umnVV1dLUl69913Q9Y//vjjSk1NdSPacVmWpZ07dyo/P199+vTR\nypUrQ9b/+c9/1hlnnOFSuuPr37+/7r//fhUVFQWX9e3bV4888ojuvPNOvfLKK56+8cn0fd/k/CZn\nl8yfI2pyfpNniEo/jHVas2aNCgoKVFpaqsOHD2vnzp16//33ddttt3l6rJOX8zf7azjz8/OVmZmp\nzZs31zuTKjEx0e2otTI9/zfffKMJEyZo6tSp+sUvfhGybvjw4Tp48KD+9Kc/efIC+J49e8rn8wWP\nAvbu3VsvvfSSJOnhhx/Wyy+/rEWLFqlfv35uxqxTfn6+br75ZqWlpR0z63TdunWaPXu2vv32W23c\nuNGlhPUzfd83Ob/J2SXpk08+0a233qpTTz213jmiXv1v1+T8S5Ys0RNPPHHcGaKjR492OWntTB/r\n5OX8zb5w1vDiTCo7TM5fXl6u0tLS4A+eGp9++qlSU1M9e7dffTZu3Ci/3+/Zf3CPduDAAbVr1+6Y\n5VVVVfrnP//pyX+0jmbyvi+Znd/k7KbPETU5v6kzRI9m+lgnL+ZvMYXTizOp7CC/N61du9bTha2q\nqip4vU5ZWZn+8Y9/aPfu3UpKSlJ6eroxPzwlqbKyUmvXrlVhYaG6deum3r17ux0pLCbv+yZnr2H6\nHFHT85vI5LFOknfzN/vC6eWZVOEgv7d5eY7l3//+dz3++ON68cUXlZubq5tvvllFRUWKj49XIBBQ\ncnKyFi9efMzNUF4xcuRILV++XNKRTwSbOHGiduzYoZNPPllFRUVKSUnRU0895ckZrpLZ+77J2WuY\nPkfU5PwmzxA1fayTl/M3+8Lp6ZlUYSC/t3l5juWVV16pG264QVdddZVGjx6tlJQUzZgxQ23bttWh\nQ4f02GOPadOmTXr22Wfdjlqro7+348ePl9/v13333aeYmBgVFRVp7ty5qq6u1uOPP+5y0tqZvO+b\nnF0yf46oyflNniEqSdddd52GDh2qiRMnHnNTZXV1tZ588kl9+umneu6551xKWD9P52+i8Uuu8fJM\nqnCQ3z2DBw8+7p+ePXu6HbNOZ555plVWVmZZlmX17dvXOnjwYMj6w4cPe3oO59FzUPv06WMVFxeH\nrA8EAlafPn2aOlbYTN73Tc5uWebPETU5v8kzRC3ryM/Kmp+btfH6z00v549s+orbtGpmUv33DSs1\nTJmpRf6ml5CQoK5du2ro0KG1rrcsS3PmzGnaUDYkJSXpiy++0ODBg9WrVy999913ITd7rF271tPX\n4h392/kpp5xS6/WmXr6WyuR93+TskvlzRE3Ob/IMUemHsU5paWm1rvf6WCcv52/1m9/85jeuvHMT\n2bZtm5YsWaKEhAS1adNGkZGRqqio0J49e/TZZ59p7ty5Ovfcc3Xeeee5HbVW5HfPoEGD9OSTT+rm\nm2/Wz372M6WkpBzz56mnntItt9zidtRade7cWTNnzlRhYaF69Oih3/3ud9q/f79yc3P10ksvKSsr\nS+motJAAABIjSURBVHfccUedP5jc9sQTT6hLly765ptvtGvXLv373//W4MGDJR25meU3v/mNkpKS\ndMkll7ictHYm7/smZ5eO/DK1fv169e/f/5hfSgKBgB599FHFx8drxIgRLiWsn8n533//fbVu3brO\nSQavv/66vv/+e8+ORaqurtbs2bNVVFSk4uJi7dq1S3l5efryyy+1bNkyPfroo5oyZYpn50d7OX+z\nv4bTyzOpwkF+d3366afat2+fLr744lrXT5gwQU8//XQTpwrfxo0btWTJEq1bt067du2SZVnq2LGj\nevToodGjR2vYsGFuR6zT9ddfH/L16aefHjyiPHfuXK1fv15PPvmkOnfu7Ea84zJ53zc5u2T+HFGT\n85s8Q7SG6WOdvJq/2RfOGl6cSWUH+YEfHDx40NN3SB/N5H3f5OyS2XNEJXPzmzxDFM5p9tdwSt6d\nSRUu8runruxnnXWWhg4d6unsktnfe0navn271q9fr8TExJAjIjVlc86cObrvvvvcindcJn//Tc5e\no3Pnztq7d28wqykf1lDD1PwJCQmaMGGCsTNETR7rJHk3f7M/wunlmVThIL97TM4umZ//gw8+0J13\n3qmYmBgdOnRIvXv3VlZWVsjRES/PQTX5+29ydsn8OaKm5zd5hqjpY508nb/pb4xvWmPGjLEWLVpk\nVVdXH7OuqqrKevzxx63rrrvOhWThIb97TM5uWebnHzlypPXKK69YlmVZ+/bts6ZMmWJddtllViAQ\nCG5z9OgkrzH5+29ydsuyrNtvv92aMmWKtXXr1mPWbdq0yZo8ebI1ffp0F5KFx+T8jz76qHXRRRdZ\nL774orV+/XorLy/PysvLs9avX289++yz1gUXXGAtWLDA7Zh1Mn2sk5fzN/vC6eWZVOEgv3tMzm5Z\n5ufv06ePVVlZGbJs2rRp1pgxY6zy8nLLsixP5zf5+29ydssyf46oyflNniFqWZaVnp5e775fVlbm\n6V90vZzfjCu/G6BmJlVdTJmpVRfyO8fk7JL5+RMSEpSTkxOy7OGHH9ZJJ52kKVOmqKyszKVk4TH5\n+29ydumHOaJ18focUZPzmzxDVJJOO+00vfnmm3WuX7ly5TGfvuUlXs7f7G8aGjNmjCZOnKirrrpK\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_performance(gcv)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "# Kernel Survival Support Vector Machine\n", "\n", "This section demonstrates how to use the efficient implementation of *Kernel Survival Support Vector Machines* as proposed in\n", "\n", "> Pölsterl, S., Navab, N., and Katouzian, A.,\n", "> *An Efficient Training Algorithm for Kernel Survival Support Vector Machines*\n", "> 4th Workshop on Machine Learning in Life Sciences,\n", "> 23 September 2016, Riva del Garda, Italy\n", "\n", "As kernel we are going to use the clinical kernel, because it distinguishes between continuous, ordinal, and nominal attributes." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sksurv.svm import FastKernelSurvivalSVM\n", "from sksurv.kernels import clinical_kernel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To use `GridSearchCV` with a custom kernel, we need to pre-compute the squared kernel matrix and pass it to `GridSearchCV.fit` later. It would also be possible to construct `FastKernelSurvivalSVM` with `kernel=\"rbf\"` (or any other built-in kernel), which does not require pre-computing the kernel matrix." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [], "source": [ "kernel_matrix = clinical_kernel(data_x)\n", "kssvm = FastKernelSurvivalSVM(optimizer=\"rbtree\", kernel=\"precomputed\", random_state=0)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [], "source": [ "kgcv = GridSearchCV(kssvm, param_grid, score_survival_model,\n", " n_jobs=4, iid=False, refit=False,\n", " cv=cv)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings(\"ignore\", category=UserWarning)\n", "kgcv = kgcv.fit(kernel_matrix, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, print the best average concordance index the corresponding parameters." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(0.70387140748796484, {'alpha': 0.015625})" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kgcv.best_score_, kgcv.best_params_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we visualize the distribution of test scores obtained via cross-validation." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nlJCQ4N/Wu3dvbd++XSUlJccdv2XLFo0fP14DBgzQmDFj9K9//Sv8xAAAADBKSAWnz+dTYmJiwLak\npCRJUlEfDH1vAAAgAElEQVRRUcD25ORkde/eXQsWLNBHH32kK6+8UtOmTdO3334bXmIAAAAYJeRr\nOC3LCuq4q666SldddZX/64kTJ+qtt97S66+/rltvvTWoc0RFeRQV5Qk1YpPatIkKeBwdbdZifZPz\nm5xdIr+TTM4ukd9JJmeXyO8kk7NL7sofUsHp9Xrl8/kCtvl8Pnk8nqBWnqekpGjfvn0hPF+8PJ7m\nLzjbt48NeNyxY3yzP4edTM5vcnaJ/E4yObtEfieZnF0iv5NMzi65K39IBWd6erp2794tn8/nn0rf\nsGGDevTooXbt2gUcu3jxYvXv319Dhgzxb9u2bZsuueSSoJ+vsLDYlhHOI0dKAx4XFRU3+3PYyeT8\nJmeXyO8kk7NL5HeSydkl8jvJ5OxSy+UPppANqeBMS0tTRkaGFi5cqDlz5mjv3r1atmyZJk+eLEka\nNWqUfvOb3ygzM1M+n0/333+/nnjiCaWkpOjPf/6zvvvuO40dOzbo56uutlRdHdwUfiiqqqoDHldW\nVjdytPu4OX9JSbEKCnY1uD8/f6f/8Y4d3wb8LPXp2jVFcXHu+Y3Sza99MEzOb3J2ifxOMjm7RH4n\nmZxdclf+kK/hzMnJ0dy5czVs2DAlJCQoKytLWVlZkqQdO3b4V6vfeeed8ng8mjhxog4dOqSePXvq\nT3/6k5KTk5v3J4BrlJQUa+bM6SopCe43qKVLFzd5TFxcvHJyFruq6AQAAKEJueBMTk7WkiVL6t23\nefNm/+OYmBjdfffduvvuu088HQAAAIwXcsEJNKR2NLKxKXVJKi2tuaYkNja20eMk902pAwCA0FFw\nolnFxcWrZ88znI4BAABcxKyGUgAAADAOI5zA/zS1wl4KXGVf93F9uBwAAIAaFJyAQl9hLzW9yp4V\n9gAA1GBKHQAAALZihBNQ8CvspeBX2TOlDgBADQpO4H9MX2HPNagAALei4AQiANegAgDcjGs4AQAA\nYCtGOIEIwDWoAAA3o+AEIoTp16ACACIXU+oAAACwFQUnWty6dZ9r3bq1Tsc4YabnBwCgpTGljhZV\nXl6u3Nxn5fF4lJ7eRzExMU5HConp+QEAcAIjnGhRK1e+qv3792nfvr1auXKF03FCZnp+AACcQMGJ\n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\nK65Q7969/deBFRUVadOmTXrttdd0xx13OJyyYeR3jsnZpZrP++zsbN1yyy3+a1Aty5LP59OmTZu0\nePFiXXrppU7HbJDJ+fv166dHH31Us2fPPu4aU5/Pp4ULF7p6oesdd9yhm2++Wc8995x++tOfKjEx\nMeC137Vrl5566imnYzbIzfkjftFQfb7++mvNnz9fa9eu1erVq5WcnOx0pAZZlqW//OUvysvL04gR\nI3TBBRdoxYoVev7551VVVaWRI0fqpptuUnS0e3932LdvnwoLC9WrV6969y9evFjTp09v4VTBeeed\nd1RWVlbvoqzXX39dr7zyipYtW9bywYK0atUqvfjii/ryyy8DVhqnp6crKytL55xzjsMJG0d+55ic\nvby8XL/97W/18ssv68iRI/7BBcuy1KFDB1199dW69dZbXTu7YnL+goICZWdna+vWrUpJSQkoeHbv\n3q2MjAzl5OS4+t/dffv2aeXKlcrLy/O/9zt27Kj09HRddtllrh7dl9ybv1UWnLUKCgp06qmnGjHS\nCQAITVVVlXbu3BlQMHfr1k1RUWZcTWZy/o0bNwYUPLW/rKSlpTmcLHimtnWq5bb87h0Wa0YrV67U\n559/ruTkZGVlZfmr+65du0qSLr74Yr399ttORmzUnj179Prrr+urr77SoUOH1KZNGyUnJyszM1MX\nX3yxYmNjnY7YqIby9+/fX6NHj3Zt/vLycr3zzjsaM2aMqqur9ec//1lvv/22Dhw4oK5du+rKK690\ndTuqd955RxdddJH/61deeUWvvPKK9u3bp27duikrK8u1rT1qubWfXLBMzm9ydqnhPqL9+vXT8OHD\nXd9H1PT8p5xyig4ePOjP6fV6XT2qWZfJbZ0k9+aP+BHOxYsX69lnn9XZZ5+tPXv26LvvvtPixYvV\nr18//zF9+vTRhg0bHEzZsH/961+aOXOmhg0bpsTERH3wwQcaN26cSkpK9K9//UulpaV6+umn1aNH\nD6ej1svk/PPmzdOuXbv0zDPPaOHChXrppZd01VVXKSUlRbt27dJLL72kKVOm6IYbbnA6ar3q9ghd\ntmyZFi1apPHjxyslJUXbtm3TK6+8ol/96le64oorHE5aP1f3kwuCyflNzi6Z30fU5Pym9xB97LHH\n9O6772rSpEnq3bu3kpKSJNX8XBs2bNCyZcs0btw43XLLLQ4nrZ+r8zuwMr5FnX/++db69ev9X+fm\n5lqDBg2yNm/e7N/m5vYel156qfX+++/7v/7ss8+s2267zf/1k08+6ep+eCbnHzx4sL9t1rnnnhvw\nPrIsy8rLy3N1e4+6rS/OPfdc65///GfA/n/+85/W+eef39KxgubmfnLBMDm/ydkty/w+oibnN7mH\nqGWZ39bJzfkjvuDMzMw8rpfic889Z51zzjnW7t27Lctyd8HZr18/q6Kiwv91eXm5NXDgQP/XlZWV\nVr9+/ZyIFhST82dmZvp74Q0bNswqKSkJ2H/48GHXZreswPf1WWedFfD/wbIsq6Kiwurbt29Lxwqa\nm/vJBcPk/CZntyzz+4ianN/kHqKWVTPQcPTo0Qb3HzlyxNWfm27O7/4rj8N0+umn6+WXXw7Y9stf\n/lLjxo3Ttddeq6+//tqhZMHp1q2bPvzwQ//Xa9asCVhhtmbNGnXs2NGJaEExOf/Pf/5zzZs3T4WF\nhZo0aZJ+97vfqbKyUlLNPdbnzJnj6vYedQ0cOFBffPFFwLbPPvtMp5xyikOJmubmfnLBMDm/ydkl\n8/uImpzf5B6i0vdtnerrFerz+fTII4+4+nPfzfkjftHQHXfcoWnTpmnbtm265557/Ntvv/12JSUl\n6eqrr1ZFRYWDCRt34403aubMmRo8eLA8Ho8+/fRTzZs3T5L05ptvas6cOXrooYccTtkwk/PPnTtX\n9957r4YPH66uXbtqz549+stf/qLY2FgVFxfrpz/9qZ544gmnYzaorKxM559/viTp6NGjOnz4sHJz\ncyVJL7zwgh599FHde++9TkZslJv7yQXD5PwmZ5fM7yNqcn6Te4hK0n333afs7GwNGTKk0bZObuXm\n/BG/aEiSdu/erQMHDigjI+O4fd99951Wrlypm2++2YFkwfn888/1wQcfSJLOO+88DRo0SJK0d+9e\nlZWVqXv37k7Ga5Lp+QsKCvTvf/9be/bskWVZ6ty5s3r06KE+ffo4Ha1Rn332WcDXCQkJ6t27tyTp\n//2//6e2bdv6C1K3cms/uWCZnN/k7JLZfUQlc/Ob3EO0LtPbOrkxf6soOGu5rSdVqEzPX1dRUZHa\ntm3r2pWKDamoqFBhYaG6dOkSEf1bd+/erVNPPdXpGE0y/b1vcn6Ts8M5JvcQlaT9+/dr06ZNAe/9\njIwM1/+iVcuN+VtFwenWnlTBMjn/gQMHNH/+fG3dulWXXHKJZsyYoVmzZunNN9+Ux+PRwIEDtXDh\nQnXp0sXpqMd58MEH9atf/UqSdOzYMc2fP19vvPGGqqqqFBMTo1/84heaNWuWa/vhHT16VI888oi/\nB+306dM1ZMiQgGPqtk5yI5Pf+5LZ+U3OLpnfR9Tk/Cb3EDW9rZOb80d8wenqnlRBMD3/7bffrgMH\nDujCCy/Uq6++qj59+mj79u26/fbb5fF4tGjRIiUmJmrhwoVORz1O3WJs3rx5+uKLLzRr1ix/H8vf\n//73Ovfcc3XXXXc5nLR+99xzj/773/9q3LhxKigo0PPPP6/Zs2frmmuu8R/j5h60pr/3Tc5vcnbJ\n/D6iJuc3uYeoJM2cOVOWZem22247bmHc1q1b9dvf/lbt27fXggULHErYOFfnb+ll8S3NzT2pgmF6\n/qFDh1qFhYWWZVnWtm3brLS0tICf5+DBg9bPfvYzp+I1qm7bl0GDBh3XV+6bb76xhgwZ0tKxgjZ0\n6FB/H1HLsqwNGzZYgwcPtl577TX/Nre2VrEs89/7Juc3Obtlmd9H1OT8JvcQtSzz2zq5Ob8ZF1OE\nobi4WCeffHKD+5OTk+ttH+AWpucvLS31D93/5Cc/UVRUVMAiobi4OJWUlDgVr1F1r9GMj49Xt27d\nAvanpKSorKyspWMFraKiwj+6IEkZGRl68skndf/99+vjjz+WVHMhv1uZ/t43Ob/J2aWahX4DBgxo\ncP/ZZ5+tXbt2tWCi0Jicf8uWLbr++uvrvcY9KipKU6ZM0caNGx1IFhzT2zq5OX/EF5xu7kkVDNPz\np6en65lnnlF1dbUk6e9//3vA/scff1zp6elORGuSZVnavXu3CgoK1L9/f73++usB+//0pz/pjDPO\ncChd0wYNGqQHHnhAhYWF/m0DBgzQo48+qttuu03Lly939cIn09/7Juc3Obtkfh9Rk/Ob3ENU+r6t\n0+rVq7V3716Vlpbq2LFj2r17t9577z3dcsstrm7r5Ob8EX8NZ0FBgbKzs7V169ZGe1IlJyc7HbVe\npuf/6quvNHnyZN1+++36v//7v4B9o0aN0tGjR/XHP/7RlRfA9+rVSx6Pxz8K2K9fP/31r3+VJD3y\nyCP629/+piVLlmjgwIFOxmxQQUGBbrrpJmVkZBzX63TdunWaO3euvvnmG23evNmhhI0z/b1vcn6T\ns0vSxx9/rJtvvlmnnXZao31E3fp31+T8ubm5euKJJ5rsITp+/HiHk9bP9LZObs4f8QVnLTf2pAqF\nyfnLy8tVWlrq/+Cp9cknnyg9Pd21q/0as3nzZnm9Xtf+g1vXkSNH1L59++O2V1VV6T//+Y8r/9Gq\ny0yFwS4AABT1SURBVOT3vmR2fpOzm95H1OT8pvYQrcv0tk5uzN9qCk439qQKBfndae3ata4u2Kqq\nqvzX65SVlenf//639u/fr5SUFGVmZhrz4SlJlZWVWrt2rfbt26fu3burX79+TkcKisnvfZOz1zK9\nj6jp+U1kclsnyb35I77gdHNPqmCQ393c3Mfyo48+0uOPP64XXnhBeXl5uummm1RYWKikpCT5fD6l\npqZq6dKlxy2GcouxY8dqxYoVkmruCDZlyhTt2rVLHTp0UGFhodLS0vTUU0+5soerZPZ73+TstUzv\nI2pyfpN7iJre1snN+SO+4HR1T6ogkN/d3NzH8vLLL9f111+vK664QuPHj1daWppmz56tuLg4FRcX\n63e/+522bNmi5557zumo9ar72k6aNEler1f333+/4uPjVVhYqPnz56u6ulqPP/64w0nrZ/J73+Ts\nkvl9RE3Ob3IPUUm65pprNGLECE2ZMuW4RZXV1dV68skn9cknn+jPf/6zQwkb5+r8LdR+yTFu7kkV\nDPI7Z+jQoU3+6dWrl9MxG9SnTx+rrKzMsizLGjBggHX06NGA/ceOHXN1H866fVD79+9vFRUVBez3\n+XxW//79WzpW0Ex+75uc3bLM7yNqcn6Te4haVs1nZe3nZn3c/rnp5vzRLV/itqzanlQ/XLBSy5Se\nWuRveV26dFG3bt00YsSIevdblqV58+a1bKgQpKSk6PPPP9fQoUPVu3dv7dy5M2Cxx9q1a119LV7d\n385PPfXUeq83dfO1VCa/903OLpnfR9Tk/Cb3EJW+b+uUkZFR7363t3Vyc/42v/71r3/tyDO3kO3b\ntys3N1ddunRRu3btFB0drYqKCh04cECffvqp5s+fr3PPPVfDhw93Omq9yO+cIUOG6Mknn9RNN92k\nn/3sZ0pLSzvuz1NPPaXp06c7HbVep5xyiu666y7t27dPPXv21G9/+1sdPnxYeXl5+utf/6qcnBzN\nnDmzwQ8mpz3xxBPq2rWrvvrqK+3Zs0fffvuthg4dKqlmMcuvf/1rpaSk6OKLL3Y4af1Mfu+bnF2q\n+WVq/fr1GjRo0HG/lPh8Pi1YsEBJSUkaM2aMQwkbZ3L+9957T7GxsQ12Mnj11Vf13XffubYtUnV1\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_performance(kgcv)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "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.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }