Last active
June 6, 2024 07:39
-
-
Save alonsosilvaallende/c9f7c594fb3d10f0cde731994dea4f8a to your computer and use it in GitHub Desktop.
copy-of-copy-of-cox_ph_and_rsf-colab-aa.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/c9f7c594fb3d10f0cde731994dea4f8a/copy-of-copy-of-cox_ph_and_rsf-colab-aa.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", | |
"source": [ | |
"%pip install --quiet --upgrade scikit-learn scikit-survival shap" | |
], | |
"metadata": { | |
"id": "jkEhIVvNPt85", | |
"outputId": "1aba64f4-15d1-4bef-bf2b-bb98653420fb", | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
} | |
}, | |
"execution_count": 1, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.3/13.3 MB\u001b[0m \u001b[31m44.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", | |
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.7/3.7 MB\u001b[0m \u001b[31m47.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", | |
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m540.5/540.5 kB\u001b[0m \u001b[31m28.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", | |
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m10.8/10.8 MB\u001b[0m \u001b[31m52.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", | |
"\u001b[?25h" | |
] | |
} | |
] | |
}, | |
{ | |
"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": "5681e581-7049-4bea-9cbd-52d35126ae98", | |
"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 0x7f619ef82380>" | |
], | |
"text/html": [ | |
"<style type=\"text/css\">\n", | |
"</style>\n", | |
"<table id=\"T_0d01a\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr>\n", | |
" <th id=\"T_0d01a_level0_col0\" class=\"col_heading level0 col0\" >age</th>\n", | |
" <th id=\"T_0d01a_level0_col1\" class=\"col_heading level0 col1\" >estrec</th>\n", | |
" <th id=\"T_0d01a_level0_col2\" class=\"col_heading level0 col2\" >horTh</th>\n", | |
" <th id=\"T_0d01a_level0_col3\" class=\"col_heading level0 col3\" >menostat</th>\n", | |
" <th id=\"T_0d01a_level0_col4\" class=\"col_heading level0 col4\" >pnodes</th>\n", | |
" <th id=\"T_0d01a_level0_col5\" class=\"col_heading level0 col5\" >progrec</th>\n", | |
" <th id=\"T_0d01a_level0_col6\" class=\"col_heading level0 col6\" >tgrade</th>\n", | |
" <th id=\"T_0d01a_level0_col7\" class=\"col_heading level0 col7\" >tsize</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <td id=\"T_0d01a_row0_col0\" class=\"data row0 col0\" >70</td>\n", | |
" <td id=\"T_0d01a_row0_col1\" class=\"data row0 col1\" >66</td>\n", | |
" <td id=\"T_0d01a_row0_col2\" class=\"data row0 col2\" >no</td>\n", | |
" <td id=\"T_0d01a_row0_col3\" class=\"data row0 col3\" >Post</td>\n", | |
" <td id=\"T_0d01a_row0_col4\" class=\"data row0 col4\" >3</td>\n", | |
" <td id=\"T_0d01a_row0_col5\" class=\"data row0 col5\" >48</td>\n", | |
" <td id=\"T_0d01a_row0_col6\" class=\"data row0 col6\" >II</td>\n", | |
" <td id=\"T_0d01a_row0_col7\" class=\"data row0 col7\" >21</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_0d01a_row1_col0\" class=\"data row1 col0\" >56</td>\n", | |
" <td id=\"T_0d01a_row1_col1\" class=\"data row1 col1\" >77</td>\n", | |
" <td id=\"T_0d01a_row1_col2\" class=\"data row1 col2\" >yes</td>\n", | |
" <td id=\"T_0d01a_row1_col3\" class=\"data row1 col3\" >Post</td>\n", | |
" <td id=\"T_0d01a_row1_col4\" class=\"data row1 col4\" >7</td>\n", | |
" <td id=\"T_0d01a_row1_col5\" class=\"data row1 col5\" >61</td>\n", | |
" <td id=\"T_0d01a_row1_col6\" class=\"data row1 col6\" >II</td>\n", | |
" <td id=\"T_0d01a_row1_col7\" class=\"data row1 col7\" >12</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_0d01a_row2_col0\" class=\"data row2 col0\" >58</td>\n", | |
" <td id=\"T_0d01a_row2_col1\" class=\"data row2 col1\" >271</td>\n", | |
" <td id=\"T_0d01a_row2_col2\" class=\"data row2 col2\" >yes</td>\n", | |
" <td id=\"T_0d01a_row2_col3\" class=\"data row2 col3\" >Post</td>\n", | |
" <td id=\"T_0d01a_row2_col4\" class=\"data row2 col4\" >9</td>\n", | |
" <td id=\"T_0d01a_row2_col5\" class=\"data row2 col5\" >52</td>\n", | |
" <td id=\"T_0d01a_row2_col6\" class=\"data row2 col6\" >II</td>\n", | |
" <td id=\"T_0d01a_row2_col7\" class=\"data row2 col7\" >35</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_0d01a_row3_col0\" class=\"data row3 col0\" >59</td>\n", | |
" <td id=\"T_0d01a_row3_col1\" class=\"data row3 col1\" >29</td>\n", | |
" <td id=\"T_0d01a_row3_col2\" class=\"data row3 col2\" >yes</td>\n", | |
" <td id=\"T_0d01a_row3_col3\" class=\"data row3 col3\" >Post</td>\n", | |
" <td id=\"T_0d01a_row3_col4\" class=\"data row3 col4\" >4</td>\n", | |
" <td id=\"T_0d01a_row3_col5\" class=\"data row3 col5\" >60</td>\n", | |
" <td id=\"T_0d01a_row3_col6\" class=\"data row3 col6\" >II</td>\n", | |
" <td id=\"T_0d01a_row3_col7\" class=\"data row3 col7\" >17</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_0d01a_row4_col0\" class=\"data row4 col0\" >73</td>\n", | |
" <td id=\"T_0d01a_row4_col1\" class=\"data row4 col1\" >65</td>\n", | |
" <td id=\"T_0d01a_row4_col2\" class=\"data row4 col2\" >no</td>\n", | |
" <td id=\"T_0d01a_row4_col3\" class=\"data row4 col3\" >Post</td>\n", | |
" <td id=\"T_0d01a_row4_col4\" class=\"data row4 col4\" >1</td>\n", | |
" <td id=\"T_0d01a_row4_col5\" class=\"data row4 col5\" >26</td>\n", | |
" <td id=\"T_0d01a_row4_col6\" class=\"data row4 col6\" >II</td>\n", | |
" <td id=\"T_0d01a_row4_col7\" class=\"data row4 col7\" >35</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_0d01a_row5_col0\" class=\"data row5 col0\" >32</td>\n", | |
" <td id=\"T_0d01a_row5_col1\" class=\"data row5 col1\" >13</td>\n", | |
" <td id=\"T_0d01a_row5_col2\" class=\"data row5 col2\" >no</td>\n", | |
" <td id=\"T_0d01a_row5_col3\" class=\"data row5 col3\" >Pre</td>\n", | |
" <td id=\"T_0d01a_row5_col4\" class=\"data row5 col4\" >24</td>\n", | |
" <td id=\"T_0d01a_row5_col5\" class=\"data row5 col5\" >0</td>\n", | |
" <td id=\"T_0d01a_row5_col6\" class=\"data row5 col6\" >III</td>\n", | |
" <td id=\"T_0d01a_row5_col7\" class=\"data row5 col7\" >57</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_0d01a_row6_col0\" class=\"data row6 col0\" >59</td>\n", | |
" <td id=\"T_0d01a_row6_col1\" class=\"data row6 col1\" >0</td>\n", | |
" <td id=\"T_0d01a_row6_col2\" class=\"data row6 col2\" >yes</td>\n", | |
" <td id=\"T_0d01a_row6_col3\" class=\"data row6 col3\" >Post</td>\n", | |
" <td id=\"T_0d01a_row6_col4\" class=\"data row6 col4\" >2</td>\n", | |
" <td id=\"T_0d01a_row6_col5\" class=\"data row6 col5\" >181</td>\n", | |
" <td id=\"T_0d01a_row6_col6\" class=\"data row6 col6\" >II</td>\n", | |
" <td id=\"T_0d01a_row6_col7\" class=\"data row6 col7\" >8</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_0d01a_row7_col0\" class=\"data row7 col0\" >65</td>\n", | |
" <td id=\"T_0d01a_row7_col1\" class=\"data row7 col1\" >25</td>\n", | |
" <td id=\"T_0d01a_row7_col2\" class=\"data row7 col2\" >no</td>\n", | |
" <td id=\"T_0d01a_row7_col3\" class=\"data row7 col3\" >Post</td>\n", | |
" <td id=\"T_0d01a_row7_col4\" class=\"data row7 col4\" >1</td>\n", | |
" <td id=\"T_0d01a_row7_col5\" class=\"data row7 col5\" >192</td>\n", | |
" <td id=\"T_0d01a_row7_col6\" class=\"data row7 col6\" >II</td>\n", | |
" <td id=\"T_0d01a_row7_col7\" class=\"data row7 col7\" >16</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_0d01a_row8_col0\" class=\"data row8 col0\" >80</td>\n", | |
" <td id=\"T_0d01a_row8_col1\" class=\"data row8 col1\" >59</td>\n", | |
" <td id=\"T_0d01a_row8_col2\" class=\"data row8 col2\" >no</td>\n", | |
" <td id=\"T_0d01a_row8_col3\" class=\"data row8 col3\" >Post</td>\n", | |
" <td id=\"T_0d01a_row8_col4\" class=\"data row8 col4\" >30</td>\n", | |
" <td id=\"T_0d01a_row8_col5\" class=\"data row8 col5\" >0</td>\n", | |
" <td id=\"T_0d01a_row8_col6\" class=\"data row8 col6\" >II</td>\n", | |
" <td id=\"T_0d01a_row8_col7\" class=\"data row8 col7\" >39</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_0d01a_row9_col0\" class=\"data row9 col0\" >66</td>\n", | |
" <td id=\"T_0d01a_row9_col1\" class=\"data row9 col1\" >3</td>\n", | |
" <td id=\"T_0d01a_row9_col2\" class=\"data row9 col2\" >no</td>\n", | |
" <td id=\"T_0d01a_row9_col3\" class=\"data row9 col3\" >Post</td>\n", | |
" <td id=\"T_0d01a_row9_col4\" class=\"data row9 col4\" >7</td>\n", | |
" <td id=\"T_0d01a_row9_col5\" class=\"data row9 col5\" >0</td>\n", | |
" <td id=\"T_0d01a_row9_col6\" class=\"data row9 col6\" >II</td>\n", | |
" <td id=\"T_0d01a_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": "87027716-1898-4aa2-a8d3-c487f3789406", | |
"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": "8042576e-fd09-44e2-cf78-5fb6bb4a8aed" | |
}, | |
"execution_count": 6, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"<pandas.io.formats.style.Styler at 0x7f6168914c40>" | |
], | |
"text/html": [ | |
"<style type=\"text/css\">\n", | |
"#T_ed684_row6_col1, #T_ed684_row7_col1, #T_ed684_row9_col1 {\n", | |
" background-color: lightgreen;\n", | |
"}\n", | |
"</style>\n", | |
"<table id=\"T_ed684\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr>\n", | |
" <th id=\"T_ed684_level0_col0\" class=\"col_heading level0 col0\" >time</th>\n", | |
" <th id=\"T_ed684_level0_col1\" class=\"col_heading level0 col1\" >event</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <td id=\"T_ed684_row0_col0\" class=\"data row0 col0\" >1814</td>\n", | |
" <td id=\"T_ed684_row0_col1\" class=\"data row0 col1\" >True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_ed684_row1_col0\" class=\"data row1 col0\" >2018</td>\n", | |
" <td id=\"T_ed684_row1_col1\" class=\"data row1 col1\" >True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_ed684_row2_col0\" class=\"data row2 col0\" >712</td>\n", | |
" <td id=\"T_ed684_row2_col1\" class=\"data row2 col1\" >True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_ed684_row3_col0\" class=\"data row3 col0\" >1807</td>\n", | |
" <td id=\"T_ed684_row3_col1\" class=\"data row3 col1\" >True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_ed684_row4_col0\" class=\"data row4 col0\" >772</td>\n", | |
" <td id=\"T_ed684_row4_col1\" class=\"data row4 col1\" >True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_ed684_row5_col0\" class=\"data row5 col0\" >448</td>\n", | |
" <td id=\"T_ed684_row5_col1\" class=\"data row5 col1\" >True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_ed684_row6_col0\" class=\"data row6 col0\" >2172</td>\n", | |
" <td id=\"T_ed684_row6_col1\" class=\"data row6 col1\" >False</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_ed684_row7_col0\" class=\"data row7 col0\" >2161</td>\n", | |
" <td id=\"T_ed684_row7_col1\" class=\"data row7 col1\" >False</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_ed684_row8_col0\" class=\"data row8 col0\" >471</td>\n", | |
" <td id=\"T_ed684_row8_col1\" class=\"data row8 col1\" >True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td id=\"T_ed684_row9_col0\" class=\"data row9 col0\" >2014</td>\n", | |
" <td id=\"T_ed684_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": "a9f782cd-ec17-438c-d66b-c23300c6319f", | |
"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": "markdown", | |
"source": [ | |
"Let's create a dataframe with the new features" | |
], | |
"metadata": { | |
"id": "Zcc-PPjpBeLS" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"entire_data = pd.concat([X, df_y], axis=1)" | |
], | |
"metadata": { | |
"id": "EpTTmxnRCWgG" | |
}, | |
"execution_count": 12, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"entire_data" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 423 | |
}, | |
"id": "JsJje5HFC4ur", | |
"outputId": "38152a71-b85a-4a5e-cd21-832986322ee0" | |
}, | |
"execution_count": 13, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
" age estrec horTh menostat pnodes progrec tgrade tsize time \\\n", | |
"0 70.0 66.0 0 1 3.0 48.0 1.0 21.0 1814 \n", | |
"1 56.0 77.0 1 1 7.0 61.0 1.0 12.0 2018 \n", | |
"2 58.0 271.0 1 1 9.0 52.0 1.0 35.0 712 \n", | |
"3 59.0 29.0 1 1 4.0 60.0 1.0 17.0 1807 \n", | |
"4 73.0 65.0 0 1 1.0 26.0 1.0 35.0 772 \n", | |
".. ... ... ... ... ... ... ... ... ... \n", | |
"681 49.0 84.0 0 0 3.0 1.0 2.0 30.0 721 \n", | |
"682 53.0 0.0 1 1 17.0 0.0 2.0 25.0 186 \n", | |
"683 51.0 0.0 0 0 5.0 43.0 2.0 25.0 769 \n", | |
"684 52.0 34.0 0 1 3.0 15.0 1.0 23.0 727 \n", | |
"685 55.0 15.0 0 1 9.0 116.0 1.0 23.0 1701 \n", | |
"\n", | |
" event \n", | |
"0 True \n", | |
"1 True \n", | |
"2 True \n", | |
"3 True \n", | |
"4 True \n", | |
".. ... \n", | |
"681 False \n", | |
"682 False \n", | |
"683 True \n", | |
"684 True \n", | |
"685 True \n", | |
"\n", | |
"[686 rows x 10 columns]" | |
], | |
"text/html": [ | |
"\n", | |
" <div id=\"df-4c44984a-0d1d-40ce-878a-7dd9aecdfc93\" 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>age</th>\n", | |
" <th>estrec</th>\n", | |
" <th>horTh</th>\n", | |
" <th>menostat</th>\n", | |
" <th>pnodes</th>\n", | |
" <th>progrec</th>\n", | |
" <th>tgrade</th>\n", | |
" <th>tsize</th>\n", | |
" <th>time</th>\n", | |
" <th>event</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>70.0</td>\n", | |
" <td>66.0</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>3.0</td>\n", | |
" <td>48.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>21.0</td>\n", | |
" <td>1814</td>\n", | |
" <td>True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>56.0</td>\n", | |
" <td>77.0</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>7.0</td>\n", | |
" <td>61.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>12.0</td>\n", | |
" <td>2018</td>\n", | |
" <td>True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>58.0</td>\n", | |
" <td>271.0</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>9.0</td>\n", | |
" <td>52.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>35.0</td>\n", | |
" <td>712</td>\n", | |
" <td>True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>59.0</td>\n", | |
" <td>29.0</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>4.0</td>\n", | |
" <td>60.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>17.0</td>\n", | |
" <td>1807</td>\n", | |
" <td>True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>73.0</td>\n", | |
" <td>65.0</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>1.0</td>\n", | |
" <td>26.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>35.0</td>\n", | |
" <td>772</td>\n", | |
" <td>True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>...</th>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>681</th>\n", | |
" <td>49.0</td>\n", | |
" <td>84.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>3.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>2.0</td>\n", | |
" <td>30.0</td>\n", | |
" <td>721</td>\n", | |
" <td>False</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>682</th>\n", | |
" <td>53.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>17.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>2.0</td>\n", | |
" <td>25.0</td>\n", | |
" <td>186</td>\n", | |
" <td>False</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>683</th>\n", | |
" <td>51.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>5.0</td>\n", | |
" <td>43.0</td>\n", | |
" <td>2.0</td>\n", | |
" <td>25.0</td>\n", | |
" <td>769</td>\n", | |
" <td>True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>684</th>\n", | |
" <td>52.0</td>\n", | |
" <td>34.0</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>3.0</td>\n", | |
" <td>15.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>23.0</td>\n", | |
" <td>727</td>\n", | |
" <td>True</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>685</th>\n", | |
" <td>55.0</td>\n", | |
" <td>15.0</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>9.0</td>\n", | |
" <td>116.0</td>\n", | |
" <td>1.0</td>\n", | |
" <td>23.0</td>\n", | |
" <td>1701</td>\n", | |
" <td>True</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>686 rows × 10 columns</p>\n", | |
"</div>\n", | |
" <div class=\"colab-df-buttons\">\n", | |
"\n", | |
" <div class=\"colab-df-container\">\n", | |
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-4c44984a-0d1d-40ce-878a-7dd9aecdfc93')\"\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-4c44984a-0d1d-40ce-878a-7dd9aecdfc93 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-4c44984a-0d1d-40ce-878a-7dd9aecdfc93');\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-d870bfa1-e5c4-41d3-8159-8120aa738c30\">\n", | |
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-d870bfa1-e5c4-41d3-8159-8120aa738c30')\"\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-d870bfa1-e5c4-41d3-8159-8120aa738c30 button');\n", | |
" quickchartButtonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
" })();\n", | |
" </script>\n", | |
"</div>\n", | |
"\n", | |
" <div id=\"id_5b892389-91a1-4ccc-bb6c-1b3b8d32b2b5\">\n", | |
" <style>\n", | |
" .colab-df-generate {\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-generate: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", | |
" [theme=dark] .colab-df-generate {\n", | |
" background-color: #3B4455;\n", | |
" fill: #D2E3FC;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-generate: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", | |
" <button class=\"colab-df-generate\" onclick=\"generateWithVariable('entire_data')\"\n", | |
" title=\"Generate code using this dataframe.\"\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", | |
" <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n", | |
" </svg>\n", | |
" </button>\n", | |
" <script>\n", | |
" (() => {\n", | |
" const buttonEl =\n", | |
" document.querySelector('#id_5b892389-91a1-4ccc-bb6c-1b3b8d32b2b5 button.colab-df-generate');\n", | |
" buttonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
"\n", | |
" buttonEl.onclick = () => {\n", | |
" google.colab.notebook.generateWithVariable('entire_data');\n", | |
" }\n", | |
" })();\n", | |
" </script>\n", | |
" </div>\n", | |
"\n", | |
" </div>\n", | |
" </div>\n" | |
], | |
"application/vnd.google.colaboratory.intrinsic+json": { | |
"type": "dataframe", | |
"variable_name": "entire_data", | |
"summary": "{\n \"name\": \"entire_data\",\n \"rows\": 686,\n \"fields\": [\n {\n \"column\": \"age\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 10.120739044822262,\n \"min\": 21.0,\n \"max\": 80.0,\n \"num_unique_values\": 54,\n \"samples\": [\n 53.0,\n 27.0,\n 25.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"estrec\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 153.0839632774449,\n \"min\": 0.0,\n \"max\": 1144.0,\n \"num_unique_values\": 244,\n \"samples\": [\n 5.0,\n 0.0,\n 544.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"horTh\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 0,\n \"max\": 1,\n \"num_unique_values\": 2,\n \"samples\": [\n 1,\n 0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"menostat\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 0,\n \"max\": 1,\n \"num_unique_values\": 2,\n \"samples\": [\n 0,\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"pnodes\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 5.475483323189239,\n \"min\": 1.0,\n \"max\": 51.0,\n \"num_unique_values\": 30,\n \"samples\": [\n 35.0,\n 11.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"progrec\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 202.3315519516271,\n \"min\": 0.0,\n \"max\": 2380.0,\n \"num_unique_values\": 242,\n \"samples\": [\n 6.0,\n 181.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tgrade\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.5828078948007923,\n \"min\": 0.0,\n \"max\": 2.0,\n \"num_unique_values\": 3,\n \"samples\": [\n 1.0,\n 2.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tsize\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 14.296216905003115,\n \"min\": 3.0,\n \"max\": 120.0,\n \"num_unique_values\": 58,\n \"samples\": [\n 21.0,\n 8.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"time\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 642,\n \"min\": 8,\n \"max\": 2659,\n \"num_unique_values\": 574,\n \"samples\": [\n 737,\n 359\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"event\",\n \"properties\": {\n \"dtype\": \"boolean\",\n \"num_unique_values\": 2,\n \"samples\": [\n false,\n true\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" | |
} | |
}, | |
"metadata": {}, | |
"execution_count": 13 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from sksurv.datasets import get_x_y\n", | |
"\n", | |
"X, y = get_x_y(entire_data, attr_labels=[\"event\", \"time\"], pos_label=True)" | |
], | |
"metadata": { | |
"id": "VlM-23dVBsW4" | |
}, | |
"execution_count": 14, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"X.describe().transpose().round(2).drop(columns=\"count\")" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 300 | |
}, | |
"id": "1invnHReVmBo", | |
"outputId": "52c2dc5f-aefe-43c1-9dac-2910e76bb3e7" | |
}, | |
"execution_count": 15, | |
"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-7415d652-7563-47e0-bee6-c560bd1773fb\" 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-7415d652-7563-47e0-bee6-c560bd1773fb')\"\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-7415d652-7563-47e0-bee6-c560bd1773fb 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-7415d652-7563-47e0-bee6-c560bd1773fb');\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-8c715d41-2a29-4616-8560-53f77c086969\">\n", | |
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-8c715d41-2a29-4616-8560-53f77c086969')\"\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-8c715d41-2a29-4616-8560-53f77c086969 button');\n", | |
" quickchartButtonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
" })();\n", | |
" </script>\n", | |
"</div>\n", | |
"\n", | |
" </div>\n", | |
" </div>\n" | |
], | |
"application/vnd.google.colaboratory.intrinsic+json": { | |
"type": "dataframe", | |
"summary": "{\n \"name\": \"X\",\n \"rows\": 8,\n \"fields\": [\n {\n \"column\": \"mean\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 44.937453596240694,\n \"min\": 0.36,\n \"max\": 110.0,\n \"num_unique_values\": 8,\n \"samples\": [\n 96.25,\n 110.0,\n 53.05\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"std\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 81.06529515502568,\n \"min\": 0.48,\n \"max\": 202.33,\n \"num_unique_values\": 8,\n \"samples\": [\n 153.08,\n 202.33,\n 10.12\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"min\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 7.298483208369883,\n \"min\": 0.0,\n \"max\": 21.0,\n \"num_unique_values\": 4,\n \"samples\": [\n 0.0,\n 3.0,\n 21.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"25%\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 15.900920907742599,\n \"min\": 0.0,\n \"max\": 46.0,\n \"num_unique_values\": 6,\n \"samples\": [\n 46.0,\n 8.0,\n 20.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"50%\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 20.452798446318155,\n \"min\": 0.0,\n \"max\": 53.0,\n \"num_unique_values\": 7,\n \"samples\": [\n 53.0,\n 36.0,\n 32.5\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"75%\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 53.29976505911769,\n \"min\": 1.0,\n \"max\": 131.75,\n \"num_unique_values\": 6,\n \"samples\": [\n 61.0,\n 114.0,\n 35.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"max\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 862.8389913535433,\n \"min\": 1.0,\n \"max\": 2380.0,\n \"num_unique_values\": 7,\n \"samples\": [\n 80.0,\n 1144.0,\n 2.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" | |
} | |
}, | |
"metadata": {}, | |
"execution_count": 15 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "duYhddUr_1nH", | |
"outputId": "185c80bc-d963-4c3f-a7c1-cf2959d5f5a8", | |
"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": 16, | |
"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": "e8ff94cc-b036-4cf6-98b8-e0e52697f5e7" | |
}, | |
"execution_count": 17, | |
"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": 17 | |
} | |
] | |
}, | |
{ | |
"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": "84b31531-79d2-4d12-84db-92008b13c927", | |
"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": 18, | |
"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": 18 | |
} | |
] | |
}, | |
{ | |
"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[\"event\"], 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": "d7fed017-be6d-4724-b0e6-2da05589405f" | |
}, | |
"execution_count": 19, | |
"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": 20, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"survs = cox.predict_survival_function(X_test)" | |
], | |
"metadata": { | |
"id": "06i_zOUBqMUt" | |
}, | |
"execution_count": 21, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"preds = np.asarray([[fn(t) for t in times] for fn in survs])" | |
], | |
"metadata": { | |
"id": "prIyWOtMqe7s" | |
}, | |
"execution_count": 22, | |
"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": "bc3d64a1-8ac7-4628-ecc2-85f2b4dd510b" | |
}, | |
"execution_count": 23, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"0.17509710701666106" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 23 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"import shap\n", | |
"\n", | |
"explainer = shap.Explainer(cox.predict, X_trn)\n", | |
"\n", | |
"X100 = shap.utils.sample(X_test, 100)\n", | |
"shap_values = explainer(X100)\n", | |
"shap.plots.waterfall(shap_values[0])" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 540 | |
}, | |
"id": "J03T1z80N8fg", | |
"outputId": "69e0e6f8-abbd-4a41-b56a-cabe40740236" | |
}, | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 800x550 with 3 Axes>" | |
], | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAwsAAAILCAYAAACn0QAOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACW30lEQVR4nOzdeVxU5f4H8M+ZGWDYlU0QlEVERHDfzTVzQSs1l8xbWabVzRZv67W6ttpi/UqzRa1Ms9zQstLS3JfMBUFB2cQVQXZkX2bm/P6YGB1ngEGBM8vn/XrxgnnOc87znUGH+Z5nE0RRFEFERERERHQTmdQBEBERERGReWKyQERERERERjFZICIiIiIio5gsEBERERGRUUwWiIiIiIjIKCYLRERERERkFJMFIiIiIiIyiskCEREREREZxWSBiIiIiIiMYrJARERERERGMVkgIiIiIiKjmCwQERERkSQ0Gg3eeecddOjQAXZ2dujQoQM+/PBDhIeHQ6PRNPp6X331Fdq3b4+qqqpmiNY2CaIoilIHQURERES2Z+nSpXjmmWfw/PPPo2vXrnB3d8cjjzyCjz76CI888kijr1dZWYmgoCDMnz8fzzzzTDNEbJxarcbx48eRlpaGqqoqeHh4oE+fPggICDD5Gnl5eTh+/Diys7OhUqng5uaGzp07IzIy8pbqXbt2DceOHUN2djYqKyvh4uKC0NBQdOvWDQqFwuS4mCwQERERkSR69eoFLy8vbN++HQDw6aefYsGCBcjOzoZSqbyla7788stYv349zp8/D0EQmjLcOu3atQvnzp1DVFQU3N3dkZqaipycHNx9993w9fVt8PyMjAz88ccf8PLyQkhICOzs7FBcXAxRFNG/f/9G1ystLUVMTAzs7e0REREBBwcHZGdnIzU1FYGBgRg9erTJz830tIKIiIiIqIlUVlbi5MmTePPNN3VlK1euxD333HPLiQIATJ06FR9++CH27NmDESNGNEWo9crJyUF6ejr69euHbt26AQA6duyImJgYHDlyBPfee2+951dXV2PPnj1o37497rrrrjoTHFPrAUBaWhqqq6txzz33wMPDAwDQuXNniKKo6/1wcHAw6flxzgIRERERtahZs2bB0dERarUar732GgRBgJ+fH06dOoWRI0ca1L9y5QqUSiUeffRRvfKdO3fCzs4O8+bN05X16tULHh4e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\n" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"shap.plots.beeswarm(shap_values)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 453 | |
}, | |
"id": "0kbYd1wAODT9", | |
"outputId": "8e7665ca-caef-4399-cd11-48cbc0e66d9b" | |
}, | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 800x470 with 2 Axes>" | |
], | |
"image/png": "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54orrmDQoEGUK1cOf39/jh8/zvjx492C7dw4813l/vvvp379+h63KV++/H/qt4jIxWa1GCzp50fEq5lknc6kU9xJQrLsjFyw2hlYA9jx4xBVqWRYidz9BNSs4MNei0ih0EC1V6U6uF6+fDmVK1fmzTffxGI5myGzbt06l+0qV67Mhg0bSE1NJSTk7Dczm83GoUOHCA8Pd5ZVr14dgODgYNq0aXORj0BE5OLKtJlEpNmoejoNDIOALJvbNjYCsZtBCqxFSgsF116V6pxrq9WKYRgueVE2m405c+a4bNe+fXvsdjsfffSRS/nnn39OcnKyS1nbtm0pU6YMc+bMITHRPWcxPT2dlJSUgjsIEZGLaGATK8eDAsj6dwDinxoVz9vCJJg0Aq+sXPidExEfUc61N6V65Lpjx4689dZbjB49mmuuuYaUlBS+/vprt3mo+/Tpw2effca0adM4ePCgcyq+b775hmrVqmG3253bBgcHM2HCBB566CH69+9P7969qVatGklJSezdu5dVq1bx8ssva7YQESkW3u5mJTPLn6WOily/PY5NTWphcTiodfAYwVmZRJrJBBo2gpff5euuiogUCaX6hka73c68efNYvHgxR48epWzZsnTu3JnevXszcOBAhg8fzogRIwA4deqUy0NkmjZtygMPPMBzzz1Heno68+fPd6l7165dzJ07l40bN3Lq1CkiIiKoWrUq7dq1Y+DAgURGRvrikEVE8sV0mLzdbAmX7DtAtZR4t/XlVg8hMLaGD3omIoXNeDrNrcycEOyDnhRNpTq4/q/sdjudOnWiadOmF5whRESkuHv/mq+pvGUfDU4dcVtXceco/OqW8UGvRKSwKbj2rlTnXOdFenq6W9nChQtJSkrSjYsiUipcdn8j9pYrS7oR4FLu36WOAmsRkX+V6pzrvHj++efJyMjgkksuISAggK1bt/LVV19RrVo1+vbt6+vuiYhcdA36VCeydghfvJBCva0J1ImOIuLmJoSNvNTXXRORwqT7F71ScJ1Lbdq0Yf78+bz77rukpqZStmxZ+vTpw8iRIwkNDfV190RECkXZRpHYr0nn72uCaDvsJvz9/X3dJREpbIaia28UXOdSz5496dmzp6+7ISIiIiJFmHKuRUREREQKiEauRURERCT3lBXilYJrEREREckDRdfeKC1ERERERKSAaORaRERERHJPA9deaeRaRERERKSAKLgWERERESkgSgsRERERkdxTWohXGrkWERERESkgGrkWERERkdzT48+90si1iIiIiEgB0ci1iIiIiOSeBq690si1iIiIiEgBUXAtIiIiIlJAlBYiIiIiIrmntBCvFFyLiIiISB4ouvZGwbWIiIiI5J5ia6+Ucy0iIiIiUkAUXIuIiIiIFBClhYiIiIhI7iktxCuNXIuIiIiIFBAF1yIiIiIiBUTBtYiIiIjknuHhlYPx48cTFhZWOP0qIhRci4iIiIgUEAXXIiIiIiIFRMG1iIiIiOSeYbi/8mnr1q107dqV0NBQIiMjGTBgAPv373euv+OOO2jfvr1z+cSJE1gsFi677DJnWXJyMv7+/syfPz/f/ShICq5FREREJPfykHPtzYEDB4iNjeXkyZO8//77TJ8+nV9//ZWrr76apKQkAGJjY/nll19IT08HYM2aNQQGBvLbb785t1m3bh02m43Y2Nj/fGgFQfNcl2KmaTrfmCIiuZGVlUVaWhoAp0+fxt/f38c9Eim9wsPDMf7DqLGvTZo0iaysLFasWEGZMmUAaNmyJY0bN2bOnDncd999xMbGkpGRwfr167n66qtZs2YNffv2ZcWKFaxdu5Zu3bqxZs0a6tevT8WKFX18RNkUXJdiSUlJREZG+robIlJMjRkzxtddECnVEhMTiYiIKPR2zYcKJnz84YcfuPbaa52BNUDDhg1p3rw5P/74I/fddx+1atWiatWqrFmzxhlcjxw5krS0NFavXu0MrovKqDUouC7VwsPDSUxM9HU3vEpOTqZHjx588cUXpW4qn/zQ+co7nbO80znLO52zvNM5u7Dw8HBfd+E/OXXqFC1atHArr1ixIvHx8c7lM0H16dOn2bJlC7GxsaSkpLBgwQIyMjLYsGEDw4cPL8See6fguhQzDMMn33jzwmKxYLVaiYiI0IdrLuh85Z3OWd7pnOWdzlne6ZyVfGXKlOHYsWNu5UePHqV+/frO5djYWMaOHcv3339PuXLlaNiwISkpKTzyyCOsWrWKjIwMl5sefU03NIqIiIhIobvqqqv49ttvOXXqlLNs+/bt/P7771x11VXOsjMj1a+99poz/aNFixYEBwfz4osvUq1aNWrWrFnY3c+RRq5FRERE5KKx2+0sWLDArfz+++9n9uzZdOnShSeeeIL09HSefPJJqlevztChQ53bNWzYkAoVKrB69WrefPNNAKxWK1deeSVffvklt9xyS2EdSq4ouJYiLSAggOHDhxMQEODrrhQLOl95p3OWdzpneadzlnc6ZyVHeno6AwcOdCt/7733WL16NQ899BC33HILVquVzp0789prr7nlk8fGxrJgwQKXGxevvvpqvvzyyyJ1MyOAYZqm6etOiIiIiIiUBMq5FhEREREpIAquRUREREQKiIJrEREREZECohsapUj5+eefWbp0KX/88QdxcXEMHDiQRx555IL7HTp0iN69e7uVN23alDlz5lyEnhYd+T1nkP2Qhtdee43vv/8em83GFVdcwcMPP0y5cuUucq99a82aNUybNo19+/ZRqVIlhg4d6vH9c67S8h7bu3cvL730Er///juhoaF0796de+6554KPOTdNk7lz5zJ//nwSEhKoX78+Y8eOpVmzZoXUc9/J7znr1asXhw8fditfu3YtgYGBF6u7RcKBAwd47733+OOPP/jnn3+oUaMGn3766QX3K83vMyk+FFxLkfLTTz+xc+dOLr30Uk6fPp3n/e+9915at27tXA4JCSnI7hVJ/+WcPfbYY+zevZvHHnuMgIAApk6dyujRo5k3bx5+fiXz42Hz5s2MGzeO66+/ngcffJBffvmFZ599lpCQEDp16nTB/Uvye+z06dOMHDmS6tWr8/LLL3Ps2DEmTZpEenr6Bb+wzZ07lxkzZjBq1Cjq1avH/PnzGTVqFB988AFVq1YtpCMofP/lnAF07NiRwYMHu5SVhtkx/vnnH9auXUuTJk1wOBw4HI5c7Vda32dSzJgiRYjdbnf+uWfPnuaLL76Yq/3i4uLMVq1amStXrrxYXSuy8nvOtmzZYrZq1cr86aefnGV79uwxW7duba5YsaLA+1lU3HvvveawYcNcyh5//HFzwIABXvcrDe+xWbNmmVdddZWZkJDgLFu4cKF5+eWXm8eOHctxv/T0dDM2NtZ86623nGWZmZlmz549zRdeeOGi9tnX8nvOTDNv/15LmnM/t55++mlz4MCBF9ynNL/PpHhRzrUUKRaL3pJ5ld9ztm7dOsLDw2nTpo2zrGbNmtSvX5+1a9cWVPeKlMzMTDZu3Og2Qt2lSxf27NnDoUOHfNSzomHdunVcfvnlREZGOss6d+6Mw+Hg559/znG/33//nZSUFJfz6u/vzzXXXFNi30tn5Pec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\n" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "ZNHQ-bkWALNy", | |
"outputId": "b2012d13-c191-44c7-cd34-433344191ed4", | |
"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": null, | |
"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": "473cab81-726e-4e99-f4fb-a84c2dfcb912", | |
"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[\"event\"], 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": null, | |
"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": null, | |
"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": 74 | |
}, | |
"id": "vU06jwE7Kuec", | |
"outputId": "15eddd4f-3ad5-4ef7-b28e-01fb2c8c45a8" | |
}, | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"RandomSurvivalForest(min_samples_leaf=15, n_jobs=-1, 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, n_jobs=-1, 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, n_jobs=-1, random_state=20)</pre></div></div></div></div></div>" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 29 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"rsf.score(X_test, y_test)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "LJ0Tp63pKvMJ", | |
"outputId": "6ee0ff96-1fd6-4243-f171-4d2dc6405b87" | |
}, | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"0.6716457023060797" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 30 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"ci_cox = concordance_index_censored(y_test[\"event\"], 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": "caf56200-7a9f-4542-c99f-4ed744552555" | |
}, | |
"execution_count": null, | |
"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": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"survs = rsf.predict_survival_function(X_test)" | |
], | |
"metadata": { | |
"id": "iSZ0pa17PSJS" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"preds = np.asarray([[fn(t) for t in times] for fn in survs])" | |
], | |
"metadata": { | |
"id": "np-god8mPW5W" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"integrated_brier_score(y_trn, y_test, preds, times)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "U1avp5nfPaOS", | |
"outputId": "4e352f83-5572-4060-ad5b-803cc360fb3a" | |
}, | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"0.17751179194838104" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 35 | |
} | |
] | |
}, | |
{ | |
"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=9, 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": 116 | |
}, | |
"id": "QjiQ8TfBPfZg", | |
"outputId": "c0f524bc-fda8-4270-a41e-34dda39016ba" | |
}, | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"RandomizedSearchCV(cv=3,\n", | |
" estimator=RandomSurvivalForest(min_samples_leaf=15,\n", | |
" n_jobs=-1, random_state=20),\n", | |
" n_iter=9, 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", | |
" n_jobs=-1, random_state=20),\n", | |
" n_iter=9, 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", | |
" n_jobs=-1, random_state=20),\n", | |
" n_iter=9, 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, n_jobs=-1, 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, n_jobs=-1, random_state=20)</pre></div></div></div></div></div></div></div></div></div></div>" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 36 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"model_random_search.score(X_test, y_test)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "_X2klnTmQVXX", | |
"outputId": "ccd9366b-7a16-4740-ca90-cc58bcad1560" | |
}, | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"0.6805555555555556" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 37 | |
} | |
] | |
}, | |
{ | |
"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": "f4a6a4e8-c4d3-4068-a591-4a13ac775ee2" | |
}, | |
"execution_count": null, | |
"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": "f71aace7-ffc6-498a-fbc0-e4786d3a6719" | |
}, | |
"execution_count": null, | |
"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-4 {color: black;}#sk-container-id-4 pre{padding: 0;}#sk-container-id-4 div.sk-toggleable {background-color: white;}#sk-container-id-4 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-4 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-4 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-4 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-4 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-4 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-4 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-4 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-4 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-4 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-4 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-4 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-4 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-4 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-4 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-4 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-4 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-4 div.sk-item {position: relative;z-index: 1;}#sk-container-id-4 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-4 div.sk-item::before, #sk-container-id-4 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-4 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-4 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-4 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-4 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-4 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-4 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-4 div.sk-label-container {text-align: center;}#sk-container-id-4 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-4 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-4\" 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-6\" type=\"checkbox\" checked><label for=\"sk-estimator-id-6\" 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": 39 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"times = np.arange(365, 1826)\n", | |
"survs = rsf_best.predict_survival_function(X_test)" | |
], | |
"metadata": { | |
"id": "iO5hU-exQZup" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"preds = np.asarray([[fn(t) for t in times] for fn in survs])" | |
], | |
"metadata": { | |
"id": "nVQsQOocQhOI" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"integrated_brier_score(y_trn, y_test, preds, times)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "rYRRmruYRCgq", | |
"outputId": "5d8664e9-c897-4db1-eb1f-97811ab3b35e" | |
}, | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"0.17850725604478493" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 42 | |
} | |
] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment