{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Using Longitudinal Data\n", "=======================\n", "\n", "This example demonstrates how to do cross validation with longitudinal\n", "data.\n", "By *longitudinal*, we mean predictors for specific samples that have more than one value. \n", "This could be time series data or any other sequential data we might want to model. \n", "\n", "\n", "Example Patient Data\n", "------------------------------\n", "\n", "First, we generate some example data and store it using this script: https://github.com/lacava/feat/blob/master/docs/examples/longitudinal/generate_example_longitudinal_data.py. \n", "\n", "Let’s imagine we have patient data from a hospital. \n", "This means we have measurements from different visits, with different numbers of measurements from different\n", "patients collected in non-uniform intervals.\n", "In this example, we make up a risk model in which risk increases for a\n", "patient with an increasing body mass index (BMI) and a high maximum\n", "glucose level in their blood panel." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "from sklearn.model_selection import KFold\n", "\n", "random_state=42\n", "\n", "df = pd.read_csv('data/d_example_patients.csv')\n", "df.drop('id',axis=1,inplace=True)\n", "X = df.drop('target',axis=1)\n", "y = df['target']\n", "kf = KFold(n_splits=3,shuffle=True,random_state=random_state)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# longitudinal format\n", "\n", "FEAT expects longitudinal data in the following format:\n", "\n", "```python\n", "\n", "Z = {\n", " 'variable': ([patient1_values, patient2_values], [patient1_times, patient2_timestamps])\n", "}\n", "```\n", "\n", "\n", "Longitudinal data is a dictionary in which the keys are the variable names and the values are tuples. \n", "The first element of the tuple contains observations, and the second element contains corresponding time stamps for those observations. \n", "The observations and timestamps are expected to be lists, with one element for each patient. \n", "Each patient element contains all of the observations or time stamps for that patient. \n", "\n", "\n", "On the c++ side, FEAT interprets this into the following format:\n", "\n", "```c++\n", "typedef std::map, vector>\n", " > LongData;\n", "```\n", "\n", "Although a little clunky, the goal is to store patient-specific values in arrays under the hood to allow for as much SIMD optimization as possible when evaluating operators." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is the longitudinal data we generated:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnamedatevalue
00bmi251540.000000
10age251533.000000
20glucose25150.058084
30bmi297940.000000
40age297934.000000
...............
147250992age71187213.000000
147251992glucose711870.388632
147252992bmi7214987.000000
147253992age72149215.000000
147254992glucose721490.426824
\n", "

147255 rows × 4 columns

\n", "
" ], "text/plain": [ " id name date value\n", "0 0 bmi 2515 40.000000\n", "1 0 age 2515 33.000000\n", "2 0 glucose 2515 0.058084\n", "3 0 bmi 2979 40.000000\n", "4 0 age 2979 34.000000\n", "... ... ... ... ...\n", "147250 992 age 71187 213.000000\n", "147251 992 glucose 71187 0.388632\n", "147252 992 bmi 72149 87.000000\n", "147253 992 age 72149 215.000000\n", "147254 992 glucose 72149 0.426824\n", "\n", "[147255 rows x 4 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zfile = 'data/d_example_patients_long.csv'\n", "zdf = pd.read_csv('data/d_example_patients_long.csv')\n", "zdf" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see it's in a long tabular format. Below we convert it to the FEAT input format." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "dates = zdf.set_index(['name','id'])['date']\n", "values = zdf.set_index(['name','id'])['value']\n", "# zdf.set_index(['name','date']).to_dict(orient='tight')\n", "values.to_dict()\n", "Z = {}\n", "for name, zg in zdf.groupby('name'):\n", " values = [\n", " zgid['value'].values for _,zgid in zg.groupby('id')\n", " ]\n", " timestamps = [\n", " zgid['date'].values for _,zgid in zg.groupby('id')\n", " ]\n", " Z[name] = (values, timestamps)\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Next we set up the learner. We need to declare the longitudinal\n", "operators we want to search over. They are defined as a comma-delimited\n", "list of strings using the ``functions`` argument. In this case, the\n", "operators on the second row of the declaration below all operate on\n", "longitudinal data.\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from feat import Feat\n", "\n", "clf = Feat(max_depth=5,\n", " max_dim=5,\n", " gens = 10,\n", " pop_size = 100,\n", " max_time = 30, # seconds\n", " verbosity=0,\n", " shuffle=True,\n", " normalize=False, # don't normalize input data\n", " functions=['and','or','not','split','split_c',\n", " 'mean','median','max','min','variance','skew','kurtosis','slope','count'\n", " ],\n", " backprop=True,\n", " batch_size=10,\n", " iters=10,\n", " random_state=random_state,\n", " n_jobs=1,\n", " simplify=0.01 # prune final representations\n", " )\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cross validation\n", "----------------\n", "\n", "Cross validation works a little bit differently with longitudinal data. \n", "The block below shows how to train a model using Kfold cross validation." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "scores: [0.0019200502112349603, 0.0013323824931506492, 0.020377830997444116]\n" ] } ], "source": [ "scores=[]\n", "\n", "for train_idx, test_idx in kf.split(X,y):\n", " # print('train_idx:',train_idx)\n", " # note that the train index is passed to FEAT's fit method\n", " Ztrain = {k:([v[0][i] for i in train_idx], [v[1][i] for i in train_idx]) for k,v in Z.items()}\n", " Ztest = {k:([v[0][i] for i in test_idx], [v[1][i] for i in test_idx]) for k,v in Z.items()}\n", " clf.fit(X.loc[train_idx],y.loc[train_idx],Ztrain) \n", " scores.append(clf.score(X.loc[test_idx],y.loc[test_idx],Ztest))\n", "\n", "print('scores:',scores)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Model Interpretation\n", "--------------------\n", "\n", "Now let’s fit a model to all the data and try to interpret it.\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "fitting longer to all data...\n" ] }, { "data": { "text/plain": [ "Feat(backprop=True, batch_size=10, feature_names='sex,race',\n", " functions='and,or,not,split,split_c,mean,median,max,min,variance,skew,kurtosis,slope,count',\n", " max_depth=5, max_dim=5, max_time=30, normalize=False, random_state=42,\n", " simplify=0.01, verbosity=2)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# fit to all data\n", "\n", "print('fitting longer to all data...')\n", "clf.gens = 100\n", "clf.fit(X,y,Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "To see the learned representation, we run ``clf.get_representation()``:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'[slope(z_bmi)][max(z_glucose)]'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clf.get_representation()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here our final representation is composed of ``slope(z_bmi)`` and\n", "``max(z_glucose)``, both of which we know to be correct features for\n", "this simulated dataset. The best training representation displays clear\n", "overfitting, highlighting the importance of using archive validation for\n", "model selection.\n", "We can also look at the representation with the model weights, sorted by\n", "magnitude, using ``clf.get_model()``:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Weight\tFeature\n", "8.23132\toffset\n", "0.80\tslope(z_bmi)\n", "0.73\tmax(z_glucose)\n", "\n" ] } ], "source": [ "print(clf.get_model())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "View runtime stats\n", "------------------\n", "\n", "FEAT stores statistics about the training procedure in a dictionary `clf.stats_`. \n", "An example of plotting from this dictionary is shown below." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['generation', 'med_complexity', 'med_dim', 'med_loss', 'med_loss_v', 'med_num_params', 'med_size', 'min_loss', 'min_loss_v', 'time'])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clf.stats_.keys()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAEKCAYAAADq59mMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAk/0lEQVR4nO3deZSU9ZX/8felaUQQEAEjgsgybN10QUODaBWLWw6gCUcDCKMTdTT8dOLETJIZNXNcMnNyZn6Jif4cNQbjkrgxSNRhFDWagQAJIg2KNIuBsEjLKC0KgoCy3N8fT3fbNLV2d21dn9c5dbrqeb711G0ovH6X53vN3REREUlFm2wHICIi+UfJQ0REUqbkISIiKVPyEBGRlCl5iIhIypQ8REQkZW2zHUAmdO/e3fv27ZvtMERE8sqqVas+cvce0c4VRPLo27cvlZWV2Q5DRCSvmNn2WOc0bCUiIilT8hARkZQpeYiISMoKYs5DRDLv8OHDVFdXc+jQoWyHIgm0b9+e3r17U1xcnPR7lDxEJC2qq6vp1KkTffv2xcyyHY7E4O7s3r2b6upq+vXrl/T7NGwlImlx6NAhunXrpsSR48yMbt26pdxDVM8jnu3bYc2a7MYwaBAMGZLdGESaSIkjPzTl70nJI57XX4frr89uDGecATt3gv4RiqRkz549PP300/zd3/1dyu+dMmUKTz/9NKeeemrMNnfccQfjx4/noosuakaUgbp70bp3797sa2WKkkc8U6dCeXn2Pv+ll+COO+DPf4bBg7MXh0ge2rNnDw8++GDU5HH06FGKiopivnfhwoUJr/8v//IvzYov77l7q3+MGjXK89LGje7g/vDD2Y5EJGXr16/P6udfccUV3r59ex8+fLj/4Ac/8EWLFvnEiRN91qxZPnToUHd3nzp1qo8cOdJLSkr8l7/8Zf17zz77bK+pqfGtW7f6kCFD/Prrr/eSkhK/+OKL/cCBA+7ufvXVV/uzzz5b3/6OO+7w8vJyHzZsmG/YsMHd3Xft2uUXXXSRl5eX++zZs71Pnz5eU1NzQqx1n+fu/rOf/cxLS0u9tLTU77nnHnd3379/v0+ZMsVDoZCXlpb63Llz3d39lltu8aFDh3pZWZl///vfb9afV7S/L6DSY/x3VT2PXDZoEHTvDsuWZX/4TKQZvvtdePvtlr3miBFw772xz//7v/87VVVVvF37wYsXL+bNN9+kqqqqflXRo48+ymmnncbBgwcZPXo03/jGN+jWrdtx19m0aRPPPPMMDz/8MDNmzOC3v/0tV1111Qmf1717d1avXs2DDz7I3Xffza9+9St+9KMfccEFF3DbbbfxyiuvMGfOnLi/06pVq3jsscdYsWIF7s4555zDhAkT2LJlC2eeeSYvvfQSAHv37uXjjz/m+eefZ+PGjZgZe/bsSfaPrkVotVUuM4NIJEgeItJsY8aMOW456n333cfw4cMZO3YsO3bsYNOmTSe8p1+/fowYMQKAUaNGsW3btqjXvvzyy09os2zZMmbOnAnApEmT6Nq1a9z4li1bxmWXXUbHjh055ZRTuPzyy1m6dCllZWW8/vrr3HLLLSxdupQuXbrQuXNn2rdvz/XXX89zzz1Hhw4dUvzTaB71PHLduHHwwgvwv/8LPXtmOxqRJonXQ8ikjh071j9fvHgxr7/+OsuXL6dDhw5MnDgx6nLVk046qf55UVERBw8ejHrtunZFRUUcOXIECKYFUhGr/aBBg1i1ahULFy7ktttu46tf/Sp33HEHb775Jr///e+ZO3cu999/P//zP/+T0uc1h3oeuS4SCX6q9yGSkk6dOrFv376Y5/fu3UvXrl3p0KEDGzdu5I033mjxGCKRCPPmzQPgd7/7HZ988knc9uPHj+eFF17gwIEDfPbZZzz//POMGzeOnTt30qFDB6666ip+8IMfsHr1avbv38/evXuZMmUK9957b/3wXKao55Hrysvh5JOD5DF9erajEckb3bp1IxwOM2zYMCZPnswll1xy3PlJkybx0EMPEQqFGDx4MGPHjm3xGO68805mzZrFf/7nfzJhwgR69uxJp06dYrYfOXIk11xzDWPGjAHg+uuvp7y8nFdffZV//Md/pE2bNhQXF/OLX/yCffv2MXXqVA4dOoS7c88997R4/PFYqt2qXGBm/YF/Brq4+7RE7SsqKjyv63lccAHs3QurVmU7EpGkbdiwgaFDh2Y7jKz6/PPPKSoqom3btixfvpwbb7wx4z2EZEX7+zKzVe5eEa19xoetzOxRM9tlZlWNjk8ys3fNbLOZ3RrvGu6+xd2vS2+kOSQSCZaqxOmCi0juee+99xg9ejTDhw/nO9/5Dg8//HC2Q2ox2Ri2ehy4H/hN3QEzKwIeAC4GqoGVZrYAKAL+rdH7/9bdd2Um1BwxbhwcOwZvvAEXX5ztaEQkSQMHDuStt97KdhhpkfHk4e5LzKxvo8NjgM3uvgXAzOYCU93934BLm/I5ZjYbmA3Qp0+fpgecC8aOhTZtYOlSJQ8RyQm5stqqF7Cjwevq2mNRmVk3M3sIKDez26K1cfc57l7h7hU9ekSt354/OnUK7ojSiisRyRG5stoq2q5/MWfy3X03cEP6wslBkQg8/DAcPgwpFGwREUmHXOl5VANnNXjdG9iZpVhyUyQCBw9CKx0/FZH8kivJYyUw0Mz6mVk7YCawIMsx5RbdLCiSdqeccgoAO3fuZNq06HcBTJw4kURL/++9914OHDhQ/3rKlCktsvfUXXfdxd13393s67SEbCzVfQZYDgw2s2ozu87djwA3Aa8CG4B57r4u07HltJ49YcCAYNJcRNLqzDPPZP78+U1+f+PksXDhwri1QfJRxpOHu89y957uXuzuvd39kdrjC919kLsPcPcfZzquvFC3SWIe3tgpkmm33HILDz74YP3ru+66i5/97Gfs37+fCy+8kJEjR1JWVsZ//dd/nfDebdu2MWzYMAAOHjzIzJkzCYVCXHHFFcftbXXjjTdSUVFBaWkpd955JxBstrhz507OP/98zj//fCAo9vTRRx8B8POf/5xhw4YxbNgw7q3d9Gvbtm0MHTqUb33rW5SWlvLVr3415h5add5++23Gjh1LKBTisssuq9/65L777qOkpIRQKFS/KeMf/vAHRowYwYgRIygvL4+7bUvSYu3V3poeeVvPo7GHHw7qe2zcmO1IRBI6rj7EzTe7T5jQso+bb477+atXr/bx48fXvx46dKhv377dDx8+7Hv37nV395qaGh8wYIAfO3bM3d07duzo7u5bt2710tJSdw/qa1x77bXu7r5mzRovKirylStXurv77t273d39yJEjPmHCBF+zZo27H1+fo+HryspKHzZsmO/fv9/37dvnJSUlvnr1at+6dasXFRX5W2+95e7u06dP9yeeeOKE3+nOO+/0n/70p+7uXlZW5osXL3Z399tvv91vrv3z6Nmzpx86dMjd3T/55BN3d7/00kt92bJl7u6+b98+P3z48AnXTrWeR67MeUgyxo0LfmreQySh8vJydu3axc6dO1mzZg1du3alT58+uDs//OEPCYVCXHTRRbz//vt8+OGHMa+zZMmS+vodoVCIUChUf27e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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "plt.plot(clf.stats_['time'], clf.stats_['min_loss'], 'b', label='training loss')\n", "plt.plot(clf.stats_['time'], clf.stats_['min_loss_v'], 'r', label='validation loss')\n", "plt.legend()\n", "plt.xlabel('Time (s)')\n", "plt.ylabel('MSE')\n", "plt.gca().set_yscale('log')\n", "plt.gca().set_xscale('log')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEKCAYAAAAVaT4rAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAt60lEQVR4nO3deZwU5bX4/89hWAZkUAQUWRsVUWEGxBFxBeNVSUDR0RhRXIiKMYkxMTdeva43ixqNWSQ/F6KAMQHNTwHXKJoLolcwQkQkATUCsogOm8guMOf7x9MFzdDdU93T1VXdfd6vV7+aru6uOjP0nDlz6qnnEVXFGGNM6WgSdgDGGGPyyxK/McaUGEv8xhhTYizxG2NMibHEb4wxJcYSvzHGlJimYQfgR/v27TUWi4UdhjHGFJS5c+euUdUO9bcXROKPxWLMmTMn7DCMMaagiMgnybZbq8cYY0qMJX5jjCkxlviNMabEFESP3xizrx07drBixQq2bdsWdigmZOXl5XTp0oVmzZr5en1giV9EugJ/BDoCdcBYVf2diBwIPAXEgKXAhaq6Pqg4jClWK1asoKKiglgshoiEHY4Jiaqydu1aVqxYQY8ePXy9J8hWz07gx6p6FDAQ+J6IHA3cBPxNVXsCf4s/NsZkaNu2bbRr186SfokTEdq1a5fRX36BVfyqugpYFf/3RhFZCHQGhgOD4y97HJgB/FdQcYRp5UqYOze4/ffq5W6mdFnSN5D55yAvPX4RiQHHAG8DB8d/KaCqq0TkoBTvGQ2MBujWrVs+wsyptWvhmGNg9ergjtG8Ofz979C3b3DHMCZfBg8ezK9+9Suqq6v5xje+wcSJEznggAPCDisjrVu3ZtOmTRm/b86cOfzxj3/kgQceYMaMGTRv3pwTTzwxgAidwBO/iLQGngF+qKpf+v3NpKpjgbEA1dXVBbdazA03wPr18MILcMghud//9u1QUwOXXALvvAMtW+b+GMaE5aWXXgo7hLyqrq6muroagBkzZtC6detAEz+qGtgNaAa8AtyQsO0D4JD4vw8BPmhoP8cee6wWkpdfVgXVW2/Nz3Guuy7Y45ho+te//hXq8ZcsWaK9evXSK6+8Unv37q0XX3yxvvrqq3riiSfq4Ycfrm+//baqqm7atElHjRql1dXV2q9fP506daqqqm7ZskW/9a1vaWVlpV544YU6YMAAfeedd1RVtXv37rp69WpVVR0+fLj2799fjz76aH3kkUd2H3+//fbT//7v/9aqqio9/vjj9bPPPtsnxo0bN+oVV1yhffr00crKSn366adVVXXixInap08f7d27t95444177fPGG2/U/v376+mnn65vv/22Dho0SHv06KHPPvusqqqOHz9ezznnHD3rrLP0iCOO0DvvvHOv93vuvfdera6u1srKSr399ttVVXXy5Ml6+umna11dnX766afas2dPXbVqlU6fPl2HDh2qS5Ys0YMPPlg7deqkffv21ZkzZ2osFtOvvvpKVVU3bNig3bt33/04UbLPAzBHk+XmZBtzcQMEN6rnt/W23wfcFP/3TcC9De2rkBL/xo2q3burHnmk6rZtwR/v+uvd/+JLLwV/LBMtiT/o11+vOmhQbm/XX5/++EuWLNGysjKdP3++7tq1S/v376+jRo3Suro6nTp1qg4fPlxVVW+++WZ94oknVFV1/fr12rNnT920aZPef//9OmrUKFVVfe+997SsrCxp4l+7dq2qul8UvXv31jVr1qiqKqDPPfecqqr+5Cc/0Z/97Gf7xHjjjTfq9QlfyLp163TlypXatWtXra2t1R07duhpp52mU6ZM2b3Pl+I/TOeee66eccYZ+tVXX+m8efO0b9++quoSf8eOHXXNmjW7Y/Li9hL/K6+8oldffbXW1dXprl27dOjQofr666+rquoll1yiY8aM0aFDh+rEiRNVVXcnflXVO+64Q++7777dMV9xxRW743vkkUf0hhtuSPr/kUniD3JUz0nApcDXRGRe/PYN4B7gDBH5CDgj/rho3HYbfPIJ/OEP0KJF8Me75x7o0wdGjYLa2uCPZ0yiHj16UFlZSZMmTejduzenn346IkJlZSVLly4FYNq0adxzzz3069ePwYMHs23bNpYtW8bMmTMZOXIkAFVVVVRVVSU9xgMPPEDfvn0ZOHAgy5cv56OPPgKgefPmDBs2DIBjjz129/ESvfbaa3zve9/b/bht27a88847DB48mA4dOtC0aVMuueQSZs6cuXufQ4YMAaCyspJBgwbRrFmzvb4egDPOOIN27drRsmVLampqePPNN/c67rRp05g2bRrHHHMM/fv3Z9GiRbvjHjNmDHfffTctWrRgxIgRDX6Pr7rqKsaPHw/A+PHjGTVqVIPvaUiQo3rexFX9yZwe1HHD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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "plt.plot(clf.stats_['time'], clf.stats_['med_complexity'], 'b', label='median complexity')\n", "# plt.plot(clf.stats_['time'], clf.stats_['med_size'], 'r', label='median size')\n", "plt.legend()\n", "plt.xlabel('Time (s)')\n", "plt.ylabel('Median Complexity')\n", "# plt.gca().set_yscale('log')\n", "plt.gca().set_xscale('log')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Visualizing the representation\n", "------------------------------\n", "\n", "Here we take the two relevant features and plot the data with them.\n", "This shows us the risk surface as a function of these learned features." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "proj: (993, 2)\n", "rep: ['slope(z_bmi)', 'max(z_glucose)']\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Visualize the representation\n", "\n", "proj = clf.transform(X,Z)\n", "\n", "print('proj:',proj.shape)\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import matplotlib.patheffects as PathEffects\n", "from matplotlib import cm\n", "\n", "cm = plt.cm.get_cmap('RdBu')\n", "# We choose a color palette with seaborn.\n", "# palette = np.array(sns.color_palette(\"cividis\", np.unique(y)))\n", "\n", "# We create a scatter plot.\n", "f = plt.figure(figsize=(6, 6))\n", "ax = plt.subplot(aspect='equal')\n", "sc = ax.scatter(proj[:,0], proj[:,1], lw=0, s=20,\n", " c=y, cmap=cm)\n", "plt.colorbar(sc)\n", "# sc.colorbar()\n", "ax.axis('square')\n", "# ax.axis('off')\n", "ax.axis('tight')\n", "\n", "# add labels from representation\n", "rep = [r.split('[')[-1] for r in clf.get_representation().split(']') if r != '']\n", "print('rep:',rep)\n", "plt.xlabel(rep[0])\n", "plt.ylabel(rep[1])\n", "\n", "# plt.savefig('longitudinal_representation.svg', dpi=120)\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.10.9 ('feat')", "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.10.9" }, "vscode": { "interpreter": { "hash": "d66ca72d61f5dfef1f2206d4040f625e956f2c7717f82cf69012f4e80879aa3c" } } }, "nbformat": 4, "nbformat_minor": 4 }