{ "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/tum-camp/survival-support-vector-machine.\n", "\n", "The main class of interest is ``survival.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 ``survival.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.grid_search.GridSearchCV.html#sklearn.grid_search.GridSearchCV) 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/ssvm/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.cross_validation import ShuffleSplit\n", "from sklearn.grid_search import GridSearchCV\n", "\n", "from survival.column import categorical_to_numeric, standardize\n", "from survival.io import loadarff\n", "from survival.metrics import concordance_index_censored\n", "from survival.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 = loadarff(\"../data/veteran.arff\")\n", "data_x = data.drop([\"Status\", \"Survival_in_days\"], axis=1)\n", "x = categorical_to_numeric(standardize(data_x))\n", "y = np.empty(dtype=[(\"event\", bool), (\"time\", float)], shape=data.shape[0])\n", "y[\"event\"] = (data[\"Status\"] == \"'dead'\").values\n", "y[\"time\"] = data[\"Survival_in_days\"].values" ] }, { "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[\"event\"].sum()\n", "print(\"%.1f%% of records are censored\" % (n_censored / y.shape[0] * 100))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/sebp/miniconda3/envs/ssvm/lib/python3.5/site-packages/ipykernel/__main__.py:2: DeprecationWarning: numpy boolean negative, the `-` operator, is deprecated, use the `~` operator or the logical_not function instead.\n", " from ipykernel import kernelapp as app\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqYAAAHcCAYAAAAEKmilAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XtcVAX+//H3MCwX0UkwEW9YmoqhEhqaWrYJWq2a1y5b\nWZZFF832q+ZdIzXNS6RFlK5KaWqWfsu02267ZmW6mrfNX5IKaZhKqCiKyGXm/P7gyyRpxeUgx5nX\n8/HgkXPOmc98ho9T7845c47NMAxDAAAAQDXzqe4GAAAAAIlgCgAAAIsgmAIAAMASCKYAAACwBIIp\nAAAALIFgCgAAAEsgmAIAAMASCKYAAACwBIIpAAAALKHCwTQ+Pl7jxo1zP542bZoiIiJK/SxbtsyU\nJgEAAOD5fCvypA8//FBffPGF+vXr516Wnp6ukSNHqn///u5lQUFBle8QAAAAXqHce0xPnjypWbNm\nqU2bNqWWp6WlKTIyUnXq1HH/BAQEmNYoAAAAPFu595jOnDlTffv21c8//+xedubMGWVmZqpJkyam\nNgcAAADvUa49pps2bdL27dv15JNPyjAM9/K0tDTZbDa9/vrruvnmm9WnTx+9//77pjcLAAAAz1Xm\nPab5+flKSEjQ5MmT5e/vL5vN5l6Xnp4uHx8fNWvWTIMGDdKWLVs0adIk1axZU3FxcVXSOAAAADxL\nmYNpUlKSWrdurS5dukiSDMNwh9N+/fopNjZWDodDktSiRQsdOHBAK1asKHMwLamXk5OjHo/doVrX\n1inve3Gz7c/XP95cV+HnAwAA4NIrczD96KOPdOzYMUVHR0uSCgsLJUmffvqptm/f7g6lJa6++mpt\n3ry5zI0Uh9I8ZWfnqlb92gpuEVrm5/5awfGTys7OrfDzUbXsdh85HIHKycmT0+mq7nZQxZi3d2He\n3oV5e5eSeVelMgfTpUuXyul0SireuzlnzhxJ0jPPPKN58+Zp586dSklJcW+fmpqqpk2blqsZp9Nl\nzl9sw1BRER8Qq3M6XczJizBv78K8vQvzhlnKHEwbNGhQ6nGNGjVks9nUuHFjdevWTX//+9+1ePFi\nxcXF6auvvtKaNWu0dOlS0xsGAACAZ6rwnZ/O//JTmzZtNG/ePK1Zs0a9e/fWsmXLlJiYqKioKFOa\nBAAAgOer0J2fJGnGjBmlHsfGxio2NrbSDQEAAMA7VXiPKQAAAGAmgikAAAAsgWAKAAAAS6jwOaZV\npaCgQD9uPqgTaTkVruE8dc7EjgAAAHApWC6Y+vn5qX6DHqrVpHOFaxhHvzSxIwAAAFwKHMoHAACA\nJRBMAQAAYAmWO5QPAAB+kZubq717Uy/Z67VoEaGgoKBL9nrA+QimAABY2N69qRqd+L+qVSe8yl/r\n9PEfNWtEf0VHty/T9lOmPKuPP173m+vHj39W06c/p3ffXauwsDCz2qyQr77aoBdfnKnTp3M0Y8Yc\nxcTcUGr9TTfFuP9ss9lUo0YNtWoVqcceG6qIiGtN6aGwsFAff7xOd9zRT5I0bFi82rW7Xg8/HG9K\nfU9AMAUAwOJq1QlX7bDm1d3GBUaOfEYTJ47TyZNn9emnn2jFiqVatGipe33NmrV0ww2ddcUVtaux\ny2ILF87XDTd01uDBj6h27eCLbvP887PVpk1bOZ0uZWcf1zvvrNBTTz2u+fNT1LRps0r38Nlnn2rp\n0hR3MLXZbKVu8Q6CKQAAqKCgoJoKDg6Sj0+AgoKCZLfbFRwcUmqbXz+uLrm5uWrTJkr16v32nluH\nw+Hu98orr9SECQk6cuSw5s9P0syZL1W6B8MwKl3D0/HlJwAAUCWOHDmsm26K0dGjRyUVHy5fv/4z\n3XffQMXF3aiEhAk6fPgnDR/+uOLibtTQoY/q2LEs9/M3bFiv+++/U3FxN+rRRx/Uzp3bf/O18vPz\nlZz8svr376nu3W/S2LEj9PPPmZKkgQN76+jRw5oxY4ruvLNPud5D7959tWXLZhUUFEiSMjOPasyY\n/1Fc3I268847lJLyd7lcLvf2a9e+r3vvHaBbbumkXr3ilJg4Uy6XS9u3f6MZM6bo6NEj6tq1g44e\nPSJJ+vnnnzVy5HB169ZF9947QN98s6Vc/XkagikAALhkFi1aoIkTn9OsWXO1YcO/9cQTQ9S//516\n7bXFOn78mJYtWyJJ2rdvr6ZPT9DgwY/ozTff1q233q5Ro4brp58OXbTunDkz9OWXn2vSpCl6/fUU\nFRUVaezYkTIMQwsXLlXduqF6+umRWrjwzXL126TJ1SoqKtKhQz/KMAxNmDBaISFXKiVlucaPf1b/\n/OcnWrJksSRpx45tmjdvjh5//CmtWPGeRo0ap3XrPtCXX25Q27bXafjwkapbN1Rr1nyi0NB6MgxD\nn376oeLieuitt95RRMS1mjp1cuV+wZc5gikAALhk7r77XrVqFal27a5X8+Yt1aHDDfrzn2PVvHkL\n3XxzNx08eECS9PbbS9W7dz/Fxd2qhg0baeDAe9SxYye9996qC2rm5OToH//4WCNGjFF0dHs1a3aN\nJk+epoyMg/rmm/+odu3astvtCgqqWe7zXWvWrClJOnv2rLZt26rMzKMaPXq8GjcOV3R0ez355NN6\n990VkqQaNYI0btxkde36Z4WFhenPf45VixYtdeBAunx9fUud7uDjUxzB/vznWN1+ey81aNBQ9977\ngE6cOK7s7OxK/IYvb5xjCgAALpkGDRq6/+zv76+wsPrux35+fioqKpQkHThwQOvX/0tr1vyve31R\nUaE6dux0Qc2MjB/lcrkUGdnavczhcKhx4yY6cODABd/AL4/c3FxJxaHz++/3KCfnlHr0uNm93jBc\nKigoUE5Ojlq2jJCfn58WLZqvH35IV3r6fh06lHHRnqXiLz81bNjI/bjkMl0FBfkV7vdyRzAFAACX\njN1uL/W4ZM/hr7lcTt1334O67baepZb7+/tfsK2fn99v1HDJ5XJWsNNiaWn79Kc//UmNG4frm2/+\no/DwJnrhhcQLtgsKCtJ//rNJ48eP0u2391KnTl308MOP6sUXZ/5u/Yu9f2/+jhSH8gEAgOWEhzfR\n4cM/qWHDRu6fNWtWa/PmjRds27BhI9ntdu3e/a172alTJ3Xo0I8KD29SqT4++mitunTp+n/htIky\nMzNVu3Ztd0+HDx/SokXzZbPZtHbte+rVq49GjRqnnj3vUHj4VTp0KMP9bXwuDfXH2GMKAIDFnT7+\n4yV8nesvyWtJxZdP+vUllEoe33XXfRo69BG1anWtOnW6URs3fqGVK5fr5ZfnX1CnRo0a6t27nxIT\nZ2nMmAmqVcuh1157RfXqhZXrMP6pU6d0/PgxGYah48ePa8WKpdq373stXFh8bdaOHTspLCxMU6ZM\n0mOPDdXp06c1a9Z0xcR0lI+Pj664ora+/XaX0tP3S7Lprbfe0IkTx93f6A8ICNDp0zk6dChDYWH1\nL/r+vR3BFAAAC2vRIkKzRvS/RK92vVq0iKjQM4v3Bl64R/D39hL++gLz5z+OjGytSZOmaPHiBUpO\nflkNGzbSc89NV1TUdRetNWzY00pKmqeJE0ersLBIMTEdNHdusnx9yx51Jk4cLan48HpwcIjatr1O\nr722WI0bh7uXv/BCoubOna34+MEKDKyhbt3iNHTo3yRJDz8cr+eff06PPfaQgoJqqlOnG9W370Dt\n27dXktS+fQc1bNhYDz54j159deFFL7Dv7XtVbYaFonp2dq6ys0/q4dEvq1aTzhWuYxz9UilznzWx\nM5jJ19dHwcFBys7OVVGR64+fgMsa8/YuzNu7MG/vUjLvqsQ5pgAAALAEgikAAAAsgWAKAAAASyCY\nAgAAwBIIpgAAALAEgikAAAAsgWAKAAAASyCYAgAAwBK48xMAABaWm5urvXtTL9nrtWgRoaCgsl1E\nfcqUZ/Xxx+t+c/348c9q+vTn9O67axUWFmZWixXy1Vcb9OKLM3X6dI5mzJhz0VuVZmYe1RtvLNR/\n/rNJp0/nqHHjcN1993269da/VEPHv++jj9YqJeXvevfdD6q7FVMRTAEAsLC9e1M18b3n5GgcUuWv\nlZNxQtP6Pavo6PZl2n7kyGc0ceI4nTx5Vp9++olWrFiqRYuWutfXrFlLN9zQWVdcUbuqWi6zhQvn\n64YbOmvw4EdUu3bwBeszMn7Uk08+oqio6zR16kwFBwfrm2+2aPbs6crOPqF77rm/Grr+bbGxPdSl\ny03V3YbpCKYAAFico3GIQpqFVncbFwgKqqng4CD5+AQoKChIdrtdwcGlA/SvH1eX3NxctWkTpXr1\nLr7n9sUXX1Dz5i01bdos97I77uinwsICvf76q+rdu6+Cgmpeqnb/kL+/v/z9/au7DdNxjikAAKgS\nR44c1k03xejo0aOSpJtuitH69Z/pvvsGKi7uRiUkTNDhwz9p+PDHFRd3o4YOfVTHjmW5n79hw3rd\nf/+diou7UY8++qB27tz+m6+Vn5+v5OSX1b9/T3XvfpPGjh2hn3/OlCQNHNhbR48e1owZU3TnnX0u\neO7PP2dq+/ZvdM89912wrlevPkpMfEUBAYGSig/3jxnzP4qLu1F33nmHUlL+LpfLJan48PqwYfFa\ntGi+evWK02233aJXXnnJXevo0aP6n/8Zqu7du6p37x6aO3e2ioqKJEmGYWj58iW6664+io3touHD\nH1d6+n73c2+6KcZdd+zYEfroo7W68847JEnbt3+jgQN76/33V6lv39vVvftNmjp1sgoLC93P/8c/\nPtZdd/VRXNyNeu65iXr22fFavHjBH0zw0iOYAgCAS2bRogWaOPE5zZo1Vxs2/FtPPDFE/fvfqdde\nW6zjx49p2bIlkqR9+/Zq+vQEDR78iN58823deuvtGjVquH766dBF686ZM0Nffvm5Jk2aotdfT1FR\nUZHGjh0pwzC0cOFS1a0bqqefHqmFC9+84LlpaftkGIYiIq69YJ2/f4DatImS3W6XYRiaMGG0QkKu\nVErKco0f/6z++c9PtGTJYvf2/+//fauMjB/12muLNWLEaK1a9ba++WaLJGnu3FkKCgrSG28s14wZ\nc7R+/b+0bt37kqTFixfo7beX6emnRyklZZnCwupr5Mjhys8/5669ceOXeu21xXr88acu6PP48WP6\n/PN/KzExSc8/P1sbNvxbn3zyoSRp166deuGFqbr//sFavHiZAgICtX79Z7LZbGUd2yVDMAUAAJfM\n3Xffq1atItWu3fVq3rylOnS4QX/+c6yaN2+hm2/upoMHD0iS3n57qXr37qe4uFvVsGEjDRx4jzp2\n7KT33lt1Qc2cnBz94x8fa8SIMYqObq9mza7R5MnTlJFxUN988x/Vrl1bdrtdQUE1L3q+6+nTZyRJ\nNWv+/qH6bdu2KjPzqEaPHq/GjcMVHd1eTz75tN59d4V7G5fLpdGjJ6hx43D16HG7mjVrrj17vpNU\nvMe0Ro0g1asXptat22rOnHm64YYbZRiGVq9+R48++oS6dLlJ4eFXafToCfLx8dGnn37srt2nT381\nbhyuq666+oLeioqK9Le/PaOmTZupQ4cb1LFjJ6WmFr/ue++9q9jYHrrjjn4KD2+iUaPGqm5d650a\nInGOKQAAuIQaNGjo/rO/v7/Cwuq7H/v5+amoqPjw84EDB7R+/b+0Zs3/utcXFRWqY8dOF9TMyPhR\nLpdLkZGt3cscDocaN26iAwcOXPQb+Oe74oorJEmnT+f87he1Dh78QTk5p9Sjx83uZYbhUkFBgXJy\nTkkqPqe2Ro0a7vVBQUFyOosP19977wOaMeM5ffHF57rhhs6Kje2u5s1b6sSJ4zp9OkfXXvtL/76+\nvoqIaKWDB39wL6tfv8Hvvo9GjRq7/1yjRpD7NIH09P3q02eAe53dbldERKvfrVVdKhxM4+PjVadO\nHc2YMUOSlJGRoUmTJmnXrl1q0KCBxo8fry5dupjWKAAAuPzZ7fZSj318Ln7w1uVy6r77HtRtt/Us\ntfxiX/jx8/P7jRouuVzOP+ypRYsI2Ww2pabuuSD45uXlady4kRo27H/kdDoVHt5EL7yQeEGNki9G\n/elPf7pgnWEYkqQePW7T9dfH6IsvPtfXX3+liRPH6P77B+veewddtC+n0ymn0/WH77OEr2/pWFfy\nusW/c6PUOper9GOrqNCh/A8//FBffPGF+7FhGBo6dKhCQ0O1evVq9enTR8OGDdORI0dMaxQAAHiP\n8PAmOnz4JzVs2Mj9s2bNam3evPGCbRs2bCS73a7du791Lzt16qQOHfpR4eFN/vC1goODFRNzg1au\nXH7Bug8/XKNvv92lsLD6aty4iTIzM1W7dm13T4cPH9KiRfPLdL7m/Pmv6sSJE+rbd4BmzXpJjz76\nhDZs+LeCgmoqJCREu3f/171tUVGRvv8+tUz9X8z5/Vx9dTOlpu5xP3Y6ndq/f2+F6la1cu8xPXny\npGbNmqU2bdq4l23evFkZGRl65513FBAQoPj4eG3atEmrV6/WsGHDTG0YAABvk5Nx4tK9zvWX5KUk\nFe/YKtmrd/4ySbrrrvs0dOgjatXqWnXqdKM2bvxCK1cu18svz7+gTo0aNdS7dz8lJs7SmDETVKuW\nQ6+99orq1Qv7w8P4JZ566n/0xBNDNHHiGN133wMKCqqpjRu/1MKFr+nxx59SzZo11bFjJ4WFhWnK\nlEl67LGhOn36tGbNmq6YmI6/uef3/PeXkXFQL700SyNGjJHNZtOmTRvVokWEJOnuu+/TokXzdeWV\nddWwYSMtW/amCgsLFRvbvUz9X+x1S8Jp//53afjwxxQVFa22baO0evU7Onr0iCW//FTuYDpz5kz1\n7dtXP//8s3vZrl271Lp1awUEBLiXtW/fXjt27DCnSwAAvFSLFhGa1u/ZS/Ni18sdlMqrOORcGHR+\nL/zYbLZS689/HBnZWpMmTdHixQuUnPyyGjZspOeem66oqOsuWmvYsKeVlDRPEyeOVmFhkWJiOmju\n3OQLDm//lquuulrJyQu1ePECjR07QmfPnlWTJldr3LjJiou7VVLxaQcvvJCouXNnKz5+sAIDa6hb\ntzgNHfq33/wdnP/+Ro4cpxdffEHDhsXL6XSqc+cb9be/jZIk3XPP/crNzdWsWdPc11x95ZX5v3nO\n669f69e/5/Mft27dRiNGjFZKyt916tRJdevWXa1btynz7+ZSshm//l+V37Fp0yYlJCTogw8+0LPP\nPiubzaYZM2Zo6tSpys7OVmLiL+dcLF++XMuXL9e6db99q7Jfy87OVXb2ST08+mXVatK5fO/kPMbR\nL5Uy9xJ9iFFuvr4+Cg4OUnZ2roqKXH/8BFzWmLd3Yd7ehXlfHvbs+X8KCqpZ6rSA+++/S/fd94Bu\nv71XmeuUzLsqlTkq5+fnKyEhQZMnT5a/v3+pJJ6Xl3fBCbl+fn4qKCgoVzN2u4/sdh9Vds+yTcW/\nPFiT3e5T6p/wbMzbuzBv78K8Lw/ffbdb7777tp59dorq1LlS//jHJzp27Gd16XJjufLSpZhzmYNp\nUlKSWrdu7f6m/fnnLvj7++vUqVOlti8oKCh1aL8sHI5ASYWVPufBfgkSPSqveN7wFszbuzBv78K8\nre3RRx/SiRM/a/z40Tp9+rRatWqlhQsXqlmzxn/85EuszMH0o48+0rFjxxQdHS1J7ttcffLJJ3r8\n8ce1f//+UtsfO3ZMoaHlu3hrTk6esrNzLzgRurycRS5lZ+dWqgaqjt3uI4cjUDk5eaUugwHPxLy9\nC/P2Lsz78vHEE0/riSeeLrWsvFmpZN5VqczBdOnSpXI6i68FZhiG5syZI0l65pln9NNPP2nBggXK\nz893X19s27ZtiomJKVczTqdLTqdLlcylMiTOdbkMOJ0u5uRFmLd3Yd7ehXnDLGUOpg0alL7bQI0a\nNWSz2dS4cWM1bNhQ9evX17hx4/TEE09o/fr12r17t2bOnGl6wwAAAPBMFT6L9fzzQH18fJScnKys\nrCwNGDBAa9euVVJSksLCwkxpEgAAAJ6vwhewKrkVaYnw8HAtXbq00g0BAADAO3F9BwAAAFgCwRQA\nAACWQDAFAACAJRBMAQAAYAkEUwAAAFgCwRQAAACWQDAFAACAJRBMAQAAYAkEUwAAAFgCwRQAAACW\nQDAFAACAJRBMAQAAYAkEUwAAAFgCwRQAAACWQDAFAACAJRBMAQAAYAkEUwAAAFgCwRQAAACWQDAF\nAACAJRBMAQAAYAkEUwAAAFgCwRQAAACWQDAFAACAJRBMAQAAYAkEUwAAAFgCwRQAAACWQDAFAACA\nJRBMAQAAYAkEUwAAAFgCwRQAAACWQDAFAACAJRBMAQAAYAkEUwAAAFgCwRQAAACWQDAFAACAJRBM\nAQAAYAnlCqYHDx7UkCFDFB0drVtuuUWLFi1yr5s2bZoiIiJK/Sxbtsz0hgEAAOCZfMu6ocvlUnx8\nvKKiorRmzRr98MMPGjlypOrVq6devXopPT1dI0eOVP/+/d3PCQoKqpKmAQAA4HnKvMf02LFjioyM\nVEJCgsLDw3XzzTerU6dO2r59uyQpLS1NkZGRqlOnjvsnICCgyhoHAACAZylzMA0NDVViYqJq1Kgh\nwzC0bds2bd26VR06dNCZM2eUmZmpJk2aVGWvAAAA8GBlPpR/vm7duunIkSO65ZZb1KNHD3377bey\n2Wx6/fXX9cUXX6h27dp66KGH1LdvX7P7BQAAgIeqUDBNSkpSVlaWEhISNH36dLVu3Vo2m03NmjXT\noEGDtGXLFk2aNEk1a9ZUXFxcmeva7T6y231ks1Wkq1/YJPn6csEBq7LbfUr9E56NeXsX5u1dmLd3\nuRRzrlAwjYyMlCSNGzdOo0aN0pgxY9StWzc5HA5JUosWLXTgwAGtWLGiXMHU4QiUVChbJZOp3ddH\nwcF88crqiucNb8G8vQvz9i7MG2YpczA9fvy4duzYUSpoNmvWTIWFhTpz5oyCg4NLbX/11Vdr8+bN\n5WomJydP2dm5MgyjXM/7NWeRS9nZuZWqgapjt/vI4QhUTk6enE5XdbeDKsa8vQvz9i7M27uUzLsq\nlTmYZmRk6KmnntLnn3+uevXqSZJ2796tkJAQLV26VDt27FBKSop7+9TUVDVt2rRczTidLjmdLlUy\nl8qQVFTEB8TqnE4Xc/IizNu7MG/vwrxhljKfLNC2bVtFRkZq/PjxSktL04YNGzRnzhw98cQTuuWW\nW7R161YtXrxYP/74o5YvX641a9ZoyJAhVdk7AAAAPEiZ95j6+PgoOTlZU6dO1d13363AwEA98MAD\nGjRokCRp3rx5evnllzVv3jw1atRIiYmJioqKqrLGAQAA4FnK9eWn0NBQvfLKKxddFxsbq9jYWFOa\nAgAAgPfh+g4AAACwBIIpAAAALIFgCgAAAEsgmAIAAMASCKYAAACwBIIpAAAALIFgCgAAAEsgmAIA\nAMASCKYAAACwBIIpAAAALIFgCgAAAEsgmAIAAMASCKYAAACwBIIpAAAALIFgCgAAAEsgmAIAAMAS\nCKYAAACwBIIpAAAALIFgCgAAAEsgmAIAAMASCKYAAACwBIIpAAAALIFgCgAAAEsgmAIAAMASCKYA\nAACwBIIpAAAALIFgCgAAAEsgmAIAAMASCKYAAACwBIIpAAAALIFgCgAAAEsgmAIAAMASCKYAAACw\nBIIpAAAALIFgCgAAAEsoVzA9ePCghgwZoujoaN1yyy1atGiRe11GRoYGDx6s6Oho9ezZUxs3bjS9\nWQAAAHiuMgdTl8ul+Ph41alTR2vWrFFCQoJee+01rVu3ToZhaOjQoQoNDdXq1avVp08fDRs2TEeO\nHKnK3gEAAOBBfMu64bFjxxQZGamEhATVqFFD4eHh6tSpk7Zt26Y6deooIyND77zzjgICAhQfH69N\nmzZp9erVGjZsWFX2DwAAAA9R5j2moaGhSkxMVI0aNWQYhrZt26atW7eqY8eO2rVrl1q3bq2AgAD3\n9u3bt9eOHTuqpGkAAAB4ngp9+albt2667777FB0drR49eigrK0t169YttU1ISIgyMzNNaRIAAACe\nr8yH8s+XlJSkrKwsJSQkaPr06Tp37pz8/PxKbePn56eCgoJy1bXbfWS3+8hmq0hXv7BJ8vXlggNW\nZbf7lPonPBvz9i7M27swb+9yKeZcoWAaGRkpSRo3bpxGjRqlAQMGKC8vr9Q2BQUFpQ7tl4XDESip\nULZKJlO7r4+Cg4MqVQNVr3je8BbM27swb+/CvGGWMgfT48ePa8eOHYqLi3Mva9asmQoLC1W3bl2l\npaWV2v7YsWMKDQ0tVzM5OXnKzs6VYRjlet6vOYtcys7OrVQNVB273UcOR6BycvLkdLqqux1UMebt\nXZi3d2He3qVk3lWpzME0IyNDTz31lD7//HPVq1dPkrR7927VqVNH7du31+LFi5Wfny9/f39J0rZt\n2xQTE1OuZpxOl5xOlyqZS2VIKiriA2J1TqeLOXkR5u1dmLd3Yd4wS5lPFmjbtq0iIyM1fvx4paWl\nacOGDZozZ44ef/xxdejQQfXr19e4ceO0b98+LViwQLt379bAgQOrsncAAAB4kDIHUx8fHyUnJ6tG\njRq6++67NXHiRD3wwAMaNGiQe11WVpYGDBigtWvXKikpSWFhYVXZOwAAADxIub78FBoaqldeeeWi\n68LDw7V06VJTmgIAAID34foOAAAAsASCKQAAACyBYAoAAABLIJgCAADAEgimAAAAsASCKQAAACyB\nYAoAAABLIJgCAADAEgimAAAAsASCKQAAACyBYAoAAABLIJgCAADAEgimAAAAsASCKQAAACyBYAoA\nAABLIJgCAADAEgimAAAAsASCKQAAACyBYAoAAABLIJgCAADAEgimAAAAsASCKQAAACyBYAoAAABL\nIJgCAADAEgimAAAAsASCKQAAACyBYAoAAABLIJgCAADAEgimAAAAsASCKQAAACyBYAoAAABLIJgC\nAADAEgimAAAAsASCKQAAACyBYAoAAABLKFcwzczM1PDhw9WxY0d17dpVL7zwggoKCiRJ06ZNU0RE\n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\nSzExMe51AQEBuvbaa7Vz585L9wZQITNnzlTfvn11zTXXuJft2rVLrVu3Zt4eZNu2bapZs6auv/56\n97L4+Hg9//zzzNsDBQQEKDAwUKtXr1ZRUZHS09O1fft2XXvttczbQ2zdulWdOnVyH/UoUdH57tix\nQ06nU7t37y61PioqSoWFhUpNTS1TX9UaTLOyshQcHCxfX1/3siuvvFL5+fnKzs6uxs5QEbVq1VKX\nLl3cj10ul9566y117txZWVlZCg0NLbV9SEiIMjMzJemi66+88kodPXq06htHhW3atEnbt2/Xk08+\nKeO8m8hlZWWpbt26pbZl3pe3jIwMNWzYUO+//75uu+02xcXFKTk5WYZhMG8P5O/vr8mTJ+vtt99W\nVFSU/vKXv6hr164aMGAA8/YQf/3rXzV27NhSAVSq+L+/MzMzdfr0aeXn55da7+vrq9q1a5d5/r5/\nvEnVycvLk5+fX6llJY9LvjCDy9fs2bOVmpqqVatWKSUl5aKzLpnzuXPnfnc9rCc/P18JCQmaPHmy\n/P393ecnSb/92Wbel6+zZ8/q4MGDeueddzRz5kz9/PPPmjx5sgIDA/9wnsz78rR//35169ZNDz/8\nsPbu3aupU6eqU6dOzNvDVebf3yVfcqrM/Ks1mPr7+1/QaMnjwMDA6mgJJpk9e7aWLFmiuXPn6ppr\nrpG/v79OnjxZapuCggL3nH/r74LD4bhkPaN8kpKS1Lp1a/decsMw3OHU399fp06dKrU98768+fr6\n6syZM3rxxRdVv359ScVfgli+fLm6dOnC59vDbNq0SatWrdKXX34pPz8/RUZGKjMzU6+99ppuuOEG\n5u3BAgICyj3f/Px8ORyO39y5eP7z/0i1HsqvV6+esrOz5XK53MuysrIUEBDAX+DL2NSpU/XGG29o\n9uzZ6t69u6TiWWdlZZXa7tixY+7DBRdbf7HDCbCOjz76SJ999pmio6MVHR2tdevWae3atYqOjlZY\nWBjz9jB169aVv7+/O5RK0lVXXaWjR4/y+fZAu3fv1lVXXVVqz1erVq10+PBh5u3hKjLfkvXBwcHy\n9/fXsWPH3OuKiop08uTJMs+/WoNpq1at5Ovr6z6hVio+wb5NmzbV2BUqIykpSStXrtRLL72kv/zl\nL+7lUVFR+u6775Sfn+9etm3bNl133XXu9du2bXOvy8vL0549e9zrYT1Lly7VunXr9MEHH2jNmjXq\n1q2bunXrpg8++IB5e6CoqCjl5+frwIED7mXp6elq1KgR8/ZA9erV08GDB1VYWOhelp6ersaNGzNv\nD9e2bdsKz9dms6lNmzb65ptv3Ot37twpX19fRURElOn17QkJCQnmvJXy+9Of/qSjR49qxYoVatOm\njb799lvNmTNHo0aNUtOmTaurLVRQWlqaRowYoccee0w9evRQbm6uzp49q7Nnz6p58+Zat26ddu7c\nqaZNm2r16tX6+OOP9fzzz6tmzZpq1KiR5syZI7vdLofDoRkzZsgwDI0cObK63xZ+Q61atXTFFVe4\nfzZs2CA/Pz/1799fDRo0YN4eJjg4WLt379a6devUunVr7dmzRzNnztTDDz+s2267jXl7mIYNG2r5\n8uXav3+/mjdvru3bt2vWrFl6/PHH1b17d+btYZKSktS/f381bNhQDRs2rNR8AwIClJiYqKZNm+rM\nmTOaNGmSbrvtNt1yyy1la6ai178yS15enjFmzBjjuuuuM7p27Wq8+eab1d0SKmj+/PlGy5YtL/iJ\niIgwDMMwDh48aNx///1GmzZtjF69ehlff/11qedv2LDBuPXWW42oqCjjoYceMg4dOlQdbwMVNHbs\nWPd1TA2DeXui06dPG6NHjzaio6ONzp07G6+++qp7HfP2PPv37zceeugho3379kaPHj1K/feZeXuW\n869jahiVn+/8+fONzp07G9dff70xYcIEIz8/v8y92AzjvGu8AAAAANWk2m9JCgAAAEgEUwAA/n+7\ndSwAAAAAMMjfeho7iiJgQkwBAFgQUwAAFsQUAIAFMQUAYEFMAQBYEFMAABbEFACABTEFAGBBTAEA\nWAgElahdqCbpEgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "val, bins, patches = plt.hist((y[\"time\"][y[\"event\"]],\n", " y[\"time\"][-y[\"event\"]]),\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['event'], y['time'], 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.grid_search.GridSearchCV.html#sklearn.grid_search.GridSearchCV) 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(x.shape[0], n_iter=200, train_size=0.5, random_state=0)\n", "gcv = GridSearchCV(estimator, param_grid, score_survival_model, cv=cv,\n", " n_jobs=4, iid=False, refit=False)" ] }, { "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.6932455298137199, {'alpha': 0.0009765625})" ] }, "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": [ { "data": { "image/png": "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\ndev/OTI71Zaamp0yObsUmj/rp53Ut6c3rinb9e+A8v63rmzazX/66VL3Hq173+rqur937ty61zl4\nQPr447rbJu87ktn57e47XmXyZy+Znb+97juS2flNzi6Zmb93724tPseImU2gLXTvIfXq5XYKAAA6\nFuPK5pT0M5Wa0LrpqYqauumpuOjWTU8VfXtAi/I/tD3+l0MS1TehdR95RU1AkhQX3boZxl3f1ujJ\nz0pa9RqInH4jfYpPat1r1FbXHcTo1Ll1pzBIUnmx9NV79g+KRP3kB/L1bN1FUFZ13Uy2r3On1r3O\nv8sVWPt1WM/pdM6pUmJC6963ukaS5Ovcyv/slnyr2nc+tT08+uyfyJfUyp1HkvWfaX1fK6f1reJi\n1by71vb42HMy1SkxpXXvWV0pSfJ1jm3V69SW7FXlOy+G9ZyTf3Ktuialtup9a6orJEnRneNa9Trf\nFRdp89onwnrO6DOnqHeP1uWv+k/+mFbm9x8o0isfLrI9/pq0a5TatXXZK2rqssdFty570XdFWvLl\nkrCec+0pY5TarXer3reipkqSFBcd06rXKSr164lNq474+caVzdSEHhqQ1LoP3y19E6J1fGLr/mOH\njik+Seqa3NqS2PqS+b3wzr7x9YyXL6Vrq96xLdOHLTFBUSk93UwQFAhzvC8pSVHJrStrbSnc/J0S\nU9Qp5VhHskRC16RU9Ug53u0YR6x3j1T17T3A7RhHJLVrqo7vbu5nn9qttwYktq4se4U3TsADAABA\nu0TZBAAAgGMomwAAAHAMZRMAAACOoWwCAADAMZRNAAAAOIayCQAAAMdQNgEAAOAYyiYAAAAcQ9kE\nAACAYyibAAAAcAxlEwAAAI6hbAIAAMAxlE0AAAA4hrIJAAAAx1A2AQAA4BjKJgAAABxD2QQAAIBj\nKJsAAABwDGUTAAAAjqFsAgAAwDGUTQAAADgmrLJZWVmpWbNmafjw4RoxYoRyc3MbHXf11Vdr0KBB\nDf6aNWtWm4QGAACAGaLDGTxv3jwVFBQoLy9Pu3bt0h133KE+ffroggsuCBn38MMPq6amJnh/48aN\nuvnmm/WLX/yibVIDAADACLbLZllZmZYtW6bFixcrLS1NaWlpmjx5spYuXdqgbHbv3j14u7a2Vg89\n9JCmTJmik046qdWBi7490OrXaCteygIAAOBFtstmYWGhampqlJ6eHtyWkZGhRx99tNnnLV++XN9+\n+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\ndrCkpC7y+dq+bHbrFhdyOzGxS5u/h1NMzi6R300mZ5fI7zaT85ucXSK/m0zOLnkrv+2ymZaWpujo\naOXn52vlBTlrAAAgAElEQVTYsGGSpPXr12vw4MENxt55552KiorSfffdF9xWWFiogQMH2g5WXHzI\nkZnN0tKKkNslJYfa/D2cYnJ2ifxuMjm7RH63mZzf5OwS+d1kcnYpcvntlFjbZTM+Pl6ZmZnKzs7W\nfffdp7179yo3N1c5OTmS6mY5ExISFBsbq5/+9Ke65ZZbdNpppyk9PV2rVq1Sfn6+/vCHP9gOHwhY\nCgQs2+MlqazskL75ZlezY4qKdgRvf/31V6qtDTQ5tk+fvjrqqMh9E2gpfzjZpcjnb8nheWtrA6qp\naT6/15ic3+TsEvndZnJ+k7NL5HeTydklb+UPa1H3mTNnKjs7W1lZWUpISND06dM1atQoSdLIkSOV\nk5OjzMxM/c///I/uueceLVy4ULt379aPfvQjLVq0SH369HHkDyHVFbWbbpqqsjL7zX3RooXNPn7U\nUV30l78sjEhhCzd/S9mlyOYHAABoTFhlMy4uTjk5OcHZzMMVFhaG3B8/frzGjx/funQAAAAwWlhl\n08vqZ/GaOwz9r39t15NPLgrZ9qtfTVG/fv0bHR/Jw9B28ktSRUXdORhxcXHNjpO8fRrA4beb4rXT\nAAAAQPjaTdmU6grbgAEnNPn4gw82nJF94YXntHDhEidj2dZSfi/jNAAAANAYsxaNAgAAgFHa1cxm\nS6ZNu1Vz594Tsm369NtcStO+2DkNoLq6Wn/60x8lSbfccoc6d+7c7GtyGB0AAPN1qLJ54okna9Cg\nE1VYWCBJSks7SWlpJ7mcKjwbNqyT5FNGxqluR2mgpdMAnnvubzp0qO4w++efb9Lll0+MVDQAAOCS\nDncY/dZb71BUVJSiojrplltmuB0nLFVVVcrLW6Knn17S4KdDvW7fvj1atWpF8P6qVSu0b99eFxMB\nAIBI6HBls0uXrrrkkrG65JKx6tKlq9txwrJq1Qr5/fu0b99erVr1ottxwrJo0UIFAt8vKBsI1GrR\nor+6mAgAAERChzqMXm/8+CvdjhC2upnB7wvmqlUrNHLkOUpOTnExlX1FRTttbXNLuL8+1dLSTSw7\nFR6T87f3fUcyOz/7jnPae/6OtO9Izub3WZYV3m9CRojfX+p2BE+ZP/8+5eevD9mWnj5Mt98+y6VE\n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\nXXfdddq/f7+6deumBQsW6M4771R8fLwGDRqk7du3a8+ePXrqqaeUlpbmdtwGPv30U910003q1auX\nfvnLXzZZOH0+n8aOHRvhdC176623NH36dJ1++umSpI8++kgZGRlasGCBEhMTJdX9YtbIkSNVWFjo\nZtQGvvjiC11//fXq0qWLMjIylJSUpJiYGFVVVWn//v3asGGDKioqtGjRIg0aNMjtuA2Q310rV67U\nnDlzdMkllygjI0M9e/YMyb9+/Xq9/PLLuv/++zV69Gi344YoKSnRzJkz9c477+iYY45Rr169QrLv\n3r1b5557ru6//351797d7bgNWJal3NxcLV26VN98802Dx/v06aOsrCz98pe/jHw4m0z+omXylywT\n9v12WzbT09NVXl5ua6zXCsOVV16ptLQ03XLLLVq+fLnmzZunzMxM3XvvvfL5fJKk+fPna+PGjVq6\ndKnLaRv3z3/+UxMnTtS8efMazAp63SWXXKIrrrhCv/jFLyRJW7Zs0bRp0yRJTz/9tHr37u3Zsjlu\n3Dilp6dr9uzZjT5uWZbmzp2rzz//XM8++2yE07WM/O766U9/qqlTp2rcuHFNjnn++ef1+OOP6403\n3ohgspbdeOONOnjwoB544AEdffTRDR7fvXu3ZsyYocTERC1YsMCFhM174IEHtGrVKt1+++3KyMgI\nKQx+v1/r16/XQw89pMzMTN16661ux23A5C9aJn/JkgzZ9612aufOnda1115rTZw40dqyZUtweyAQ\nsIYOHWp9/fXXLqZr3tChQ60dO3ZYlmVZtbW11oknnmh98cUXIWO++uorKz093Y14tj3zzDPWb37z\nG7djhO3wz7/ev//9b+viiy+2LrzwQmv//v3Wvn37rIEDB7qUsGlDhgyxtm3b1uyYLVu2WKecckqE\nEoWH/O5KT08P+e9lYwoLCz2Zf8iQIVZhYWGzY7788ktr6NChEUoUntNOO8366KOPmh3z0UcfWWec\ncUaEEoXnsssus/7whz80+XggELDuvfde6/LLL49gKnvOO+886/nnn292zHPPPWeNGjUqQonCY8K+\n324vEEpNTdXixYs1YcIEXXPNNfrTn/6kqqqq4Mxg/d+96Oijj9aGDRskSRs3blRtba02btwYMmbj\nxo2NfoPxkgkTJuiRRx5xO0bYjjvuOL3zzjsh25KSkpSbm6tAIKCsrCzt3r3bpXTN+9GPfqRly5Y1\nO+bZZ5/V8ccfH6FE4SG/u3784x/rvvvua/QwriTt3btXc+fO1VlnnRXhZC3r1atXi0caNm/erB49\nekQoUXiioqLUuXPnZsf4fD7V1tZGKFF4tm7dqokTJzb5uM/n04QJEzx3NEiqOww9dOjQZseccsop\n2rdvX4QShceEfb/dHkY/XElJiXJycpSfn6+7775b06ZN08qVK3Xssce6Ha1Rb7zxhm6//XYNGDBA\nW7du1TnnnKP9+/dr4MCBGjRokLZs2aLnn39ed911V7OHu3Bk1q5dq2nTpunMM8/UbbfdpoEDBwYf\n27t3ryZPnqydO3eqsrJSX375pYtJG6o/3zc+Pl7Dhg1TcnKyYmJiVFlZGTyUVVpaqkcffVSnnHKK\n23EbIL+76s/9Wrt2rY455phg/vpDud98841GjBihefPmee4CxdWrV2vOnDm66KKLNHz48JDs+/fv\n16effqqXXnpJv//97z15rvj8+fP18ssv66abbtKpp57aaP758+dr9OjRuvPOO92O28D48eM1fPhw\nzZgxo8kxc+fO1fr167V8+fIIJmvZtGnTdOjQIf3hD39Qnz59Gjy+d+9e/fa3v1WXLl20cOFCFxI2\nz4R9v0OUzXr/+Mc/dPfdd6uoqEhvvPGGZ8umVHee4AcffKAePXpo9OjRKikp0fz581VQUKDk5GSN\nHz/ek+eO1Nu0aZOeeuop5efnq6SkRDU1NerSpYv69u2rM844Q1dffbWnZ2YLCwu1evVqjR07tsEs\nVFlZmR577DG9/vrrWrNmjUsJm1ZWVqZXXnlFn332mfx+vyoqKhQbG6uUlBQNGTJEF1xwgbp27ep2\nzCb9d/7y8nLFxcWRP4J27NgRkr9+/xk6dKin/7u5adMmLV26tMG+X3+BysSJE1ucwXLTkiVLlJeX\npz179jR4rE+fPpowYYImT56sqCjvHZQ0+YuWyV+y6nl93+9QZVOqW1Jo06ZNGjJkiGJjY92O0y69\n8847uvnmm/Xzn/9cJ5xwgvbs2aNly5bp6quvVkJCgt555x3l5+dr8eLFGjJkiNtxATTC7/drz549\nqq6uZvmdCNu7d2+DwlC/eoqXmf5Fy9QvWSZot2XTsiz97W9/0+rVq/Xdd9/pzDPP1PXXX6+ePXsG\nxxQXF2v8+PGeXOuxqZnB1NRUnX766Z6eGRwzZowmT56sn//858Ftn3/+uW6//Xa99tprkqRHHnlE\n7777rievyJWk999/X/n5+cGr0F9//XU9++yzwXVOJ06cqHPPPdfllA3NmzdPN9xwg7p06RLc9uST\nT+qZZ57Rvn371L9/f02ZMkUXXnihiymb19QSJPXf0L28BIlkdn7L8OV3Dl96Z9++fSHL13h96Z16\nu3bt0meffRZcZ9NLayV2BKZ+yfL6vt9uy+Zjjz2mp556KrjO43PPPafy8nL99a9/DU4le3X5GtNn\nBjMyMvT888+HHH6uqqrS0KFD9e6776pXr17auXOnLrnkEuXn57uYtHFPP/205s+fr3Hjxumuu+7S\ns88+q/vvv1+XX365+vXrp+3bt2vZsmWaOXOmrrjiCrfjhhg0aJA++OCD4JeqJUuWaOHChfrNb36j\n/v3768svv9TixYv129/+1nPZJfOXIDE9v8nL75i89I5kxlqJLTH1i5bpX7KM2PfduAQ+Es477zxr\n7dq1wfvl5eXWTTfdZA0dOtRat26dZVmWZ5evufjii60XX3wxZNumTZus888/P3j/4Ycf9uQSEpZl\nWb/85S+tqVOnWqWlpcFtCxYssM4880zLsuqWwPjzn/9sXXrppW5FbNbZZ59tvfrqq8H7F154ofXC\nCy+EjHn55Zetc889N9LRWjRw4EBr//79wfsXXXSRtWLFipAxq1evtn76059GOpotpi9BYnp+k5ff\nMXnpHcuyrBtuuMG66qqrrN27dzf6+DfffGNdddVV1rRp0yKczJ6XXnrJGjx4sDV79mzrhRdesNau\nXWv94x//sNauXWstW7bMmjlzpnXKKadYL7/8sttRG5g3b541cuRI66WXXrJ27txplZeXW7W1tVZ5\nebm1Y8cOa8WKFdbIkSOtBx980O2ojTJh32+3ZTMjI8P617/+FbKttrbWuvXWW6309HRr/fr1ni2b\n6enp1tatW0O2VVZWWmlpaZbf77csy7J27Njh2fXivv76a+u8886zMjIyrHHjxlnnnHOOlZGRESz/\nWVlZ1o9//GNr48aNLidt3NChQ0PWGjzvvPOszZs3h4zZtm2bNWTIkEhHa9F/l81zzz3X+r//+7+Q\nMV999ZUns1uW2es8Wpb5+c844wxr/fr1zY75+OOPreHDh0cokX2mr3FqwlqJzTH5i5bJX7Isy4x9\n33uXtLWRIUOG6PHHH1d1dXVwW1RUlP74xz/qrLPO0pQpU/T222+7mLBpQ4YM0YMPPqjvvvsuuO2x\nxx5Tjx491KtXL1mWpeXLl6t///4upmzacccdp1deeUVz587V+eefr5tvvlmvv/66zjnnHEnS3Xff\nrTfffNOTpwBI0nnnnac5c+aoqKhIUt0vOi1cuFAVFRWS6n4X/cEHH9SZZ57pZswm/fWvf9Xzzz+v\ndevW6fTTT9fKlStDHv/73//uycOIktnrPErm57/ssst022236cUXX1RRUZGqqqok1Z0G880332jl\nypW6/fbbdemll7qctCHT1zg1Ya3E5pi8VqXpa5yasO+323M2t23bpuuuu06lpaV65JFHQn7/vLq6\nWnfffbdWrFghn8/nubUSd+zYoV/96lc6cOCA+vfvL7/fr9LSUj300EM655xzNGnSJG3btk2PPPKI\nZwtbY7755huVlJSoX79+IReweM3Bgwd122236cMPP9SgQYPUt29fffjhhwoEAkpJSdGuXbv0wx/+\nUI899pjnrhB98skntXXrVm3fvl3btm3TwYMHJUkff/yxunfvrgsvvFB+v1+PP/64hg0b5nLahkxf\ngsT0/JK5y++YvPSOZMZaic0xea1K09c4NWHfb7dlU6q7OmvdunU68cQTG72a7IMPPtDrr7+u3/3u\ndy6ka15lZaXefvtt7dy5U71799bZZ58d/J/Ttm3b1LdvX89eVVlbW6vFixdr/fr1Ov3003XllVfq\n1ltvDc4kd+rUSVdffbVuv/12RUdHu5y2aYWFhfrkk0+0c+dOlZWVqVOnTsGrQn/84x977n+2jdm/\nf7+2b9+u0047TVLd71r/+Mc/bvR/Bl5i+hIkpueXzFx+x/Sld7y+VmJzTP+iZeqXrHpe3/fbddms\nt3///uAyEiYtZSDVXTFff1WfKdnrvyWef/75evvtt5WQkKDKykrdf//9Ov744/XFF19o9uzZOu+8\n83THHXe4Hde2ffv2ad++ffrBD36gbt26uR2nWVVVVSorK2v0kFsgENCePXs8XzhNXYKknsn5WX4H\nR8r0L1omfskyQbstm5bBSxmYnF2SRowYoT//+c869dRTtWXLFo0ZM0Z5eXnB2TVJ+vTTT3XjjTfq\no48+cjFp48aNG6cnnngiuLzId999pxkzZuitt96SJEVHR+vyyy/XzJkzWzzPJ9JKS0s1Z84cvfnm\nm6qtrdWgQYM0Y8aMkHME/X6/zj77bM+dPiKZv++bnt/05XdMXXqnntfXSrTL1C9aJn/J8vq+791j\n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\nSUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cv_scores = {}\n", "for i in range(len(gcv.grid_scores_)):\n", " v = gcv.grid_scores_[i]\n", " name = \"%.5f\" % v.parameters[\"alpha\"]\n", " cv_scores[name] = v.cv_validation_scores\n", "\n", "sns.boxplot(pandas.DataFrame(cv_scores))\n", "_, xtext = plt.xticks()\n", "for t in xtext:\n", " t.set_rotation(\"vertical\")" ] }, { "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": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from survival.svm import FastKernelSurvivalSVM\n", "from survival.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": 13, "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": 14, "metadata": { "collapsed": false }, "outputs": [], "source": [ "kgcv = GridSearchCV(kssvm, param_grid, score_survival_model, cv=cv,\n", " n_jobs=4, iid=False, refit=False)" ] }, { "cell_type": "code", "execution_count": 15, "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": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(0.70387140748796451, {'alpha': 0.015625})" ] }, "execution_count": 16, "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": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nJH3++efKzMzUU089pYSEBEkNd8waPHiwioqKrIzaxNdff61bbrlFnTp1UmZmphITExUTE6Pq6mod\nOnRIGzZsUGVlpebPn6++fftaHbcJ8lvrzTff1MyZM3XllVcqMzNT3bp188m/fv16vf3223rsscc0\nfPhwq+P6KC0t1bRp07R69WqdeOKJSkpK8sm+b98+XXTRRXrsscd0/PHHWx23CcMwtGjRIi1evFh7\n9+5t8vUePXooOztbN910U/jD+cnJO1pO3slywrYfsWUzIyNDFRUVfq1rt8Jw/fXXKy0tTb/97W+1\ndOlS5eXlKSsrS48++qhcLpckac6cOdq4caMWL15scdrm/fOf/9TYsWOVl5fXZFTQ7q688kpdd911\n+vWvfy1J2rZtmyZPnixJevnll9W9e3fbls1Ro0YpIyNDM2bMaPbrhmFo1qxZ2rx5s1599dUwp2sb\n+a11ySWX6LbbbtOoUaNaXGfJkiV6/vnntXLlyjAma9udd96pw4cP6/HHH9cJJ5zQ5Ov79u3T1KlT\nlZCQoKeeesqChK17/PHHtXz5ct13333KzMz0KQwej0fr16/Xk08+qaysLN1zzz1Wx23CyTtaTt7J\nkhyy7RsRavfu3caECROMsWPHGtu2bfMur6+vN/r372989913FqZrXf/+/Y1du3YZhmEYdXV1xumn\nn258/fXXPut8++23RkZGhhXx/PbKK68Yt99+u9UxAnb059/oX//6l3HFFVcYl112mXHo0CHj4MGD\nRp8+fSxK2LL09HRjx44dra6zbds246yzzgpTosCQ31oZGRk+vy+bU1RUZMv86enpRlFRUavrfPPN\nN0b//v3DlCgw55xzjvH555+3us7nn39unHfeeWFKFJhrrrnG+MMf/tDi1+vr641HH33UuPbaa8OY\nyj8XX3yxsWTJklbX+dvf/mYMHTo0TIkC44RtP2IvEEpNTdWCBQs0ZswYjR8/Xv/1X/+l6upq78hg\n47/t6IQTTtCGDRskSRs3blRdXZ02btzos87GjRub3YOxkzFjxuiZZ56xOkbATj75ZK1evdpnWWJi\nohYtWqT6+nplZ2dr3759FqVr3S9+8QsVFBS0us6rr76qU089NUyJAkN+a11wwQWaPXt2s4dxJenA\ngQOaNWuWfvnLX4Y5WduSkpLaPNKwZcsWde3aNUyJAhMVFaWOHTu2uo7L5VJdXV2YEgVm+/btGjt2\nbItfd7lcGjNmjO2OBkkNh6H79+/f6jpnnXWWDh48GKZEgXHCth+xh9GPVlpaqtzcXBUWFuqhhx7S\n5MmT9eabb+qkk06yOlqzVq5cqfvuu0+9e/fW9u3bNWTIEB06dEh9+vRR3759tW3bNi1ZskQPPvhg\nq4e7cGxWrVqlyZMn6/zzz9e9996rPn36eL924MABTZw4Ubt371ZVVZW++eYbC5M21Xi+b1xcnAYM\nGKDk5GTFxMSoqqrKeyirrKxMzz33nM466yyr4zZBfms1nvu1atUqnXjiid78jYdy9+7dq0GDBikv\nL892Fyi+9dZbmjlzpi6//HINHDjQJ/uhQ4f05Zdf6o033tDvf/97W54rPmfOHL399tu66667dPbZ\nZzebf86cORo+fLgeeOABq+M2MXr0aA0cOFBTp05tcZ1Zs2Zp/fr1Wrp0aRiTtW3y5Mk6cuSI/vCH\nP6hHjx5Nvn7gwAH97ne/U6dOnTR37lwLErbOCdt+uyibjf7xj3/ooYceUnFxsVauXGnbsik1nCe4\nZs0ade3aVcOHD1dpaanmzJmjrVu3Kjk5WaNHj7bluSONNm3apJdeekmFhYUqLS1VbW2tOnXqpJ49\ne+q8887TjTfeaOuR2aKiIr311lsaOXJkk1Go8vJyzZs3T++//75WrFhhUcKWlZeX65133tFXX30l\nj8ejyspKxcbGKiUlRenp6Ro2bJg6d+5sdcwW/Xv+iooKud1u8ofRrl27fPI3bj/9+/e39e/NTZs2\nafHixU22/cYLVMaOHdvmCJaVFi5cqPz8fO3fv7/J13r06KExY8Zo4sSJioqy30FJJ+9oOXknq5Hd\nt/12VTalhimFNm3apPT0dMXGxlodJyKtXr1ad999t6666iqddtpp2r9/vwoKCnTjjTcqPj5eq1ev\nVmFhoRYsWKD09HSr4wJohsfj0f79+1VTU8P0O2F24MCBJoWhcfYUO3P6jpZTd7KcIGLLpmEY+stf\n/qK33npLP/74o84//3zdcsst6tatm3edkpISjR492pZzPbY0Mpiamqpzzz3X1iODI0aM0MSJE3XV\nVVd5l23evFn33Xef3nvvPUnSM888o48//tiWV+RK0qeffqrCwkLvVejvv/++Xn31Ve88p2PHjtVF\nF11kccqm8vLydMcdd6hTp07eZS+++KJeeeUVHTx4UL169dKkSZN02WWXWZiydS1NQdK4h27nKUgk\nZ+c3HD79ztFT7xw8eNBn+hq7T73TaM+ePfrqq6+882zaaa7E9sCpO1l23/YjtmzOmzdPL730knee\nx7/97W+qqKjQs88+6x1Ktuv0NU4fGczMzNSSJUt8Dj9XV1erf//++vjjj5WUlKTdu3fryiuvVGFh\noYVJm/fyyy9rzpw5GjVqlB588EG9+uqreuyxx3TttdfqlFNO0c6dO1VQUKBp06bpuuuuszquj759\n+2rNmjXenaqFCxdq7ty5uv3229WrVy998803WrBggX73u9/ZLrvk/ClInJ7fydPvOHnqHckZcyW2\nxak7Wk7fyXLEtm/FJfDhcPHFFxurVq3yPq+oqDDuuusuo3///sa6desMwzBsO33NFVdcYbz++us+\nyzZt2mRceuml3udPP/20LaeQMAzDuOmmm4zbbrvNKCsr8y576qmnjPPPP98wjIYpMP70pz8ZV199\ntVURW3XhhRca7777rvf5ZZddZrz22ms+67z99tvGRRddFO5oberTp49x6NAh7/PLL7/cWLZsmc86\nb731lnHJJZeEO5pfnD4FidPzO3n6HSdPvWMYhnHHHXcYN9xwg7Fv375mv753717jhhtuMCZPnhzm\nZP554403jH79+hkzZswwXnvtNWPVqlXGP/7xD2PVqlVGQUGBMW3aNOOss84y3n77baujNpGXl2cM\nHjzYeOONN4zdu3cbFRUVRl1dnVFRUWHs2rXLWLZsmTF48GDjiSeesDpqs5yw7Uds2czMzDT+93//\n12dZXV2dcc899xgZGRnG+vXrbVs2MzIyjO3bt/ssq6qqMtLS0gyPx2MYhmHs2rXLtvPFfffdd8bF\nF19sZGZmGqNGjTKGDBliZGZmest/dna2ccEFFxgbN260OGnz+vfv7zPX4MUXX2xs2bLFZ50dO3YY\n6enp4Y7Wpn8vmxdddJHxP//zPz7rfPvtt7bMbhjOnufRMJyf/7zzzjPWr1/f6jpr1641Bg4cGKZE\n/nP6HKdOmCuxNU7e0XLyTpZhOGPbt98lbSGSnp6u559/XjU1Nd5lUVFR+uMf/6hf/vKXmjRpkj76\n6CMLE7YsPT1dTzzxhH788Ufvsnnz5qlr165KSkqSYRhaunSpevXqZWHKlp188sl65513NGvWLF16\n6aW6++679f7772vIkCGSpIceekgffPCBLU8BkKSLL75YM2fOVHFxsaSGOzrNnTtXlZWVkhrui/7E\n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\nd5x2e+edd3j33Xc5ceIEY8eO5dVXXyUmJoaSkhKcnZ3Jz89n8+bNhi3Uf/jhh/H19aV3794MGDCA\nmzdvEhUVRXp6Og8++CDbt29n9erV+Pn56R21Var/dhctWkRQUBCff/55m/U7RqN6x6kKXYnmqHyi\npfJJFqhx7FvsPZugdpWBytlB7Zutm3z33XfU1tbyyCOP6B3lBzl27BgbN24kJyeHa9eumb63sbHB\nxcWFmTNn8vzzz+uY0Lzy8nKKi4tNXadnz55lw4YNdO3aFV9fX0aPHs2f/vQnU2G90aj+21W5fkfl\n6h0VuhLNUbmrUvWOUzD+sW/Rk02hD9VvtrYk33zzjalzs0ePHnTp0kXvSPdF0zTD1x4J/alcvWPk\nrsS2qHyipfJJ1p2Meuxb9GRT5dU1lbOr/ERrkzvHv7UKEiOPf2vZm/rWjJ4dbtdi7dmzh9raWkaO\nHImvr2+z7TU1NSxZssRwTQBNVP7tgvr1O6pW79zJqF2JwtiMfOxb7GRT5dU1lbPD7Z7NtLQ0nJ2d\n77pPUVEREydOJC8vrxOTtY/K469ydoAvvviCOXPmmN47f+TIEdzd3Vm1ahU9evQAbv9F/PTTTxvy\ndZuqj7/K9TsqV++AGl2JbVH5REvlkywVjn2LnWyqvLqmcnaAl19+GQ8PD7M3Wy9ZsoTc3FzS0tI6\nMVn7qDz+KmcH8Pf355VXXuH1118Hbj85P3v2bACSk5Pp3bu3oSebqo//s88+S3BwMJMmTbrrPn//\n+99Zt24dn3/+eScma5vqHadKdCWaofKJlsonWaDIsd/ZXUudReW+OJWza5qmff3115qXl5fm6+ur\nhYaGavHx8drq1au1uLg4LSwsTBs7dqzm6enZoj/RKFQef5Wza9rtntALFy40+66qqkrz8/PTXnjh\nBe3y5ctaRUWF9uSTT+qU0DzVx3/YsGFaYWGh2X3y8/MNmV/1jlMVuhLNUbmrUvWOUxWOfeM9kvcj\naaoyMMeoVQYqZwcYPHgwmZmZvPHGG3Tt2pWCggKOHj1KQUEBXbt2JSgoiMzMTMM+1afy+KucHaB/\n//7s27ev2Xc9e/YkKSmJxsZGpk2bRmlpqU7p2qb6+DfV77R2GReMXb/TVL1jjlGrd0CNrkRzioqK\nzHZoNnVVGvGKhOodpyoc+xZ7GV3lKgOVs1sClcdf5ewAX375JbNnz8bT05M//vGPzTr7ysvLCQgI\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "kcv_scores = {}\n", "for i in range(len(kgcv.grid_scores_)):\n", " v = kgcv.grid_scores_[i]\n", " name = \"%.5f\" % v.parameters[\"alpha\"]\n", " kcv_scores[name] = v.cv_validation_scores\n", "\n", "sns.boxplot(pandas.DataFrame(kcv_scores))\n", "_, xtext = plt.xticks()\n", "for t in xtext:\n", " t.set_rotation(\"vertical\")" ] }, { "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 }