Created
October 16, 2023 12:32
-
-
Save alonsosilvaallende/0371023c5a09eb07b2b8825b3ab99057 to your computer and use it in GitHub Desktop.
Copy of Cox_PH_and_RSF-colab.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"provenance": [], | |
"include_colab_link": true | |
}, | |
"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.8.2" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/alonsosilvaallende/0371023c5a09eb07b2b8825b3ab99057/copy-of-cox_ph_and_rsf-colab.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "UN3PoUTSb2nT" | |
}, | |
"source": [ | |
"The objective of this notebook is to compare different models to estimate the survival probability given a set of features/covariables.\n", | |
"\n", | |
">[\"Experimental Comparison of Semi-parametric, Parametric, and Machine Learning Models for Time-to-Event Analysis Through the Concordance Index,\"](https://arxiv.org/abs/2003.08820)\n", | |
"Camila Fernandez, Chung Shue Chen, Pierre Gaillard, Alonso Silva\n", | |
"\n", | |
"To perform this analysis we will use [scikit-learn](https://scikit-learn.org/) and [scikit-survival](https://pypi.org/project/scikit-survival/). Finally, we will use [eli5](https://eli5.readthedocs.io/en/latest/index.html) to study feature importances (computed with permutation importance)." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "pzqGFx_Bb_6A" | |
}, | |
"source": [ | |
"!pip install -q scikit-survival" | |
], | |
"execution_count": 1, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "VoQVEI5p_rga" | |
}, | |
"source": [ | |
"import numpy as np\n", | |
"import pandas as pd\n", | |
"import matplotlib.pyplot as plt" | |
], | |
"execution_count": 2, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "SnT6e_JPb2ns" | |
}, | |
"source": [ | |
"We first download a dataset from scikit-survival." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "D0xxNWzI-N3j" | |
}, | |
"source": [ | |
"from sksurv.datasets import load_gbsg2\n", | |
"\n", | |
"X, y = load_gbsg2()" | |
], | |
"execution_count": 3, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "IBTo4q_Hb2n0" | |
}, | |
"source": [ | |
"## An example: German Breast Cancer Study Group 2 (gbcsg)\n", | |
"\n", | |
"This dataset contains the following 8 features/covariables:\n", | |
"\n", | |
"- age: age (in years),\n", | |
"- estrec: estrogen receptor (in fmol),\n", | |
"- horTh: hormonal therapy (yes or no),\n", | |
"- menostat: menopausal status (premenopausal or postmenopausal),\n", | |
"- pnodes: number of positive nodes,\n", | |
"- progrec: progesterone receptor (in fmol),\n", | |
"- tgrade: tumor grade (I < II < III),\n", | |
"- tsize: tumor size (in mm).\n", | |
"\n", | |
"and the two outputs:\n", | |
"\n", | |
"- recurrence free time (in days),\n", | |
"- censoring indicator (0 - censored, 1 - event).\n", | |
"\n", | |
"The dataset has 686 samples and 8 features/covariables.\n", | |
"\n", | |
"\n", | |
"**References**\n", | |
"\n", | |
"M. Schumacher, G. Basert, H. Bojar, K. Huebner, M. Olschewski, W. Sauerbrei, C. Schmoor, C. Beyerle, R.L.A. Neumann and H.F. Rauschecker for the German Breast Cancer Study Group (1994), [Randomized 2 x 2 trial evaluating hormonal treatment and the duration of chemotherapy in node-positive breast cancer patients](https://www.ncbi.nlm.nih.gov/pubmed/7931478). Journal of Clinical Oncology, 12, 2086–2093." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "kAsZ72YYb2n3" | |
}, | |
"source": [ | |
"Let's take a look at the features/covariates." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "_OlmlI6g-X43", | |
"outputId": "1eca9943-4e79-4008-ee6e-1b4bbd70e306", | |
"scrolled": true, | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 362 | |
} | |
}, | |
"source": [ | |
"cols = [\"age\", \"estrec\", \"pnodes\", \"progrec\", \"tsize\"]\n", | |
"formatdict = {}\n", | |
"for col in cols: formatdict[col] = \"{:,.0f}\"\n", | |
"X.head(10).style.hide(axis=\"index\").format(formatdict)" | |
], | |
"execution_count": 4, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"<pandas.io.formats.style.Styler at 0x7884921ab910>" | |
], | |
"text/html": [ | |
"<style type=\"text/css\">\n", | |
"</style>\n", | |
"<table id=\"T_3e856\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr>\n", | |
" <th id=\"T_3e856_level0_col0\" class=\"col_heading level0 col0\" >age</th>\n", | |
" <th id=\"T_3e856_level0_col1\" class=\"col_heading level0 col1\" >estrec</th>\n", | |
" <th id=\"T_3e856_level0_col2\" class=\"col_heading level0 col2\" >horTh</th>\n", | |
" <th id=\"T_3e856_level0_col3\" class=\"col_heading level0 col3\" >menostat</th>\n", | |
" <th id=\"T_3e856_level0_col4\" class=\"col_heading level0 col4\" >pnodes</th>\n", | |
" <th id=\"T_3e856_level0_col5\" class=\"col_heading level0 col5\" >progrec</th>\n", | |
" <th id=\"T_3e856_level0_col6\" class=\"col_heading level0 col6\" >tgrade</th>\n", | |
" <th id=\"T_3e856_level0_col7\" class=\"col_heading level0 col7\" >tsize</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <td id=\"T_3e856_row0_col0\" class=\"data row0 col0\" >70</td>\n", | |
" <td id=\"T_3e856_row0_col1\" class=\"data row0 col1\" >66</td>\n", | |
" <td id=\"T_3e856_row0_col2\" class=\"data row0 col2\" >no</td>\n", | |
" <td id=\"T_3e856_row0_col3\" class=\"data row0 col3\" >Post</td>\n", | |
" <td id=\"T_3e856_row0_col4\" class=\"data row0 col4\" >3</td>\n", | |
" <td id=\"T_3e856_row0_col5\" class=\"data row0 col5\" >48</td>\n", | |
" <td id=\"T_3e856_row0_col6\" class=\"data row0 col6\" >II</td>\n", | |
" <td id=\"T_3e856_row0_col7\" class=\"data row0 col7\" >21</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_3e856_row1_col0\" class=\"data row1 col0\" >56</td>\n", | |
" <td id=\"T_3e856_row1_col1\" class=\"data row1 col1\" >77</td>\n", | |
" <td id=\"T_3e856_row1_col2\" class=\"data row1 col2\" >yes</td>\n", | |
" <td id=\"T_3e856_row1_col3\" class=\"data row1 col3\" >Post</td>\n", | |
" <td id=\"T_3e856_row1_col4\" class=\"data row1 col4\" >7</td>\n", | |
" <td id=\"T_3e856_row1_col5\" class=\"data row1 col5\" >61</td>\n", | |
" <td id=\"T_3e856_row1_col6\" class=\"data row1 col6\" >II</td>\n", | |
" <td id=\"T_3e856_row1_col7\" class=\"data row1 col7\" >12</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_3e856_row2_col0\" class=\"data row2 col0\" >58</td>\n", | |
" <td id=\"T_3e856_row2_col1\" class=\"data row2 col1\" >271</td>\n", | |
" <td id=\"T_3e856_row2_col2\" class=\"data row2 col2\" >yes</td>\n", | |
" <td id=\"T_3e856_row2_col3\" class=\"data row2 col3\" >Post</td>\n", | |
" <td id=\"T_3e856_row2_col4\" class=\"data row2 col4\" >9</td>\n", | |
" <td id=\"T_3e856_row2_col5\" class=\"data row2 col5\" >52</td>\n", | |
" <td id=\"T_3e856_row2_col6\" class=\"data row2 col6\" >II</td>\n", | |
" <td id=\"T_3e856_row2_col7\" class=\"data row2 col7\" >35</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_3e856_row3_col0\" class=\"data row3 col0\" >59</td>\n", | |
" <td id=\"T_3e856_row3_col1\" class=\"data row3 col1\" >29</td>\n", | |
" <td id=\"T_3e856_row3_col2\" class=\"data row3 col2\" >yes</td>\n", | |
" <td id=\"T_3e856_row3_col3\" class=\"data row3 col3\" >Post</td>\n", | |
" <td id=\"T_3e856_row3_col4\" class=\"data row3 col4\" >4</td>\n", | |
" <td id=\"T_3e856_row3_col5\" class=\"data row3 col5\" >60</td>\n", | |
" <td id=\"T_3e856_row3_col6\" class=\"data row3 col6\" >II</td>\n", | |
" <td id=\"T_3e856_row3_col7\" class=\"data row3 col7\" >17</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_3e856_row4_col0\" class=\"data row4 col0\" >73</td>\n", | |
" <td id=\"T_3e856_row4_col1\" class=\"data row4 col1\" >65</td>\n", | |
" <td id=\"T_3e856_row4_col2\" class=\"data row4 col2\" >no</td>\n", | |
" <td id=\"T_3e856_row4_col3\" class=\"data row4 col3\" >Post</td>\n", | |
" <td id=\"T_3e856_row4_col4\" class=\"data row4 col4\" >1</td>\n", | |
" <td id=\"T_3e856_row4_col5\" class=\"data row4 col5\" >26</td>\n", | |
" <td id=\"T_3e856_row4_col6\" class=\"data row4 col6\" >II</td>\n", | |
" <td id=\"T_3e856_row4_col7\" class=\"data row4 col7\" >35</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_3e856_row5_col0\" class=\"data row5 col0\" >32</td>\n", | |
" <td id=\"T_3e856_row5_col1\" class=\"data row5 col1\" >13</td>\n", | |
" <td id=\"T_3e856_row5_col2\" class=\"data row5 col2\" >no</td>\n", | |
" <td id=\"T_3e856_row5_col3\" class=\"data row5 col3\" >Pre</td>\n", | |
" <td id=\"T_3e856_row5_col4\" class=\"data row5 col4\" >24</td>\n", | |
" <td id=\"T_3e856_row5_col5\" class=\"data row5 col5\" >0</td>\n", | |
" <td id=\"T_3e856_row5_col6\" class=\"data row5 col6\" >III</td>\n", | |
" <td id=\"T_3e856_row5_col7\" class=\"data row5 col7\" >57</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_3e856_row6_col0\" class=\"data row6 col0\" >59</td>\n", | |
" <td id=\"T_3e856_row6_col1\" class=\"data row6 col1\" >0</td>\n", | |
" <td id=\"T_3e856_row6_col2\" class=\"data row6 col2\" >yes</td>\n", | |
" <td id=\"T_3e856_row6_col3\" class=\"data row6 col3\" >Post</td>\n", | |
" <td id=\"T_3e856_row6_col4\" class=\"data row6 col4\" >2</td>\n", | |
" <td id=\"T_3e856_row6_col5\" class=\"data row6 col5\" >181</td>\n", | |
" <td id=\"T_3e856_row6_col6\" class=\"data row6 col6\" >II</td>\n", | |
" <td id=\"T_3e856_row6_col7\" class=\"data row6 col7\" >8</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_3e856_row7_col0\" class=\"data row7 col0\" >65</td>\n", | |
" <td id=\"T_3e856_row7_col1\" class=\"data row7 col1\" >25</td>\n", | |
" <td id=\"T_3e856_row7_col2\" class=\"data row7 col2\" >no</td>\n", | |
" <td id=\"T_3e856_row7_col3\" class=\"data row7 col3\" >Post</td>\n", | |
" <td id=\"T_3e856_row7_col4\" class=\"data row7 col4\" >1</td>\n", | |
" <td id=\"T_3e856_row7_col5\" class=\"data row7 col5\" >192</td>\n", | |
" <td id=\"T_3e856_row7_col6\" class=\"data row7 col6\" >II</td>\n", | |
" <td id=\"T_3e856_row7_col7\" class=\"data row7 col7\" >16</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_3e856_row8_col0\" class=\"data row8 col0\" >80</td>\n", | |
" <td id=\"T_3e856_row8_col1\" class=\"data row8 col1\" >59</td>\n", | |
" <td id=\"T_3e856_row8_col2\" class=\"data row8 col2\" >no</td>\n", | |
" <td id=\"T_3e856_row8_col3\" class=\"data row8 col3\" >Post</td>\n", | |
" <td id=\"T_3e856_row8_col4\" class=\"data row8 col4\" >30</td>\n", | |
" <td id=\"T_3e856_row8_col5\" class=\"data row8 col5\" >0</td>\n", | |
" <td id=\"T_3e856_row8_col6\" class=\"data row8 col6\" >II</td>\n", | |
" <td id=\"T_3e856_row8_col7\" class=\"data row8 col7\" >39</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_3e856_row9_col0\" class=\"data row9 col0\" >66</td>\n", | |
" <td id=\"T_3e856_row9_col1\" class=\"data row9 col1\" >3</td>\n", | |
" <td id=\"T_3e856_row9_col2\" class=\"data row9 col2\" >no</td>\n", | |
" <td id=\"T_3e856_row9_col3\" class=\"data row9 col3\" >Post</td>\n", | |
" <td id=\"T_3e856_row9_col4\" class=\"data row9 col4\" >7</td>\n", | |
" <td id=\"T_3e856_row9_col5\" class=\"data row9 col5\" >0</td>\n", | |
" <td id=\"T_3e856_row9_col6\" class=\"data row9 col6\" >II</td>\n", | |
" <td id=\"T_3e856_row9_col7\" class=\"data row9 col7\" >18</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 4 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "zcMjHeAEb2n_" | |
}, | |
"source": [ | |
"Let's take a look at the output." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "h8ltRTa4_WOn", | |
"outputId": "6cc7e0ec-ff7d-43fd-df6e-78c2d1037257", | |
"scrolled": true, | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
} | |
}, | |
"source": [ | |
"y[:10]" | |
], | |
"execution_count": 5, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"array([( True, 1814.), ( True, 2018.), ( True, 712.), ( True, 1807.),\n", | |
" ( True, 772.), ( True, 448.), (False, 2172.), (False, 2161.),\n", | |
" ( True, 471.), (False, 2014.)],\n", | |
" dtype=[('cens', '?'), ('time', '<f8')])" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 5 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "A5NXlNYob2oH" | |
}, | |
"source": [ | |
"For the output, scikit-survival uses a numpy nd array, so to show it we do a dataframe." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"df_y = pd.DataFrame(data={'time': y['time'].astype(int), 'event': y['cens']})\n", | |
"df_y[:10].style.hide(axis=\"index\").highlight_min('event', color='lightgreen')" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 362 | |
}, | |
"id": "AfPvZcjJ-GwQ", | |
"outputId": "f5831c4a-7152-4268-ac31-4aeb2c9c71ac" | |
}, | |
"execution_count": 6, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"<pandas.io.formats.style.Styler at 0x78845c296230>" | |
], | |
"text/html": [ | |
"<style type=\"text/css\">\n", | |
"#T_5ca91_row6_col1, #T_5ca91_row7_col1, #T_5ca91_row9_col1 {\n", | |
" background-color: lightgreen;\n", | |
"}\n", | |
"</style>\n", | |
"<table id=\"T_5ca91\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr>\n", | |
" <th id=\"T_5ca91_level0_col0\" class=\"col_heading level0 col0\" >time</th>\n", | |
" <th id=\"T_5ca91_level0_col1\" class=\"col_heading level0 col1\" >event</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <td id=\"T_5ca91_row0_col0\" class=\"data row0 col0\" >1814</td>\n", | |
" <td id=\"T_5ca91_row0_col1\" class=\"data row0 col1\" >True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_5ca91_row1_col0\" class=\"data row1 col0\" >2018</td>\n", | |
" <td id=\"T_5ca91_row1_col1\" class=\"data row1 col1\" >True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_5ca91_row2_col0\" class=\"data row2 col0\" >712</td>\n", | |
" <td id=\"T_5ca91_row2_col1\" class=\"data row2 col1\" >True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_5ca91_row3_col0\" class=\"data row3 col0\" >1807</td>\n", | |
" <td id=\"T_5ca91_row3_col1\" class=\"data row3 col1\" >True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_5ca91_row4_col0\" class=\"data row4 col0\" >772</td>\n", | |
" <td id=\"T_5ca91_row4_col1\" class=\"data row4 col1\" >True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_5ca91_row5_col0\" class=\"data row5 col0\" >448</td>\n", | |
" <td id=\"T_5ca91_row5_col1\" class=\"data row5 col1\" >True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_5ca91_row6_col0\" class=\"data row6 col0\" >2172</td>\n", | |
" <td id=\"T_5ca91_row6_col1\" class=\"data row6 col1\" >False</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_5ca91_row7_col0\" class=\"data row7 col0\" >2161</td>\n", | |
" <td id=\"T_5ca91_row7_col1\" class=\"data row7 col1\" >False</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_5ca91_row8_col0\" class=\"data row8 col0\" >471</td>\n", | |
" <td id=\"T_5ca91_row8_col1\" class=\"data row8 col1\" >True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_5ca91_row9_col0\" class=\"data row9 col0\" >2014</td>\n", | |
" <td id=\"T_5ca91_row9_col1\" class=\"data row9 col1\" >False</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 6 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "xzW5x7ljb2oP" | |
}, | |
"source": [ | |
"One of the main challenges of survival analysis is **right censoring**, i.e., by the end of the study, the event of interest (for example, in medicine 'death of a patient' or in this dataset 'recurrence of cancer') has only occurred for a subset of the observations.\n", | |
"\n", | |
"The **right censoring** in this dataset is given by the column named 'event' and it's a variable which can take value 'True' if the patient had a recurrence of cancer or 'False' if the patient is recurrence free at the indicated time (right-censored samples)." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "VmfAR7igb2oW" | |
}, | |
"source": [ | |
"Let's see how many right-censored samples do we have." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "rzS8h1GG_o_A", | |
"outputId": "7b9af53e-91f8-48f0-93c1-7ee71dea4bb3", | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
} | |
}, | |
"source": [ | |
"print(f'Number of samples: {len(df_y)}')\n", | |
"print(f'Number of right censored samples: {len(df_y.query(\"event == False\"))}')\n", | |
"print(f'Percentage of right censored samples: {100*len(df_y.query(\"event == False\"))/len(df_y):.1f}%')" | |
], | |
"execution_count": 7, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Number of samples: 686\n", | |
"Number of right censored samples: 387\n", | |
"Percentage of right censored samples: 56.4%\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "VtsENFsnQhZx" | |
}, | |
"source": [ | |
"There are 387 patients (56.4%) who were right censored (recurrence free) at the end of the study.\n", | |
"\n", | |
"Let's divide our dataset in training and test sets." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from sklearn.preprocessing import OneHotEncoder\n", | |
"from sklearn.preprocessing import OrdinalEncoder" | |
], | |
"metadata": { | |
"id": "PV9SQ8LZ20BL" | |
}, | |
"execution_count": 8, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"X[\"horTh\"] = [1 if X[\"horTh\"].iloc[i] == 'yes' else 0 for i in range(X.shape[0])]" | |
], | |
"metadata": { | |
"id": "MxHGiw0E4-hP" | |
}, | |
"execution_count": 9, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"X[\"menostat\"] = [1 if X[\"menostat\"].iloc[i] == 'Post' else 0 for i in range(X.shape[0])]" | |
], | |
"metadata": { | |
"id": "P_R8Fr4a5JUt" | |
}, | |
"execution_count": 10, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"X[\"tgrade\"] = OrdinalEncoder(categories=[['I', 'II', 'III']]).fit_transform(X[[\"tgrade\"]])" | |
], | |
"metadata": { | |
"id": "b6ABtXNK3Dd9" | |
}, | |
"execution_count": 11, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "duYhddUr_1nH", | |
"outputId": "8e91b087-2c84-41e8-bedd-80fc729a574f", | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
} | |
}, | |
"source": [ | |
"from sklearn.model_selection import train_test_split\n", | |
"\n", | |
"X_trn, X_test, y_trn, y_test = train_test_split(X, y, random_state=20)\n", | |
"\n", | |
"print(f'Number of training samples: {len(y_trn)}')\n", | |
"print(f'Number of test samples: {len(y_test)}')" | |
], | |
"execution_count": 12, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Number of training samples: 514\n", | |
"Number of test samples: 172\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "3VEOV-vWb2ow" | |
}, | |
"source": [ | |
"We divide the features/covariates into continuous and categorical." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"X.dtypes" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "4OqMuC40mXDb", | |
"outputId": "ec0c6469-75e7-4262-e618-d327768bb17f" | |
}, | |
"execution_count": 13, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"age float64\n", | |
"estrec float64\n", | |
"horTh int64\n", | |
"menostat int64\n", | |
"pnodes float64\n", | |
"progrec float64\n", | |
"tgrade float64\n", | |
"tsize float64\n", | |
"dtype: object" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 13 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "jDjgk9PWb2o3" | |
}, | |
"source": [ | |
"We use ordinal encoding for categorical features/covariates and standard scaling for continuous features/covariates." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "N_nodxlEb2o-" | |
}, | |
"source": [ | |
"# Baseline: Cox Proportional Hazards model" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "KqdChwYJb2o_" | |
}, | |
"source": [ | |
"Cox Proportional Hazards model assumes that the log-hazard of a subject is a linear function of their $m$ static covariates/features $h_i, i\\in\\{1,\\ldots,m\\}$, and a population-level baseline hazard function $h_0(t)$ that changes over time:\n", | |
"\\begin{equation}\n", | |
"h(t|x)=h_0(t)\\exp\\left(\\sum_{i=1}^mh_i(x_i-\\bar{x_i})\\right).\n", | |
"\\end{equation}\n", | |
"\n", | |
"The term *proportional hazards* refers to the assumption of a constant relationship between the dependent variable and the regression coefficients." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "77YbwMKvAFHQ", | |
"outputId": "dbeb5e0a-6759-4792-91a9-a3a536a59699", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 74 | |
} | |
}, | |
"source": [ | |
"from sklearn.pipeline import make_pipeline\n", | |
"from sksurv.linear_model import CoxPHSurvivalAnalysis\n", | |
"from sksurv.metrics import concordance_index_censored\n", | |
"\n", | |
"cox = CoxPHSurvivalAnalysis()\n", | |
"cox.fit(X_trn, y_trn)" | |
], | |
"execution_count": 14, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"CoxPHSurvivalAnalysis()" | |
], | |
"text/html": [ | |
"<style>#sk-container-id-1 {color: black;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>CoxPHSurvivalAnalysis()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">CoxPHSurvivalAnalysis</label><div class=\"sk-toggleable__content\"><pre>CoxPHSurvivalAnalysis()</pre></div></div></div></div></div>" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 14 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"Let's now attempt to quantify how a survival curve estimated on a training set performs on a test set.\n", | |
"\n", | |
"## Survival model evaluation using the Integrated Brier Score (IBS) and the Concordance Index (C-index)" | |
], | |
"metadata": { | |
"id": "I2wAzNXar551" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"The Brier score and the C-index are measures that **assess the quality of a predicted survival curve** on a finite data sample.\n", | |
"\n", | |
"- **The Brier score is a proper scoring rule**, meaning that an estimate of the survival curve has minimal Brier score if and only if it matches the true survival probabilities induced by the underlying data generating process. In that respect the **Brier score** assesses both the **calibration** and the **ranking power** of a survival probability estimator.\n", | |
"\n", | |
"- On the other hand, the **C-index** only assesses the **ranking power**: it is invariant to a monotonic transform of the survival probabilities. It only focus on the ability of a predictive survival model to identify which individual is likely to fail first out of any pair of two individuals.\n", | |
"\n", | |
"\n", | |
"\n", | |
"It is comprised between 0 and 1 (lower is better).\n", | |
"It answers the question \"how close to the real probabilities are our estimates?\"." | |
], | |
"metadata": { | |
"id": "Gap1YWH5sAA1" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"<summary>Mathematical formulation</summary>\n", | |
" \n", | |
"$$\\mathrm{BS}^c(t) = \\frac{1}{n} \\sum_{i=1}^n I(d_i \\leq t \\land \\delta_i = 1)\n", | |
" \\frac{(0 - \\hat{S}(t | \\mathbf{x}_i))^2}{\\hat{G}(d_i)} + I(d_i > t)\n", | |
" \\frac{(1 - \\hat{S}(t | \\mathbf{x}_i))^2}{\\hat{G}(t)}$$\n", | |
" \n", | |
"In the survival analysis context, the Brier Score can be seen as the Mean Squared Error (MSE) between our probability $\\hat{S}(t)$ and our target label $\\delta_i \\in {0, 1}$, weighted by the inverse probability of censoring $\\frac{1}{\\hat{G}(t)}$. In practice we estimate $\\hat{G}(t)$ using a variant of the Kaplan-Estimator with swapped event indicator.\n", | |
"\n", | |
"- When no event or censoring has happened at $t$ yet, i.e. $I(d_i > t)$, we penalize a low probability of survival with $(1 - \\hat{S}(t|\\mathbf{x}_i))^2$.\n", | |
"- Conversely, when an individual has experienced an event before $t$, i.e. $I(d_i \\leq t \\land \\delta_i = 1)$, we penalize a high probability of survival with $(0 - \\hat{S}(t|\\mathbf{x}_i))^2$." | |
], | |
"metadata": { | |
"id": "3bmwqNQisHup" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"" | |
], | |
"metadata": { | |
"id": "CmP1ahaXsy_c" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"ci_cox = concordance_index_censored(y_test[\"cens\"], y_test[\"time\"], cox.predict(X_test))\n", | |
"print(f'The c-index of Cox is given by {ci_cox[0]:.3f}')" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "oVdrGM0NtWdR", | |
"outputId": "19ea15bc-9e45-4e8e-d0ab-ae3d590fa289" | |
}, | |
"execution_count": 15, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"The c-index of Cox is given by 0.665\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"times = np.arange(365, 1826)" | |
], | |
"metadata": { | |
"id": "zoUFRn2yqLPF" | |
}, | |
"execution_count": 16, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"survs = cox.predict_survival_function(X_test)" | |
], | |
"metadata": { | |
"id": "06i_zOUBqMUt" | |
}, | |
"execution_count": 17, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"preds = np.asarray([[fn(t) for t in times] for fn in survs])" | |
], | |
"metadata": { | |
"id": "prIyWOtMqe7s" | |
}, | |
"execution_count": 18, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from sksurv.metrics import integrated_brier_score\n", | |
"\n", | |
"integrated_brier_score(y_trn, y_test, preds, times)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "Qyvn1TexqkoO", | |
"outputId": "7042880a-70a3-40a6-940f-36a51a0fb246" | |
}, | |
"execution_count": 19, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"0.17509710701666106" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 19 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"!pip install -q shap\n", | |
"import shap\n", | |
"explainer = shap.Explainer(cox.predict, X_trn)\n", | |
"shap_values = explainer(X_test[:100])\n", | |
"shap.plots.waterfall(shap_values[0])" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 540 | |
}, | |
"id": "J03T1z80N8fg", | |
"outputId": "2bc340fd-dd5e-484a-d887-bf48eeed72b0" | |
}, | |
"execution_count": 20, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 800x550 with 3 Axes>" | |
], | |
"image/png": "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iKg5Y7JA1MDOnDkDQD9Z6NOnDwDg1KlTBsnCb7/9hldeeQXvvPMO5s+fj8TERHz++ed47bXXjE6Ijo6OxsyZM2uMoT7mLAQEBCAuLg4XL15EeHg4AO0n/vHx8fDy8tLNv1CpVCgqKoKNjU2d95Bwc3PDgw8+aFB+8uRJVFZWom/fvnBycqrxGsnJycjMzETv3r1rHJpFREREtWOyQNTA4uLi4OfnpzeUKCAgAGFhYdizZ4/efgqnT5/GzJkzMXPmTLz22msAgJdeeglffvml0d6F06dPIycnR7cRWXXqY86Cl5cXAgICcOLECZSWlsLZ2RkJCQkoLCzEoEGDdPUyMjLw+++/o2vXrujevbveNc6dO4eKigrdEKNr167phjaFhYXBxsYGbdu2NWj77NmzAGBwLC0tDdHR0bq9FjIyMhAfH49WrVohLCzsvp4vERERMVkganBxcXFGhxrNmTMHb7zxBkpLS2Fra4uUlBSMHTsWXbp0werVq3X1fH19MWfOHHz99dcGvQsbN25E69atMXTo0EZ5LoMHD4aDgwMSExNRUVEBNzc3jBgxAj4+PiadHxcXp7d529WrV3H16lUAQFBQkMEeDrWxt7eHIAiIi4tDZWUlHB0d0aNHD3Tq1MnovAsiIiKqG0GsbgcmImpQ+fn5CAgIwIcffojHH3+8zueXl5ejbdu2eOWVV/Dcc881QIRERETU3PGjNyKJODs746WXXsLy5cuh0WjqfP53330HS0tL3W7QRERERPWNPQtERERERGQUexaIiIiIiMgoJgtERERERGQUkwUiIiIiIjKKyQIRERERERnFZIGIiIiIiIxiskAkIwUFBRg8eDAKCgqkDoWIiIiIyQKRnBQUFODAgQNMFoiIiEgWmCwQEREREZFRTBaIiIiIiMgoJgtERERERGQUkwUiGXFyckKfPn3g5OQkdShEREREEERRFKUOgohuKyoqgoODg9RhEBEREbFngUhusrKypA6BiIiICACTBSLZycvLkzoEIiIiIgBMFohkx8LCQuoQiIiIiABwzgIREREREVWDPQtEMnPmzBmpQyAiIiICwGSBSHbY2UdERERywWSBSGbc3d2lDoGIiIgIAJMFItnhhmxEREQkF0wWiGTmypUrUodAREREBIDJAhERERERVYNLpxLJTEFBAYciERERkSywZ4FIZriDMxEREckF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\n" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"X.describe().transpose().round(2).drop(columns=\"count\")" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 300 | |
}, | |
"id": "-s0v-Yx5N_3o", | |
"outputId": "d872a1e2-5c87-4cfb-803f-a3a5e846d11f" | |
}, | |
"execution_count": 21, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
" mean std min 25% 50% 75% max\n", | |
"age 53.05 10.12 21.0 46.0 53.0 61.00 80.0\n", | |
"estrec 96.25 153.08 0.0 8.0 36.0 114.00 1144.0\n", | |
"horTh 0.36 0.48 0.0 0.0 0.0 1.00 1.0\n", | |
"menostat 0.58 0.49 0.0 0.0 1.0 1.00 1.0\n", | |
"pnodes 5.01 5.48 1.0 1.0 3.0 7.00 51.0\n", | |
"progrec 110.00 202.33 0.0 7.0 32.5 131.75 2380.0\n", | |
"tgrade 1.12 0.58 0.0 1.0 1.0 1.00 2.0\n", | |
"tsize 29.33 14.30 3.0 20.0 25.0 35.00 120.0" | |
], | |
"text/html": [ | |
"\n", | |
" <div id=\"df-219003f2-8249-4967-887f-11a49065d107\" class=\"colab-df-container\">\n", | |
" <div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>mean</th>\n", | |
" <th>std</th>\n", | |
" <th>min</th>\n", | |
" <th>25%</th>\n", | |
" <th>50%</th>\n", | |
" <th>75%</th>\n", | |
" <th>max</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>age</th>\n", | |
" <td>53.05</td>\n", | |
" <td>10.12</td>\n", | |
" <td>21.0</td>\n", | |
" <td>46.0</td>\n", | |
" <td>53.0</td>\n", | |
" <td>61.00</td>\n", | |
" <td>80.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>estrec</th>\n", | |
" <td>96.25</td>\n", | |
" <td>153.08</td>\n", | |
" <td>0.0</td>\n", | |
" <td>8.0</td>\n", | |
" <td>36.0</td>\n", | |
" <td>114.00</td>\n", | |
" <td>1144.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>horTh</th>\n", | |
" <td>0.36</td>\n", | |
" <td>0.48</td>\n", | |
" <td>0.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>1.00</td>\n", | |
" <td>1.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>menostat</th>\n", | |
" <td>0.58</td>\n", | |
" <td>0.49</td>\n", | |
" <td>0.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>1.00</td>\n", | |
" <td>1.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>pnodes</th>\n", | |
" <td>5.01</td>\n", | |
" <td>5.48</td>\n", | |
" <td>1.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>3.0</td>\n", | |
" <td>7.00</td>\n", | |
" <td>51.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>progrec</th>\n", | |
" <td>110.00</td>\n", | |
" <td>202.33</td>\n", | |
" <td>0.0</td>\n", | |
" <td>7.0</td>\n", | |
" <td>32.5</td>\n", | |
" <td>131.75</td>\n", | |
" <td>2380.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>tgrade</th>\n", | |
" <td>1.12</td>\n", | |
" <td>0.58</td>\n", | |
" <td>0.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>1.00</td>\n", | |
" <td>2.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>tsize</th>\n", | |
" <td>29.33</td>\n", | |
" <td>14.30</td>\n", | |
" <td>3.0</td>\n", | |
" <td>20.0</td>\n", | |
" <td>25.0</td>\n", | |
" <td>35.00</td>\n", | |
" <td>120.0</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>\n", | |
" <div class=\"colab-df-buttons\">\n", | |
"\n", | |
" <div class=\"colab-df-container\">\n", | |
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-219003f2-8249-4967-887f-11a49065d107')\"\n", | |
" title=\"Convert this dataframe to an interactive table.\"\n", | |
" style=\"display:none;\">\n", | |
"\n", | |
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n", | |
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n", | |
" </svg>\n", | |
" </button>\n", | |
"\n", | |
" <style>\n", | |
" .colab-df-container {\n", | |
" display:flex;\n", | |
" gap: 12px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert {\n", | |
" background-color: #E8F0FE;\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: #1967D2;\n", | |
" height: 32px;\n", | |
" padding: 0 0 0 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert:hover {\n", | |
" background-color: #E2EBFA;\n", | |
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: #174EA6;\n", | |
" }\n", | |
"\n", | |
" .colab-df-buttons div {\n", | |
" margin-bottom: 4px;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert {\n", | |
" background-color: #3B4455;\n", | |
" fill: #D2E3FC;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert:hover {\n", | |
" background-color: #434B5C;\n", | |
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n", | |
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n", | |
" fill: #FFFFFF;\n", | |
" }\n", | |
" </style>\n", | |
"\n", | |
" <script>\n", | |
" const buttonEl =\n", | |
" document.querySelector('#df-219003f2-8249-4967-887f-11a49065d107 button.colab-df-convert');\n", | |
" buttonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
"\n", | |
" async function convertToInteractive(key) {\n", | |
" const element = document.querySelector('#df-219003f2-8249-4967-887f-11a49065d107');\n", | |
" const dataTable =\n", | |
" await google.colab.kernel.invokeFunction('convertToInteractive',\n", | |
" [key], {});\n", | |
" if (!dataTable) return;\n", | |
"\n", | |
" const docLinkHtml = 'Like what you see? Visit the ' +\n", | |
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n", | |
" + ' to learn more about interactive tables.';\n", | |
" element.innerHTML = '';\n", | |
" dataTable['output_type'] = 'display_data';\n", | |
" await google.colab.output.renderOutput(dataTable, element);\n", | |
" const docLink = document.createElement('div');\n", | |
" docLink.innerHTML = docLinkHtml;\n", | |
" element.appendChild(docLink);\n", | |
" }\n", | |
" </script>\n", | |
" </div>\n", | |
"\n", | |
"\n", | |
"<div id=\"df-e3611107-f6c5-45e6-ad1c-b101e98fa6aa\">\n", | |
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-e3611107-f6c5-45e6-ad1c-b101e98fa6aa')\"\n", | |
" title=\"Suggest charts.\"\n", | |
" style=\"display:none;\">\n", | |
"\n", | |
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n", | |
" width=\"24px\">\n", | |
" <g>\n", | |
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n", | |
" </g>\n", | |
"</svg>\n", | |
" </button>\n", | |
"\n", | |
"<style>\n", | |
" .colab-df-quickchart {\n", | |
" --bg-color: #E8F0FE;\n", | |
" --fill-color: #1967D2;\n", | |
" --hover-bg-color: #E2EBFA;\n", | |
" --hover-fill-color: #174EA6;\n", | |
" --disabled-fill-color: #AAA;\n", | |
" --disabled-bg-color: #DDD;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-quickchart {\n", | |
" --bg-color: #3B4455;\n", | |
" --fill-color: #D2E3FC;\n", | |
" --hover-bg-color: #434B5C;\n", | |
" --hover-fill-color: #FFFFFF;\n", | |
" --disabled-bg-color: #3B4455;\n", | |
" --disabled-fill-color: #666;\n", | |
" }\n", | |
"\n", | |
" .colab-df-quickchart {\n", | |
" background-color: var(--bg-color);\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: var(--fill-color);\n", | |
" height: 32px;\n", | |
" padding: 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-quickchart:hover {\n", | |
" background-color: var(--hover-bg-color);\n", | |
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: var(--button-hover-fill-color);\n", | |
" }\n", | |
"\n", | |
" .colab-df-quickchart-complete:disabled,\n", | |
" .colab-df-quickchart-complete:disabled:hover {\n", | |
" background-color: var(--disabled-bg-color);\n", | |
" fill: var(--disabled-fill-color);\n", | |
" box-shadow: none;\n", | |
" }\n", | |
"\n", | |
" .colab-df-spinner {\n", | |
" border: 2px solid var(--fill-color);\n", | |
" border-color: transparent;\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" animation:\n", | |
" spin 1s steps(1) infinite;\n", | |
" }\n", | |
"\n", | |
" @keyframes spin {\n", | |
" 0% {\n", | |
" border-color: transparent;\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" border-left-color: var(--fill-color);\n", | |
" }\n", | |
" 20% {\n", | |
" border-color: transparent;\n", | |
" border-left-color: var(--fill-color);\n", | |
" border-top-color: var(--fill-color);\n", | |
" }\n", | |
" 30% {\n", | |
" border-color: transparent;\n", | |
" border-left-color: var(--fill-color);\n", | |
" border-top-color: var(--fill-color);\n", | |
" border-right-color: var(--fill-color);\n", | |
" }\n", | |
" 40% {\n", | |
" border-color: transparent;\n", | |
" border-right-color: var(--fill-color);\n", | |
" border-top-color: var(--fill-color);\n", | |
" }\n", | |
" 60% {\n", | |
" border-color: transparent;\n", | |
" border-right-color: var(--fill-color);\n", | |
" }\n", | |
" 80% {\n", | |
" border-color: transparent;\n", | |
" border-right-color: var(--fill-color);\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" }\n", | |
" 90% {\n", | |
" border-color: transparent;\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" }\n", | |
" }\n", | |
"</style>\n", | |
"\n", | |
" <script>\n", | |
" async function quickchart(key) {\n", | |
" const quickchartButtonEl =\n", | |
" document.querySelector('#' + key + ' button');\n", | |
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n", | |
" quickchartButtonEl.classList.add('colab-df-spinner');\n", | |
" try {\n", | |
" const charts = await google.colab.kernel.invokeFunction(\n", | |
" 'suggestCharts', [key], {});\n", | |
" } catch (error) {\n", | |
" console.error('Error during call to suggestCharts:', error);\n", | |
" }\n", | |
" quickchartButtonEl.classList.remove('colab-df-spinner');\n", | |
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n", | |
" }\n", | |
" (() => {\n", | |
" let quickchartButtonEl =\n", | |
" document.querySelector('#df-e3611107-f6c5-45e6-ad1c-b101e98fa6aa button');\n", | |
" quickchartButtonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
" })();\n", | |
" </script>\n", | |
"</div>\n", | |
" </div>\n", | |
" </div>\n" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 21 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"shap.plots.beeswarm(shap_values)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 453 | |
}, | |
"id": "0kbYd1wAODT9", | |
"outputId": "1c9aa6ea-f435-4c32-c143-ad0f6f71b61f" | |
}, | |
"execution_count": 22, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 800x470 with 2 Axes>" | |
], | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtcAAAG0CAYAAAD5Bgs0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACIM0lEQVR4nOzdd3xTZfvH8c9Juhctu+y9QRBkiNQFiECR7WTpj6Eo7u2joD4qLlBkOZg+LhBkKAoqshVlKA62rLJbSvdIcn5/lKaEpKWU7n7fr1decO6c3Pd9kra5cuU69zFM0zQREREREZHLZinqCYiIiIiIlBYKrkVERERE8omCaxERERGRfKLgWkREREQknyi4FhERERHJJwquRURERETyiYJrEREREZF8ouBaRERERCSfKLgWEREREcknCq5FREREpECMHz+eoKCgi9534MABDMNg4cKFl9R/Xh9XkLyKegIiIiIiUraFh4ezadMmGjVqVNRTuWwKrkVERESkSPn6+tKxY8einka+UFmIiIiIiBQpT+UdaWlpjBs3jvLlyxMaGsro0aP55JNPMAyDAwcOuDw+JSWF+++/n7CwMMLDw3nsscew2WyFfBQZFFyLiIiISIGy2WxuN4fDkeNjnnrqKWbOnMmTTz7J559/jsPh4KmnnvK477PPPovFYuGLL75gzJgxvPXWW3z44YcFcSgXpbIQERERESkwiYmJeHt7e7wvMDDQY3tMTAzTp0/nueee48knnwTgpptuomvXrhw+fNht/w4dOvDuu+8C0K1bN1avXs3ChQsZM2ZMPh1F7im4FhERyWfp6enMnj0bgBEjRmQbWIiUSEZ/9zZzUba7+/v7s3btWrf2999/n08++cTjY3bs2EFKSgp9+vRxab/lllv44Ycf3Pbv3r27y3azZs348ccfs51TQVJwLSIiIiKXwLikvS0WC+3atXNrX758ebaPOXbsGACVKlVyaa9cubLH/UNDQ122fXx8SElJuaR55hfVXIuIiIhIsRIeHg7AqVOnXNpPnjxZFNO5JAquRUREROQSGB5u+atFixb4+fmxZMkSl/avvvoq38fKbyoLEREREZFLkP/B9IUqVKjAvffey3//+1/8/Pxo3bo1CxYsYPfu3UBGqUlxVXxnJiIiIiLFUMFnrgFee+01Ro0axauvvsqgQYNIT093LsVXrly5Ahkz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x9atWxk9ejSpqaluYy5atIhXX32Vli1bcvfdd+Pv788vv/zCa6+9RlRUFA8++GA+P2siIpJrJT74VXQtRUtlIDkrdmUhDRs2pFWrVgB06NCBnj170rNnT1q1asXcuXM5ceIEL7zwAo8//jgDBw7kv//9L127diU2NtZjf/v37+eNN97gkUceoV+/fvTr1w/IyDwvWbKERx55hMGDB3PHHXcwZcoUbr75ZpYsWcLp06edfcybN4+jR4/y7LPP8uSTTzJo0CBeffVVbrjhBrdxT58+zZtvvkn37t2ZNWsWQ4cOZdCgQbz55pvcdttt/O9//+PIEQ9FgEUkJibG5QNCQkIC8fHxzu20tDSio6NdHnPs2LEct48fP45pZr17aQyNoTE0RlGN4SmSPr8lf8bI2cmTJ/N5DLPEvh4aI//GKFqGh5tkMszzX/1iYtmyZUyYMIEZM2bQrl07Z/vAgQNJSEjgm2++wWLJ+lwQExND9+7dufLKK93KQho1asQnn3yS43jp6ekkJSVhmiYbN27k+eef5+233yYiIgKAQYMGERcXxzfffONSLnL69Gl69OjhMu5nn33Gm2++ybRp02jUqJHLOLt27WLs2LE888wz9O/fP+9PkIiI5Irxps2tzduAtEfz54vbjxos8jAoDP07ktmzZwMwYsQIvL298zaAkc17helhXJFCssWY7tbW1ry3CGZSPBW7spCcHD16lObNm7sE1gDly5cnODjY42Nq1arlsd1mszFnzhy++eYbDh8+zIWfMeLi4pz/j4qKolmzZm512BUrVnQb98CBAwDcd9992R5HTExBn00jIiLZMQo6yVbg/StLKFKclajgOi/8/Pw8tk+aNInPP/+cbt26cffddxMWFoaXlxc7d+5kypQpbsF2bmU+bsKECVSsWNHjPtWrV89T3yIicvnK+RbwAAUe+xa7L5yljNFPYM6KZXBtZPOpPDw8nMOHD+NwONzKQs6vXcqNb775hiuvvJJXX33Vpf3w4cNu+1avXp3Dhw9jt9vdykIuHLdmzZoAhIaG0qFDh0uak4iI5K9Ar4wLyJxveIsCHrSgIw8v68X3ESlAOqExZ8XuhEYAf39/wLU0AyAiIoLTp0/z3XffubTPnz//ksewWCxu2enk5GSP9dnXXnst0dHRfP311y7tc+fOddu3W7du+Pj4MHPmTFJSUtzuT0hIIC0t7ZLnKyIil+6LSAvW8+KAhqHwYucSFJx6CqSb1ij8eYhIrhXLzHVmXfWsWbOIi4vD39+f6tWrM2zYML799lsmTJjAX3/9RZ06ddi2bRt//PEHoaGh2Wa8PbnxxhtZtGgRTz/9NO3btyc6Opply5ZRrlw5t32HDh3Kt99+y3//+1/++ecf6tevz5YtW5zjnq9KlSo89dRTvPzyywwaNIiePXsSHh7OmTNn2Lt3Lz/99BMLFiygWrVql/s0iYjIRfSsb+HYvQbf/mtSJRC61jawlKSa5Sf6witfZm0bwAc6cUyKVmkpC4mKimLt2rWcPHmSAQMGUKNGDex2O2fPnqVcuXJu59rlVrEMrqtWrcrzzz/P3Llzee2117DZbM6LyHz44YdMnjyZpUuXYhgGbdu2ZcaMGQwdOhRf39wX0j3yyCMEBgayatUq1qxZQ5UqVejXrx/NmjVzOxkxJCSEDz/8kLfffptvvvkGyFjKb+bMmdx7r/sfuT59+lCrVi0+/vhjFi1aRHx8PKGhodSuXZt7772XChUqXN4TJCIiuVYpwGBI8xIUUJ/vv3dCo2owbQWEBcGLt0P7hkU9KynjHCW8LMQ0TR599FHee+89bDYbhmHQsmVLatSoQUJCAnXq1OHFF1/koYceylP/xXIpvksVGxtL165d6d+/P88880xRT0dERMoIj0vxWWDoX/m0FJ9IMbTJeN+trZM5qghmkjevv/46Tz/9NE8++SQ33ngj3bp14/vvv+eGG24AYPjw4ezbt49169blqf9iWXOdE091zJm1zzqBUERERERy8sEHHzB06FBeeeUVWrdu7XZ/q1at2L17d577L5ZlITl58MEHCQ8Pp0mTJjgcDn799VfWrVtHq1atuO6664p6eiIiIiKlWkkveTh8+DBXX311tvcHBga6LapxKUpccN2lSxe+/vprVq9eTWpqKlWqVOGuu+5i5MiReS48FxERyTeOop6ASMEq6UvxVa5c2ePSy5m2bNmS7UUIc6PEBdd33XUXd911V1FPQ0RExLOSHXeIlHr9+/dnxowZDB8+3LlKXOaKcytXrmTOnDk88cQTee6/xNVci4iIFGeGRdG1lG4mhtutJJkwYQLh4eG0bt2aoUOHYhgGEydO5JprruHmm2+mVatWl7VAhoJrERGRfOQTopVBpHQzPdxKknLlyvHzzz/zxBNPEBUVhZ+fH2vWrCE2NpYXXniBdevWERAQkOf+S1xZiIiISHERUNWPpOOuq1g1vateEc1GRHLL39+f5557jueeey7f+1bmWkREJI9unnsNvqFZmerwTpVoM7ZJEc5IpOCV9LKQgqbMtYiISB6F1g/hjl96c3rHGXxDfShXJwgAe7q9iGcmUnBKejB99913X3QfwzD46KOP8tS/gmsREZHLYLEaVG5dvqinIVJoSlqN9YV+/PFH5+ogmex2O8eOHcNut1OpUiUCAwPz3L+CaxEREREpMw4cOOCxPT09nZkzZzJ58mRWrVqV5/5Vcy0iIiIiuVZaa669vb25//776d69O/fff3+e+1FwLSIiIiK5VtKX4ruYK664grVr1+b58QquRURERETOWbVqlda5FhERKSlM0+TAWagSCAHepePrdClbSnoZyIsvvuixPTY2lrVr17J161aeeuqpPPev4FpERKSQ/HbcQc8vHZxKBh8LvHC1wTMdrUU9LZFLUtKD6/Hjx3tsDwsLo379+syYMYORI0fmuX8F1yIiIoXkus8dJKZn/D/NAc+uN+lR18GVVVSlKSWHo6gncJkcjoI9Av02i4iIFIJ/TtudgfX5nllX0kMVETmfMtciIiKF4Gii5zUV/jxVyBMRuUympWSVhRw6dChPj6tVq1aeHqfgWkREpBAY2axXpiulS0ljlqzYmjp16rhdkTE37Pa8/XIquBYRESkE2b21GyrQFClQs2bNylNwnVcKrkVERC50JgEGvwk/7oAQf3j5Thh782V1mW22r7RdgUNKvZJWFjJ8+PBCHU+fl0VERC50w/Pw/R/gMCE2Ce7/AH7447K6zC6GNhVcSwljWtxvkkWZaxERkQttP+De9tAs2DE5z11mF39YFJhICWNaS1bmOjsbNmxg69atnD171m15PsMw+M9//pOnfhVci4iI5MbeY5f3+Gwy1EpcixSumJgYevXqxebNmzFNE8MwMM99hZT5/8sJrkvk5+Vly5bRrl07fvvtt6KeikfFfX4iIpIH9stbj9qhmmspJRwWw+1Wkjz++OP88ccffPLJJ+zfvx/TNPnuu+/YvXs3Y8aMoXXr1hw9ejTP/StzfRFHjx6lT58+ud5fAbWIiHhiyS6ILllxiUiJr7H+5ptvGD16NLfeeivR0dEAWCwWGjRowNSpU+nfvz8PPfQQn376aZ76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icd9P/jgA5o0aYKvry8NGjRg8uTJ2ZYsnD17lieffJIGDRrg6+tLpUqVuP32291ew0uV2+c5p/MWDMNg+PDhQMbPbd26dYGMJEDma575u3b+79enn35Kq1at8PPzo1atWowfPx6bzebSd25/T3Pzs2YYBjfddBPffvstCQkJl/hMiZQMylyL5FH9+vXZtWsXixYton///rl6jN1uz7amOjU1NdvHffTRR9StW5cuXbpgGAZt2rRh1qxZ/N///V+u57tnzx4AKlasmO0+t912Gw8//DDz5s2jT58+Lvf98MMPREVFOctNIOPNNCYmhqFDh1KjRg2ioqL48MMPufHGG1m9enWOpSt5MWTIED799FMGDhzIiBEjSE1N5X//+x/dunVj0aJFbnO+0JYtW0hISKB9+/aXNO7UqVM5c+YM//d//4efnx/vvvsu/fr1Y8GCBYwcOZLbb7+dvn37snLlSqZMmULlypV57rnnXPpITEzkuuuuo0OHDrz66qvs2bOHadOm8fPPP7Nt2zbnh7G0tDTeeOMNBgwYwC233EJgYCC//vorH330EevXr3cr63n22Wd55ZVXaNasGQ8//DDh4eHs27ePL7/8khdffJGIiAieeeYZXnnlFUaNGuV8TapUqZLjMR88eJD27dtz9uxZ7rvvPho2bMhPP/3Eq6++yoYNG/jhhx/w8nJ9Cxk2bBje3t489thjpKWlMXnyZPr27cvu3bs9BmeePPXUU9jtdh588EHS0tJ466236N69O/PmzeOee+5h1KhR3HnnnXzxxRc8//zz1K1b1+VbmmnTpjF27FiaNGnC888/D2T8nPbt25eZM2cyatQo576TJ0/m4Ycf5oorruCVV14hKSmJN998k8qVK7vN6+zZs1x99dUcOnSIu+++m+bNm3Ps2DGmTZtGhw4d+O2336hdu3aujvFyn+eLadq0KZMmTeLhhx+mX79+zr9PQUFBLvstXbqU/fv3M3bsWKpWrcrSpUuZMGECBw8eZPbs2Zd8LLn9WevUqRMzZ85k/fr19OjR45LHESn2TBHJk40bN5re3t4mYDZs2NAcMWKEOW3aNPPvv//2uH/t2rVN4KK3U6dOuTwuKirKtFqt5gsvvOBsmzx5sgl4HAswu3fvbp46dco8deqUuXv3bvPtt982vb29zXLlypknTpzI8bgGDhxo+vr6mjExMS7t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\n" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "ZNHQ-bkWALNy", | |
"outputId": "3a63b8c0-5ce3-4c82-f22b-dfd4325c5fdd", | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
} | |
}, | |
"source": [ | |
"from scipy.stats import reciprocal\n", | |
"from sklearn.model_selection import RandomizedSearchCV\n", | |
"\n", | |
"param_distributions = {\n", | |
" 'alpha': reciprocal(0.1, 100),\n", | |
"}\n", | |
"\n", | |
"model_random_search = RandomizedSearchCV(\n", | |
" cox, param_distributions=param_distributions, n_iter=50, n_jobs=-1, cv=3, random_state=42)\n", | |
"model_random_search.fit(X_trn, y_trn)\n", | |
"\n", | |
"print(\n", | |
" f\"The c-index of Cox using a {model_random_search.__class__.__name__} is \"\n", | |
" f\"{model_random_search.score(X_test, y_test):.3f}\")\n", | |
"print(\n", | |
" f\"The best set of parameters is: {model_random_search.best_params_}\"\n", | |
")" | |
], | |
"execution_count": 23, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"The c-index of Cox using a RandomizedSearchCV is 0.660\n", | |
"The best set of parameters is: {'alpha': 39.67605077052987}\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "MrhAveCQAdxF", | |
"outputId": "75475cd8-1ec8-4df1-ec0a-2ff2d00038d4", | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
} | |
}, | |
"source": [ | |
"alpha = model_random_search.best_params_['alpha']\n", | |
"cox_best = make_pipeline(CoxPHSurvivalAnalysis(alpha=alpha))\n", | |
"cox_best.fit(X_trn, y_trn)\n", | |
"\n", | |
"ci_cox = concordance_index_censored(y_test[\"cens\"], y_test[\"time\"], cox_best.predict(X_test))\n", | |
"print(f'The c-index of Cox is given by {ci_cox[0]:.3f}')" | |
], | |
"execution_count": 24, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"The c-index of Cox is given by 0.660\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from sksurv.ensemble import RandomSurvivalForest" | |
], | |
"metadata": { | |
"id": "s34_kkDKKzw5" | |
}, | |
"execution_count": 27, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"rsf = RandomSurvivalForest(\n", | |
" n_estimators=100, min_samples_leaf=15, n_jobs=-1, random_state=20\n", | |
")\n", | |
"rsf.fit(X_trn, y_trn)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 91 | |
}, | |
"id": "vU06jwE7Kuec", | |
"outputId": "e3cc5cf0-0655-46f6-91ea-d74ed12d6c5b" | |
}, | |
"execution_count": 28, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"RandomSurvivalForest(min_samples_leaf=15, min_samples_split=10, n_jobs=-1,\n", | |
" random_state=20)" | |
], | |
"text/html": [ | |
"<style>#sk-container-id-2 {color: black;}#sk-container-id-2 pre{padding: 0;}#sk-container-id-2 div.sk-toggleable {background-color: white;}#sk-container-id-2 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-2 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-2 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-2 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-2 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-2 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-2 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-2 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-2 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-2 div.sk-item {position: relative;z-index: 1;}#sk-container-id-2 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-2 div.sk-item::before, #sk-container-id-2 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-2 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-2 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-2 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-2 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-2 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-2 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-2 div.sk-label-container {text-align: center;}#sk-container-id-2 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-2 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomSurvivalForest(min_samples_leaf=15, min_samples_split=10, n_jobs=-1,\n", | |
" random_state=20)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">RandomSurvivalForest</label><div class=\"sk-toggleable__content\"><pre>RandomSurvivalForest(min_samples_leaf=15, min_samples_split=10, n_jobs=-1,\n", | |
" random_state=20)</pre></div></div></div></div></div>" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 28 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"rsf.score(X_test, y_test)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "LJ0Tp63pKvMJ", | |
"outputId": "908b6916-2562-4533-ab15-853054aab6c8" | |
}, | |
"execution_count": 29, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"0.6716457023060797" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 29 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"ci_cox = concordance_index_censored(y_test[\"cens\"], y_test[\"time\"], rsf.predict(X_test))\n", | |
"print(f'The c-index of Cox is given by {ci_cox[0]:.3f}')" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "Y1hNGO_QO2pW", | |
"outputId": "93786c36-160e-4b80-fd59-c779879fff39" | |
}, | |
"execution_count": 30, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"The c-index of Cox is given by 0.672\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"times = np.arange(365, 1826)" | |
], | |
"metadata": { | |
"id": "XHsIhuW7PHik" | |
}, | |
"execution_count": 31, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"survs = rsf.predict_survival_function(X_test)" | |
], | |
"metadata": { | |
"id": "iSZ0pa17PSJS" | |
}, | |
"execution_count": 32, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"preds = np.asarray([[fn(t) for t in times] for fn in survs])" | |
], | |
"metadata": { | |
"id": "np-god8mPW5W" | |
}, | |
"execution_count": 33, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"integrated_brier_score(y_trn, y_test, preds, times)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "U1avp5nfPaOS", | |
"outputId": "b1e50567-5ccd-40a5-9f19-b3aeb70881ee" | |
}, | |
"execution_count": 34, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"0.17751179194838101" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 34 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"param_distributions = {\n", | |
" 'min_samples_leaf': [3, 7, 15],\n", | |
" 'max_depth': [3, 7, None]\n", | |
"}\n", | |
"\n", | |
"model_random_search = RandomizedSearchCV(\n", | |
" rsf, param_distributions=param_distributions, n_iter=50, n_jobs=-1, cv=3, random_state=42)\n", | |
"model_random_search.fit(X_trn, y_trn)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 134 | |
}, | |
"id": "QjiQ8TfBPfZg", | |
"outputId": "5438c05e-b20d-4cb7-f05d-b93740c08857" | |
}, | |
"execution_count": 35, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stderr", | |
"text": [ | |
"The total space of parameters 9 is smaller than n_iter=50. Running 9 iterations. For exhaustive searches, use GridSearchCV.\n" | |
] | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"RandomizedSearchCV(cv=3,\n", | |
" estimator=RandomSurvivalForest(min_samples_leaf=15,\n", | |
" min_samples_split=10,\n", | |
" n_jobs=-1, random_state=20),\n", | |
" n_iter=50, n_jobs=-1,\n", | |
" param_distributions={'max_depth': [3, 7, None],\n", | |
" 'min_samples_leaf': [3, 7, 15]},\n", | |
" random_state=42)" | |
], | |
"text/html": [ | |
"<style>#sk-container-id-3 {color: black;}#sk-container-id-3 pre{padding: 0;}#sk-container-id-3 div.sk-toggleable {background-color: white;}#sk-container-id-3 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-3 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-3 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-3 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-3 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-3 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-3 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-3 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-3 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-3 div.sk-item {position: relative;z-index: 1;}#sk-container-id-3 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-3 div.sk-item::before, #sk-container-id-3 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-3 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-3 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-3 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-3 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-3 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-3 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-3 div.sk-label-container {text-align: center;}#sk-container-id-3 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-3 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomizedSearchCV(cv=3,\n", | |
" estimator=RandomSurvivalForest(min_samples_leaf=15,\n", | |
" min_samples_split=10,\n", | |
" n_jobs=-1, random_state=20),\n", | |
" n_iter=50, n_jobs=-1,\n", | |
" param_distributions={'max_depth': [3, 7, None],\n", | |
" 'min_samples_leaf': [3, 7, 15]},\n", | |
" random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">RandomizedSearchCV</label><div class=\"sk-toggleable__content\"><pre>RandomizedSearchCV(cv=3,\n", | |
" estimator=RandomSurvivalForest(min_samples_leaf=15,\n", | |
" min_samples_split=10,\n", | |
" n_jobs=-1, random_state=20),\n", | |
" n_iter=50, n_jobs=-1,\n", | |
" param_distributions={'max_depth': [3, 7, None],\n", | |
" 'min_samples_leaf': [3, 7, 15]},\n", | |
" random_state=42)</pre></div></div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" ><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">estimator: RandomSurvivalForest</label><div class=\"sk-toggleable__content\"><pre>RandomSurvivalForest(min_samples_leaf=15, min_samples_split=10, n_jobs=-1,\n", | |
" random_state=20)</pre></div></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" ><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">RandomSurvivalForest</label><div class=\"sk-toggleable__content\"><pre>RandomSurvivalForest(min_samples_leaf=15, min_samples_split=10, n_jobs=-1,\n", | |
" random_state=20)</pre></div></div></div></div></div></div></div></div></div></div>" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 35 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"model_random_search.score(X_test, y_test)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "_X2klnTmQVXX", | |
"outputId": "b15bfb3d-130b-463a-831b-a82dca36fa6a" | |
}, | |
"execution_count": 36, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"0.6805555555555556" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 36 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"print(\n", | |
" f\"The best set of parameters is: {model_random_search.best_params_}\"\n", | |
")" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "6Mam6JN2Qqh3", | |
"outputId": "6d5ba74e-d207-4fb6-9d9b-084774b76174" | |
}, | |
"execution_count": 38, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"The best set of parameters is: {'min_samples_leaf': 15, 'max_depth': 3}\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"rsf_best = RandomSurvivalForest(\n", | |
" n_estimators=100, min_samples_leaf=15, max_depth=3, n_jobs=-1, random_state=20\n", | |
")\n", | |
"rsf_best.fit(X_trn, y_trn)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 91 | |
}, | |
"id": "PbSNPjgQQruO", | |
"outputId": "c0218816-d654-48f5-c9f8-24e7ba37c443" | |
}, | |
"execution_count": 40, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"RandomSurvivalForest(max_depth=3, min_samples_leaf=15, n_jobs=-1,\n", | |
" random_state=20)" | |
], | |
"text/html": [ | |
"<style>#sk-container-id-5 {color: black;}#sk-container-id-5 pre{padding: 0;}#sk-container-id-5 div.sk-toggleable {background-color: white;}#sk-container-id-5 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-5 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-5 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-5 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-5 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-5 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-5 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-5 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-5 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-5 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-5 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-5 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-5 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-5 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-5 div.sk-item {position: relative;z-index: 1;}#sk-container-id-5 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-5 div.sk-item::before, #sk-container-id-5 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-5 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-5 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-5 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-5 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-5 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-5 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-5 div.sk-label-container {text-align: center;}#sk-container-id-5 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-5 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-5\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomSurvivalForest(max_depth=3, min_samples_leaf=15, n_jobs=-1,\n", | |
" random_state=20)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-7\" type=\"checkbox\" checked><label for=\"sk-estimator-id-7\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">RandomSurvivalForest</label><div class=\"sk-toggleable__content\"><pre>RandomSurvivalForest(max_depth=3, min_samples_leaf=15, n_jobs=-1,\n", | |
" random_state=20)</pre></div></div></div></div></div>" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 40 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"times = np.arange(365, 1826)\n", | |
"survs = rsf_best.predict_survival_function(X_test)" | |
], | |
"metadata": { | |
"id": "iO5hU-exQZup" | |
}, | |
"execution_count": 41, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"preds = np.asarray([[fn(t) for t in times] for fn in survs])" | |
], | |
"metadata": { | |
"id": "nVQsQOocQhOI" | |
}, | |
"execution_count": 42, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"integrated_brier_score(y_trn, y_test, preds, times)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "rYRRmruYRCgq", | |
"outputId": "a1a4bdf8-27d9-4544-f7af-433429972883" | |
}, | |
"execution_count": 43, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"0.17850725604478493" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 43 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from sksurv.ensemble import GradientBoostingSurvivalAnalysis" | |
], | |
"metadata": { | |
"id": "wTxXroEmRYMm" | |
}, | |
"execution_count": 44, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [], | |
"metadata": { | |
"id": "wnfh4hsbRYw6" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment