Created
January 16, 2026 13:04
-
-
Save alonsosilvaallende/7ab4f34673d0dfe8203545a1f64c706c to your computer and use it in GitHub Desktop.
cox_ph_and_rsf-2026-01.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/7ab4f34673d0dfe8203545a1f64c706c/cox_ph_and_rsf-2026-01.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "# Cox Proportional Hazards and Random Survival Forest" | |
| ], | |
| "metadata": { | |
| "id": "svObxcHx26_v" | |
| } | |
| }, | |
| { | |
| "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 scikit-learn\n", | |
| "%pip install --quiet scikit-survival" | |
| ], | |
| "metadata": { | |
| "id": "xMhD09DUq_E4", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "outputId": "0a2b8b4e-7669-43ca-aab7-b8d50757dede" | |
| }, | |
| "execution_count": 1, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m4.0/4.0 MB\u001b[0m \u001b[31m26.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", | |
| "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m222.1/222.1 kB\u001b[0m \u001b[31m12.4 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": 2, | |
| "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": "1ccfd030-0989-45d6-a43b-af4ab87f8cde", | |
| "scrolled": true, | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 363 | |
| } | |
| }, | |
| "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 0x7a4e7b4318b0>" | |
| ], | |
| "text/html": [ | |
| "<style type=\"text/css\">\n", | |
| "</style>\n", | |
| "<table id=\"T_554e1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <th id=\"T_554e1_level0_col0\" class=\"col_heading level0 col0\" >age</th>\n", | |
| " <th id=\"T_554e1_level0_col1\" class=\"col_heading level0 col1\" >estrec</th>\n", | |
| " <th id=\"T_554e1_level0_col2\" class=\"col_heading level0 col2\" >horTh</th>\n", | |
| " <th id=\"T_554e1_level0_col3\" class=\"col_heading level0 col3\" >menostat</th>\n", | |
| " <th id=\"T_554e1_level0_col4\" class=\"col_heading level0 col4\" >pnodes</th>\n", | |
| " <th id=\"T_554e1_level0_col5\" class=\"col_heading level0 col5\" >progrec</th>\n", | |
| " <th id=\"T_554e1_level0_col6\" class=\"col_heading level0 col6\" >tgrade</th>\n", | |
| " <th id=\"T_554e1_level0_col7\" class=\"col_heading level0 col7\" >tsize</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <td id=\"T_554e1_row0_col0\" class=\"data row0 col0\" >70</td>\n", | |
| " <td id=\"T_554e1_row0_col1\" class=\"data row0 col1\" >66</td>\n", | |
| " <td id=\"T_554e1_row0_col2\" class=\"data row0 col2\" >no</td>\n", | |
| " <td id=\"T_554e1_row0_col3\" class=\"data row0 col3\" >Post</td>\n", | |
| " <td id=\"T_554e1_row0_col4\" class=\"data row0 col4\" >3</td>\n", | |
| " <td id=\"T_554e1_row0_col5\" class=\"data row0 col5\" >48</td>\n", | |
| " <td id=\"T_554e1_row0_col6\" class=\"data row0 col6\" >II</td>\n", | |
| " <td id=\"T_554e1_row0_col7\" class=\"data row0 col7\" >21</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_554e1_row1_col0\" class=\"data row1 col0\" >56</td>\n", | |
| " <td id=\"T_554e1_row1_col1\" class=\"data row1 col1\" >77</td>\n", | |
| " <td id=\"T_554e1_row1_col2\" class=\"data row1 col2\" >yes</td>\n", | |
| " <td id=\"T_554e1_row1_col3\" class=\"data row1 col3\" >Post</td>\n", | |
| " <td id=\"T_554e1_row1_col4\" class=\"data row1 col4\" >7</td>\n", | |
| " <td id=\"T_554e1_row1_col5\" class=\"data row1 col5\" >61</td>\n", | |
| " <td id=\"T_554e1_row1_col6\" class=\"data row1 col6\" >II</td>\n", | |
| " <td id=\"T_554e1_row1_col7\" class=\"data row1 col7\" >12</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_554e1_row2_col0\" class=\"data row2 col0\" >58</td>\n", | |
| " <td id=\"T_554e1_row2_col1\" class=\"data row2 col1\" >271</td>\n", | |
| " <td id=\"T_554e1_row2_col2\" class=\"data row2 col2\" >yes</td>\n", | |
| " <td id=\"T_554e1_row2_col3\" class=\"data row2 col3\" >Post</td>\n", | |
| " <td id=\"T_554e1_row2_col4\" class=\"data row2 col4\" >9</td>\n", | |
| " <td id=\"T_554e1_row2_col5\" class=\"data row2 col5\" >52</td>\n", | |
| " <td id=\"T_554e1_row2_col6\" class=\"data row2 col6\" >II</td>\n", | |
| " <td id=\"T_554e1_row2_col7\" class=\"data row2 col7\" >35</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_554e1_row3_col0\" class=\"data row3 col0\" >59</td>\n", | |
| " <td id=\"T_554e1_row3_col1\" class=\"data row3 col1\" >29</td>\n", | |
| " <td id=\"T_554e1_row3_col2\" class=\"data row3 col2\" >yes</td>\n", | |
| " <td id=\"T_554e1_row3_col3\" class=\"data row3 col3\" >Post</td>\n", | |
| " <td id=\"T_554e1_row3_col4\" class=\"data row3 col4\" >4</td>\n", | |
| " <td id=\"T_554e1_row3_col5\" class=\"data row3 col5\" >60</td>\n", | |
| " <td id=\"T_554e1_row3_col6\" class=\"data row3 col6\" >II</td>\n", | |
| " <td id=\"T_554e1_row3_col7\" class=\"data row3 col7\" >17</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_554e1_row4_col0\" class=\"data row4 col0\" >73</td>\n", | |
| " <td id=\"T_554e1_row4_col1\" class=\"data row4 col1\" >65</td>\n", | |
| " <td id=\"T_554e1_row4_col2\" class=\"data row4 col2\" >no</td>\n", | |
| " <td id=\"T_554e1_row4_col3\" class=\"data row4 col3\" >Post</td>\n", | |
| " <td id=\"T_554e1_row4_col4\" class=\"data row4 col4\" >1</td>\n", | |
| " <td id=\"T_554e1_row4_col5\" class=\"data row4 col5\" >26</td>\n", | |
| " <td id=\"T_554e1_row4_col6\" class=\"data row4 col6\" >II</td>\n", | |
| " <td id=\"T_554e1_row4_col7\" class=\"data row4 col7\" >35</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_554e1_row5_col0\" class=\"data row5 col0\" >32</td>\n", | |
| " <td id=\"T_554e1_row5_col1\" class=\"data row5 col1\" >13</td>\n", | |
| " <td id=\"T_554e1_row5_col2\" class=\"data row5 col2\" >no</td>\n", | |
| " <td id=\"T_554e1_row5_col3\" class=\"data row5 col3\" >Pre</td>\n", | |
| " <td id=\"T_554e1_row5_col4\" class=\"data row5 col4\" >24</td>\n", | |
| " <td id=\"T_554e1_row5_col5\" class=\"data row5 col5\" >0</td>\n", | |
| " <td id=\"T_554e1_row5_col6\" class=\"data row5 col6\" >III</td>\n", | |
| " <td id=\"T_554e1_row5_col7\" class=\"data row5 col7\" >57</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_554e1_row6_col0\" class=\"data row6 col0\" >59</td>\n", | |
| " <td id=\"T_554e1_row6_col1\" class=\"data row6 col1\" >0</td>\n", | |
| " <td id=\"T_554e1_row6_col2\" class=\"data row6 col2\" >yes</td>\n", | |
| " <td id=\"T_554e1_row6_col3\" class=\"data row6 col3\" >Post</td>\n", | |
| " <td id=\"T_554e1_row6_col4\" class=\"data row6 col4\" >2</td>\n", | |
| " <td id=\"T_554e1_row6_col5\" class=\"data row6 col5\" >181</td>\n", | |
| " <td id=\"T_554e1_row6_col6\" class=\"data row6 col6\" >II</td>\n", | |
| " <td id=\"T_554e1_row6_col7\" class=\"data row6 col7\" >8</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_554e1_row7_col0\" class=\"data row7 col0\" >65</td>\n", | |
| " <td id=\"T_554e1_row7_col1\" class=\"data row7 col1\" >25</td>\n", | |
| " <td id=\"T_554e1_row7_col2\" class=\"data row7 col2\" >no</td>\n", | |
| " <td id=\"T_554e1_row7_col3\" class=\"data row7 col3\" >Post</td>\n", | |
| " <td id=\"T_554e1_row7_col4\" class=\"data row7 col4\" >1</td>\n", | |
| " <td id=\"T_554e1_row7_col5\" class=\"data row7 col5\" >192</td>\n", | |
| " <td id=\"T_554e1_row7_col6\" class=\"data row7 col6\" >II</td>\n", | |
| " <td id=\"T_554e1_row7_col7\" class=\"data row7 col7\" >16</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_554e1_row8_col0\" class=\"data row8 col0\" >80</td>\n", | |
| " <td id=\"T_554e1_row8_col1\" class=\"data row8 col1\" >59</td>\n", | |
| " <td id=\"T_554e1_row8_col2\" class=\"data row8 col2\" >no</td>\n", | |
| " <td id=\"T_554e1_row8_col3\" class=\"data row8 col3\" >Post</td>\n", | |
| " <td id=\"T_554e1_row8_col4\" class=\"data row8 col4\" >30</td>\n", | |
| " <td id=\"T_554e1_row8_col5\" class=\"data row8 col5\" >0</td>\n", | |
| " <td id=\"T_554e1_row8_col6\" class=\"data row8 col6\" >II</td>\n", | |
| " <td id=\"T_554e1_row8_col7\" class=\"data row8 col7\" >39</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_554e1_row9_col0\" class=\"data row9 col0\" >66</td>\n", | |
| " <td id=\"T_554e1_row9_col1\" class=\"data row9 col1\" >3</td>\n", | |
| " <td id=\"T_554e1_row9_col2\" class=\"data row9 col2\" >no</td>\n", | |
| " <td id=\"T_554e1_row9_col3\" class=\"data row9 col3\" >Post</td>\n", | |
| " <td id=\"T_554e1_row9_col4\" class=\"data row9 col4\" >7</td>\n", | |
| " <td id=\"T_554e1_row9_col5\" class=\"data row9 col5\" >0</td>\n", | |
| " <td id=\"T_554e1_row9_col6\" class=\"data row9 col6\" >II</td>\n", | |
| " <td id=\"T_554e1_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": "77a8bc0d-1ddd-43b4-dd12-fa33d9e6d450", | |
| "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": 363 | |
| }, | |
| "id": "AfPvZcjJ-GwQ", | |
| "outputId": "b3e783d6-d022-4f68-9d8d-107e16aed8c4" | |
| }, | |
| "execution_count": 6, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "<pandas.io.formats.style.Styler at 0x7a4e78155070>" | |
| ], | |
| "text/html": [ | |
| "<style type=\"text/css\">\n", | |
| "#T_b0d9d_row6_col1, #T_b0d9d_row7_col1, #T_b0d9d_row9_col1 {\n", | |
| " background-color: lightgreen;\n", | |
| "}\n", | |
| "</style>\n", | |
| "<table id=\"T_b0d9d\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <th id=\"T_b0d9d_level0_col0\" class=\"col_heading level0 col0\" >time</th>\n", | |
| " <th id=\"T_b0d9d_level0_col1\" class=\"col_heading level0 col1\" >event</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <td id=\"T_b0d9d_row0_col0\" class=\"data row0 col0\" >1814</td>\n", | |
| " <td id=\"T_b0d9d_row0_col1\" class=\"data row0 col1\" >True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_b0d9d_row1_col0\" class=\"data row1 col0\" >2018</td>\n", | |
| " <td id=\"T_b0d9d_row1_col1\" class=\"data row1 col1\" >True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_b0d9d_row2_col0\" class=\"data row2 col0\" >712</td>\n", | |
| " <td id=\"T_b0d9d_row2_col1\" class=\"data row2 col1\" >True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_b0d9d_row3_col0\" class=\"data row3 col0\" >1807</td>\n", | |
| " <td id=\"T_b0d9d_row3_col1\" class=\"data row3 col1\" >True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_b0d9d_row4_col0\" class=\"data row4 col0\" >772</td>\n", | |
| " <td id=\"T_b0d9d_row4_col1\" class=\"data row4 col1\" >True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_b0d9d_row5_col0\" class=\"data row5 col0\" >448</td>\n", | |
| " <td id=\"T_b0d9d_row5_col1\" class=\"data row5 col1\" >True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_b0d9d_row6_col0\" class=\"data row6 col0\" >2172</td>\n", | |
| " <td id=\"T_b0d9d_row6_col1\" class=\"data row6 col1\" >False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_b0d9d_row7_col0\" class=\"data row7 col0\" >2161</td>\n", | |
| " <td id=\"T_b0d9d_row7_col1\" class=\"data row7 col1\" >False</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_b0d9d_row8_col0\" class=\"data row8 col0\" >471</td>\n", | |
| " <td id=\"T_b0d9d_row8_col1\" class=\"data row8 col1\" >True</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td id=\"T_b0d9d_row9_col0\" class=\"data row9 col0\" >2014</td>\n", | |
| " <td id=\"T_b0d9d_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": "840593b6-53c5-4bca-9897-51e120bbb439", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| } | |
| }, | |
| "source": [ | |
| "print(f'Number of samples: {len(df_y)}')\n", | |
| "print(f'Number of right censored samples: {len(df_y.query(\"event == False\"))}')\n", | |
| "print(f'Percentage of right censored samples: {100*len(df_y.query(\"event == False\"))/len(df_y):.1f}%')" | |
| ], | |
| "execution_count": 7, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "Number of samples: 686\n", | |
| "Number of right censored samples: 387\n", | |
| "Percentage of right censored samples: 56.4%\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "VtsENFsnQhZx" | |
| }, | |
| "source": [ | |
| "There are 387 patients (56.4%) who were right censored (recurrence free) at the end of the study.\n", | |
| "\n", | |
| "Let's divide our dataset in training and test sets." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "from sklearn.preprocessing import OneHotEncoder\n", | |
| "from sklearn.preprocessing import OrdinalEncoder" | |
| ], | |
| "metadata": { | |
| "id": "PV9SQ8LZ20BL" | |
| }, | |
| "execution_count": 8, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "X[\"horTh\"] = [1 if X[\"horTh\"].iloc[i] == 'yes' else 0 for i in range(X.shape[0])]" | |
| ], | |
| "metadata": { | |
| "id": "MxHGiw0E4-hP" | |
| }, | |
| "execution_count": 9, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "X[\"menostat\"] = [1 if X[\"menostat\"].iloc[i] == 'Post' else 0 for i in range(X.shape[0])]" | |
| ], | |
| "metadata": { | |
| "id": "P_R8Fr4a5JUt" | |
| }, | |
| "execution_count": 10, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "X[\"tgrade\"] = OrdinalEncoder(categories=[['I', 'II', 'III']]).fit_transform(X[[\"tgrade\"]])" | |
| ], | |
| "metadata": { | |
| "id": "b6ABtXNK3Dd9" | |
| }, | |
| "execution_count": 11, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "X.describe().transpose().round(2).drop(columns=\"count\")" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 206 | |
| }, | |
| "id": "-s0v-Yx5N_3o", | |
| "outputId": "81c140f7-b9e4-4912-d384-a5ef6f2ac164" | |
| }, | |
| "execution_count": 5, | |
| "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", | |
| "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", | |
| "tsize 29.33 14.30 3.0 20.0 25.0 35.00 120.0" | |
| ], | |
| "text/html": [ | |
| "\n", | |
| " <div id=\"df-9b94d5de-108f-4a30-ab73-ea1b91b01006\" 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>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>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-9b94d5de-108f-4a30-ab73-ea1b91b01006')\"\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-9b94d5de-108f-4a30-ab73-ea1b91b01006 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-9b94d5de-108f-4a30-ab73-ea1b91b01006');\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>\n", | |
| " </div>\n" | |
| ], | |
| "application/vnd.google.colaboratory.intrinsic+json": { | |
| "type": "dataframe", | |
| "summary": "{\n \"name\": \"X\",\n \"rows\": 5,\n \"fields\": [\n {\n \"column\": \"mean\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 44.212057405192084,\n \"min\": 5.01,\n \"max\": 110.0,\n \"num_unique_values\": 5,\n \"samples\": [\n 96.25,\n 29.33,\n 5.01\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"std\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 93.56159853273137,\n \"min\": 5.48,\n \"max\": 202.33,\n \"num_unique_values\": 5,\n \"samples\": [\n 153.08,\n 14.3,\n 5.48\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"min\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 9.027735042633894,\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\": 17.924843095547587,\n \"min\": 1.0,\n \"max\": 46.0,\n \"num_unique_values\": 5,\n \"samples\": [\n 8.0,\n 20.0,\n 1.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"50%\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 18.201648277010516,\n \"min\": 3.0,\n \"max\": 53.0,\n \"num_unique_values\": 5,\n \"samples\": [\n 36.0,\n 25.0,\n 3.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"75%\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 52.497023725159885,\n \"min\": 7.0,\n \"max\": 131.75,\n \"num_unique_values\": 5,\n \"samples\": [\n 114.0,\n 35.0,\n 7.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"max\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1018.1370241770014,\n \"min\": 51.0,\n \"max\": 2380.0,\n \"num_unique_values\": 5,\n \"samples\": [\n 1144.0,\n 120.0,\n 51.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" | |
| } | |
| }, | |
| "metadata": {}, | |
| "execution_count": 5 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "duYhddUr_1nH", | |
| "outputId": "de301a6e-6b28-4c49-942e-1686678acd19", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| } | |
| }, | |
| "source": [ | |
| "from sklearn.model_selection import train_test_split\n", | |
| "\n", | |
| "X_trn, X_test, y_trn, y_test = train_test_split(X, y, random_state=20)\n", | |
| "\n", | |
| "print(f'Number of training samples: {len(y_trn)}')\n", | |
| "print(f'Number of test samples: {len(y_test)}')" | |
| ], | |
| "execution_count": 12, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "Number of training samples: 514\n", | |
| "Number of test samples: 172\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "3VEOV-vWb2ow" | |
| }, | |
| "source": [ | |
| "We divide the features/covariates into continuous and categorical." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "X.dtypes" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 335 | |
| }, | |
| "id": "4OqMuC40mXDb", | |
| "outputId": "ba0106d5-ced8-49f6-b43e-881d155cb3fc" | |
| }, | |
| "execution_count": 13, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "age float64\n", | |
| "estrec float64\n", | |
| "horTh int64\n", | |
| "menostat int64\n", | |
| "pnodes float64\n", | |
| "progrec float64\n", | |
| "tgrade float64\n", | |
| "tsize float64\n", | |
| "dtype: object" | |
| ], | |
| "text/html": [ | |
| "<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>0</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>age</th>\n", | |
| " <td>float64</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>estrec</th>\n", | |
| " <td>float64</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>horTh</th>\n", | |
| " <td>int64</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>menostat</th>\n", | |
| " <td>int64</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>pnodes</th>\n", | |
| " <td>float64</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>progrec</th>\n", | |
| " <td>float64</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>tgrade</th>\n", | |
| " <td>float64</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>tsize</th>\n", | |
| " <td>float64</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div><br><label><b>dtype:</b> object</label>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "execution_count": 13 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "jDjgk9PWb2o3" | |
| }, | |
| "source": [ | |
| "We use ordinal encoding for categorical features/covariates and standard scaling for continuous features/covariates." | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "N_nodxlEb2o-" | |
| }, | |
| "source": [ | |
| "# Baseline: Cox Proportional Hazards model" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "KqdChwYJb2o_" | |
| }, | |
| "source": [ | |
| "Cox Proportional Hazards model assumes that the log-hazard of a subject is a linear function of their $m$ static covariates/features $h_i, i\\in\\{1,\\ldots,m\\}$, and a population-level baseline hazard function $h_0(t)$ that changes over time:\n", | |
| "\\begin{equation}\n", | |
| "h(t|x)=h_0(t)\\exp\\left(\\sum_{i=1}^mh_i(x_i-\\bar{x_i})\\right).\n", | |
| "\\end{equation}\n", | |
| "\n", | |
| "The term *proportional hazards* refers to the assumption of a constant relationship between the dependent variable and the regression coefficients." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "77YbwMKvAFHQ", | |
| "outputId": "f3a214cd-d4c2-4c66-9c57-a466a8bf82bf", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 80 | |
| } | |
| }, | |
| "source": [ | |
| "from sklearn.pipeline import make_pipeline\n", | |
| "from sksurv.linear_model import CoxPHSurvivalAnalysis\n", | |
| "from sksurv.metrics import concordance_index_censored\n", | |
| "\n", | |
| "cox = CoxPHSurvivalAnalysis()\n", | |
| "cox.fit(X_trn, y_trn)" | |
| ], | |
| "execution_count": 14, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "CoxPHSurvivalAnalysis()" | |
| ], | |
| "text/html": [ | |
| "<style>#sk-container-id-1 {\n", | |
| " /* Definition of color scheme common for light and dark mode */\n", | |
| " --sklearn-color-text: #000;\n", | |
| " --sklearn-color-text-muted: #666;\n", | |
| " --sklearn-color-line: gray;\n", | |
| " /* Definition of color scheme for unfitted estimators */\n", | |
| " --sklearn-color-unfitted-level-0: #fff5e6;\n", | |
| " --sklearn-color-unfitted-level-1: #f6e4d2;\n", | |
| " --sklearn-color-unfitted-level-2: #ffe0b3;\n", | |
| " --sklearn-color-unfitted-level-3: chocolate;\n", | |
| " /* Definition of color scheme for fitted estimators */\n", | |
| " --sklearn-color-fitted-level-0: #f0f8ff;\n", | |
| " --sklearn-color-fitted-level-1: #d4ebff;\n", | |
| " --sklearn-color-fitted-level-2: #b3dbfd;\n", | |
| " --sklearn-color-fitted-level-3: cornflowerblue;\n", | |
| "\n", | |
| " /* Specific color for light theme */\n", | |
| " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n", | |
| " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n", | |
| " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n", | |
| " --sklearn-color-icon: #696969;\n", | |
| "\n", | |
| " @media (prefers-color-scheme: dark) {\n", | |
| " /* Redefinition of color scheme for dark theme */\n", | |
| " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n", | |
| " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n", | |
| " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n", | |
| " --sklearn-color-icon: #878787;\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 pre {\n", | |
| " padding: 0;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 input.sk-hidden--visually {\n", | |
| " border: 0;\n", | |
| " clip: rect(1px 1px 1px 1px);\n", | |
| " clip: rect(1px, 1px, 1px, 1px);\n", | |
| " height: 1px;\n", | |
| " margin: -1px;\n", | |
| " overflow: hidden;\n", | |
| " padding: 0;\n", | |
| " position: absolute;\n", | |
| " width: 1px;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-dashed-wrapped {\n", | |
| " border: 1px dashed var(--sklearn-color-line);\n", | |
| " margin: 0 0.4em 0.5em 0.4em;\n", | |
| " box-sizing: border-box;\n", | |
| " padding-bottom: 0.4em;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-container {\n", | |
| " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n", | |
| " but bootstrap.min.css set `[hidden] { display: none !important; }`\n", | |
| " so we also need the `!important` here to be able to override the\n", | |
| " default hidden behavior on the sphinx rendered scikit-learn.org.\n", | |
| " See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n", | |
| " display: inline-block !important;\n", | |
| " position: relative;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-text-repr-fallback {\n", | |
| " display: none;\n", | |
| "}\n", | |
| "\n", | |
| "div.sk-parallel-item,\n", | |
| "div.sk-serial,\n", | |
| "div.sk-item {\n", | |
| " /* draw centered vertical line to link estimators */\n", | |
| " background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n", | |
| " background-size: 2px 100%;\n", | |
| " background-repeat: no-repeat;\n", | |
| " background-position: center center;\n", | |
| "}\n", | |
| "\n", | |
| "/* Parallel-specific style estimator block */\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-parallel-item::after {\n", | |
| " content: \"\";\n", | |
| " width: 100%;\n", | |
| " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n", | |
| " flex-grow: 1;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-parallel {\n", | |
| " display: flex;\n", | |
| " align-items: stretch;\n", | |
| " justify-content: center;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " position: relative;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-parallel-item {\n", | |
| " display: flex;\n", | |
| " flex-direction: column;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n", | |
| " align-self: flex-end;\n", | |
| " width: 50%;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n", | |
| " align-self: flex-start;\n", | |
| " width: 50%;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n", | |
| " width: 0;\n", | |
| "}\n", | |
| "\n", | |
| "/* Serial-specific style estimator block */\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-serial {\n", | |
| " display: flex;\n", | |
| " flex-direction: column;\n", | |
| " align-items: center;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " padding-right: 1em;\n", | |
| " padding-left: 1em;\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n", | |
| "clickable and can be expanded/collapsed.\n", | |
| "- Pipeline and ColumnTransformer use this feature and define the default style\n", | |
| "- Estimators will overwrite some part of the style using the `sk-estimator` class\n", | |
| "*/\n", | |
| "\n", | |
| "/* Pipeline and ColumnTransformer style (default) */\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-toggleable {\n", | |
| " /* Default theme specific background. It is overwritten whether we have a\n", | |
| " specific estimator or a Pipeline/ColumnTransformer */\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| "}\n", | |
| "\n", | |
| "/* Toggleable label */\n", | |
| "#sk-container-id-1 label.sk-toggleable__label {\n", | |
| " cursor: pointer;\n", | |
| " display: flex;\n", | |
| " width: 100%;\n", | |
| " margin-bottom: 0;\n", | |
| " padding: 0.5em;\n", | |
| " box-sizing: border-box;\n", | |
| " text-align: center;\n", | |
| " align-items: start;\n", | |
| " justify-content: space-between;\n", | |
| " gap: 0.5em;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 label.sk-toggleable__label .caption {\n", | |
| " font-size: 0.6rem;\n", | |
| " font-weight: lighter;\n", | |
| " color: var(--sklearn-color-text-muted);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n", | |
| " /* Arrow on the left of the label */\n", | |
| " content: \"▸\";\n", | |
| " float: left;\n", | |
| " margin-right: 0.25em;\n", | |
| " color: var(--sklearn-color-icon);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| "}\n", | |
| "\n", | |
| "/* Toggleable content - dropdown */\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-toggleable__content {\n", | |
| " max-height: 0;\n", | |
| " max-width: 0;\n", | |
| " overflow: hidden;\n", | |
| " text-align: left;\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-toggleable__content.fitted {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-toggleable__content pre {\n", | |
| " margin: 0.2em;\n", | |
| " border-radius: 0.25em;\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n", | |
| " /* Expand drop-down */\n", | |
| " max-height: 200px;\n", | |
| " max-width: 100%;\n", | |
| " overflow: auto;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n", | |
| " content: \"▾\";\n", | |
| "}\n", | |
| "\n", | |
| "/* Pipeline/ColumnTransformer-specific style */\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Estimator-specific style */\n", | |
| "\n", | |
| "/* Colorize estimator box */\n", | |
| "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n", | |
| "#sk-container-id-1 div.sk-label label {\n", | |
| " /* The background is the default theme color */\n", | |
| " color: var(--sklearn-color-text-on-default-background);\n", | |
| "}\n", | |
| "\n", | |
| "/* On hover, darken the color of the background */\n", | |
| "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Label box, darken color on hover, fitted */\n", | |
| "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Estimator label */\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-label label {\n", | |
| " font-family: monospace;\n", | |
| " font-weight: bold;\n", | |
| " display: inline-block;\n", | |
| " line-height: 1.2em;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-label-container {\n", | |
| " text-align: center;\n", | |
| "}\n", | |
| "\n", | |
| "/* Estimator-specific */\n", | |
| "#sk-container-id-1 div.sk-estimator {\n", | |
| " font-family: monospace;\n", | |
| " border: 1px dotted var(--sklearn-color-border-box);\n", | |
| " border-radius: 0.25em;\n", | |
| " box-sizing: border-box;\n", | |
| " margin-bottom: 0.5em;\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-estimator.fitted {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "/* on hover */\n", | |
| "#sk-container-id-1 div.sk-estimator:hover {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 div.sk-estimator.fitted:hover {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n", | |
| "\n", | |
| "/* Common style for \"i\" and \"?\" */\n", | |
| "\n", | |
| ".sk-estimator-doc-link,\n", | |
| "a:link.sk-estimator-doc-link,\n", | |
| "a:visited.sk-estimator-doc-link {\n", | |
| " float: right;\n", | |
| " font-size: smaller;\n", | |
| " line-height: 1em;\n", | |
| " font-family: monospace;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " border-radius: 1em;\n", | |
| " height: 1em;\n", | |
| " width: 1em;\n", | |
| " text-decoration: none !important;\n", | |
| " margin-left: 0.5em;\n", | |
| " text-align: center;\n", | |
| " /* unfitted */\n", | |
| " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", | |
| " color: var(--sklearn-color-unfitted-level-1);\n", | |
| "}\n", | |
| "\n", | |
| ".sk-estimator-doc-link.fitted,\n", | |
| "a:link.sk-estimator-doc-link.fitted,\n", | |
| "a:visited.sk-estimator-doc-link.fitted {\n", | |
| " /* fitted */\n", | |
| " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", | |
| " color: var(--sklearn-color-fitted-level-1);\n", | |
| "}\n", | |
| "\n", | |
| "/* On hover */\n", | |
| "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n", | |
| ".sk-estimator-doc-link:hover,\n", | |
| "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n", | |
| ".sk-estimator-doc-link:hover {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-3);\n", | |
| " color: var(--sklearn-color-background);\n", | |
| " text-decoration: none;\n", | |
| "}\n", | |
| "\n", | |
| "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n", | |
| ".sk-estimator-doc-link.fitted:hover,\n", | |
| "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n", | |
| ".sk-estimator-doc-link.fitted:hover {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-3);\n", | |
| " color: var(--sklearn-color-background);\n", | |
| " text-decoration: none;\n", | |
| "}\n", | |
| "\n", | |
| "/* Span, style for the box shown on hovering the info icon */\n", | |
| ".sk-estimator-doc-link span {\n", | |
| " display: none;\n", | |
| " z-index: 9999;\n", | |
| " position: relative;\n", | |
| " font-weight: normal;\n", | |
| " right: .2ex;\n", | |
| " padding: .5ex;\n", | |
| " margin: .5ex;\n", | |
| " width: min-content;\n", | |
| " min-width: 20ex;\n", | |
| " max-width: 50ex;\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " box-shadow: 2pt 2pt 4pt #999;\n", | |
| " /* unfitted */\n", | |
| " background: var(--sklearn-color-unfitted-level-0);\n", | |
| " border: .5pt solid var(--sklearn-color-unfitted-level-3);\n", | |
| "}\n", | |
| "\n", | |
| ".sk-estimator-doc-link.fitted span {\n", | |
| " /* fitted */\n", | |
| " background: var(--sklearn-color-fitted-level-0);\n", | |
| " border: var(--sklearn-color-fitted-level-3);\n", | |
| "}\n", | |
| "\n", | |
| ".sk-estimator-doc-link:hover span {\n", | |
| " display: block;\n", | |
| "}\n", | |
| "\n", | |
| "/* \"?\"-specific style due to the `<a>` HTML tag */\n", | |
| "\n", | |
| "#sk-container-id-1 a.estimator_doc_link {\n", | |
| " float: right;\n", | |
| " font-size: 1rem;\n", | |
| " line-height: 1em;\n", | |
| " font-family: monospace;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " border-radius: 1rem;\n", | |
| " height: 1rem;\n", | |
| " width: 1rem;\n", | |
| " text-decoration: none;\n", | |
| " /* unfitted */\n", | |
| " color: var(--sklearn-color-unfitted-level-1);\n", | |
| " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 a.estimator_doc_link.fitted {\n", | |
| " /* fitted */\n", | |
| " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", | |
| " color: var(--sklearn-color-fitted-level-1);\n", | |
| "}\n", | |
| "\n", | |
| "/* On hover */\n", | |
| "#sk-container-id-1 a.estimator_doc_link:hover {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-3);\n", | |
| " color: var(--sklearn-color-background);\n", | |
| " text-decoration: none;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-3);\n", | |
| "}\n", | |
| "</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 fitted 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 fitted sk-toggleable__label-arrow\"><div><div>CoxPHSurvivalAnalysis</div></div><div><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>CoxPHSurvivalAnalysis()</pre></div> </div></div></div></div>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "execution_count": 14 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "ci_cox = concordance_index_censored(y_test[\"cens\"], y_test[\"time\"], cox.predict(X_test))\n", | |
| "print(f'The c-index of Cox is given by {ci_cox[0]:.3f}')" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "oVdrGM0NtWdR", | |
| "outputId": "b6e688a7-e628-4f23-c0be-48ee18234dc3" | |
| }, | |
| "execution_count": 15, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "The c-index of Cox is given by 0.665\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## 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", | |
| "The Brier score 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": [ | |
| "times = np.arange(365, 1826)" | |
| ], | |
| "metadata": { | |
| "id": "zoUFRn2yqLPF" | |
| }, | |
| "execution_count": 16, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "survs = cox.predict_survival_function(X_test)" | |
| ], | |
| "metadata": { | |
| "id": "06i_zOUBqMUt" | |
| }, | |
| "execution_count": 17, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "preds = np.asarray([[fn(t) for t in times] for fn in survs])" | |
| ], | |
| "metadata": { | |
| "id": "prIyWOtMqe7s" | |
| }, | |
| "execution_count": 18, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "from sksurv.metrics import integrated_brier_score\n", | |
| "\n", | |
| "integrated_brier_score(y_trn, y_test, preds, times).item()" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "Qyvn1TexqkoO", | |
| "outputId": "e8e42660-dbba-4b62-a2dd-f717e8717d7c" | |
| }, | |
| "execution_count": 27, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "0.17509710701666076" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "execution_count": 27 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "%pip install -q eli5" | |
| ], | |
| "metadata": { | |
| "id": "yU-3yjgDr3N7" | |
| }, | |
| "execution_count": 21, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "from eli5.sklearn import PermutationImportance" | |
| ], | |
| "metadata": { | |
| "id": "k6mzeqdNr7ZB" | |
| }, | |
| "execution_count": 22, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "perm = PermutationImportance(\n", | |
| " cox, n_iter=100, random_state=42).fit(X_trn,y_trn)" | |
| ], | |
| "metadata": { | |
| "id": "WYW6dDDvsBNe" | |
| }, | |
| "execution_count": 23, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "data = perm.results_\n", | |
| "data = pd.DataFrame(data, columns=X_trn.columns)\n", | |
| "meds = data.median()\n", | |
| "meds = meds.sort_values(ascending=False)\n", | |
| "data = data[meds.index]" | |
| ], | |
| "metadata": { | |
| "id": "n5aKc--PsMHm" | |
| }, | |
| "execution_count": 24, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "fig, ax = plt.subplots(figsize=(10,7))\n", | |
| "data.boxplot(ax=ax)\n", | |
| "ax.set_title('Permutation Importance')\n", | |
| "plt.show()" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 622 | |
| }, | |
| "id": "oBbnA1ZMsQeY", | |
| "outputId": "858d6b07-2204-4884-af15-362bd3be9c31" | |
| }, | |
| "execution_count": 26, | |
| "outputs": [ | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "text/plain": [ | |
| "<Figure size 1000x700 with 1 Axes>" | |
| ], | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0MAAAJdCAYAAADwa6ywAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAYFpJREFUeJzt3XlcVnX+//8n+6a4C2om5IYmyaipmIqWS6YlmVZaaVY2zYylg1qjlWvFlMvYtDn2+bVMk+lkDjVuSSRqLplopSa4hEsFbqUEGLK8f3/45ZouQeUiLo8X53G/3bwh53qf93mf87quC56c67yPlzHGCAAAAABsxtvqAQAAAACAFQhDAAAAAGyJMAQAAADAlghDAAAAAGyJMAQAAADAlghDAAAAAGyJMAQAAADAlghDAAAAAGyJMAQAAADAlghDAIDL6uDBg/Ly8tJbb71l9VAAADZHGAKA3+itt96Sl5eX419gYKBatWqlsWPH6ujRo1YPr1K++eYbTZ8+XQcPHqx0H4sWLdL8+fOrbExV4f7771eNGjWsHkal5efna/r06UpNTbV6KABQLfhaPQAAqC5mzpypyMhI/fLLL/rss8/02muvaeXKldq1a5eCg4OtHp5LvvnmG82YMUO9evVSREREpfpYtGiRdu3apfHjxzstb9asmc6cOSM/P7/fPlCbyc/P14wZMyRJvXr1snYwAFANEIYAoIoMGDBAnTp1kiQ99NBDqlevnubNm6cPP/xQw4cP/0195+fne1ygupDSs2eouJKSEp09e9bqYQBAtcPH5ADATW688UZJUmZmpmPZv/71L3Xs2FFBQUGqW7eu7r77bh05csRpvV69eqldu3ZKS0tTz549FRwcrClTpjiutZkzZ45eeeUVXXPNNQoODla/fv105MgRGWM0a9YsXXXVVQoKCtLgwYP1448/OvXt5eWl6dOnlxlrRESE7r//fknnPvY3bNgwSVLv3r0dH/8r/WjWhx9+qIEDB6px48YKCAhQ8+bNNWvWLBUXFzvtw4oVK3To0CHH+qVnmC50zdCnn36qHj16KCQkRLVr19bgwYO1Z88epzbTp0+Xl5eX9u/fr/vvv1+1a9dWrVq1NHr0aOXn51eoLuXt+6BBg5SamqpOnTopKChI0dHRjv1dtmyZoqOjFRgYqI4dO2rHjh1O65d+9O7bb79V//79FRISosaNG2vmzJkyxji1zcvL04QJE9S0aVMFBASodevWmjNnTpl2Xl5eGjt2rN59911de+21CggI0IIFC9SgQQNJ0owZMxzHtbSeX3/9te6//35dc801CgwMVHh4uB544AGdPHnyNx3Df/3rX+rcubOCg4NVp04d9ezZU2vWrHFqs2rVKkftatasqYEDB2r37t0u1wIALjfODAGAmxw4cECSVK9ePUnSs88+q6efflp33nmnHnroIR0/flwvvfSSevbsqR07dqh27dqOdU+ePKkBAwbo7rvv1r333quwsDDHY++++67Onj2rRx99VD/++KNeeOEF3XnnnbrxxhuVmpqqJ554Qvv379dLL72kiRMn6o033nBp3D179tRjjz2mv//975oyZYratGkjSY6vb731lmrUqKGEhATVqFFDn376qaZOnaqcnBzNnj1bkvTkk0/q9OnT+u677/S3v/1Nki56rc4nn3yiAQMG6JprrtH06dN15swZvfTSS7rhhhu0ffv2Mh/Vu/POOxUZGanExERt375d//d//6eGDRvq+eefd2lfS+3fv18jRozQ73//e917772aM2eObr31Vi1YsEBTpkzRH//4R0lSYmKi7rzzTmVkZMjb+39/TywuLtbNN9+srl276oUXXtDq1as1bdo0FRUVaebMmZIkY4xuu+02rV27Vg8++KBiYmL08ccfa9KkSfr+++8dx6nUp59+qn//+98aO3as6tevr/bt2+u1117TH/7wB91+++0aMmSIJOm6666TJCUnJ+vbb7/V6NGjFR4ert27d2vhwoXavXu3tmzZIi8vL5eP4YwZMzR9+nR169ZNM2fOlL+/vz7//HN9+umn6tevnyTpnXfe0ahRo9S/f389//zzys/P12uvvabu3btrx44dlf6YJQBcFgYA8Ju8+eabRpL55JNPzPHjx82RI0fM4sWLTb169UxQUJD57rvvzMGDB42Pj4959tlnndbduXOn8fX1dVoeFxdnJJkFCxY4tc3MzDSSTIMGDcypU6ccyydPnmwkmfbt25vCwkLH8uHDhxt/f3/zyy+/OJZJMtOmTSuzD82aNTOjRo1yfP/+++8bSWbt2rVl2ubn55dZ9vvf/94EBwc7bWvgwIGmWbNmZdqW7sebb77pWBYTE2MaNmxoTp486Vj21VdfGW9vbzNy5EjHsmnTphlJ5oEHHnDq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ZcsW07FjRxMXF+dYf9q0aSYkJMTcfPPNZvv27earr75y6v/NN980tWrVKrPdtWvXGkmmS5cuJjU11ezevdv06NHDdOvWzc17fGW52Pvyxd6Tt27daiSZTz75xGRlZZmTJ08aY4wZNWqUqVGjhrnvvvvMrl27zK5duyr0HH/11VdNYGCgmT9/vsnIyDBbt251+rnuKeLi4kzNmjXNrFmzzN69e82sWbOMj4+PGTBggFm4cKHZu3ev+cMf/mDq1atn8vLyzE8//WQaNGhgJk+ebPbs2WO2b99u+vbta3r37u3U54VeI8aYCr1Orr32WnPvvfeaPXv2mL1795p///vf5ssvvzQFBQVm/vz5JjQ01PGe+PPPPxtjjPn//r//z6xcudIcOHDAbN682cTGxpoBAwYYY4wpKioyH3zwgZFkMjIyTFZWljl16tTlO9CX2dKlS80HH3xg9u3bZ3bs2GFuvfVWEx0dbYqLi83p06dN3bp1zb333mt2795tVq5caVq1auX0M7oidfY0hKEKiIuLM23atDElJSWOZU888YRp06aNMebcL+Dx8fFO64wYMcL07dvXadmkSZNM27ZtjTHG7Nmzx0gyX3zxhePxffv2GUllwtD48eOd+rnpppvMc88957TsnXfeMY0aNTLGGPPxxx8bb29vk5GRUck9vnJVpBb33nuv47GSkhLTsGFD89prrxljjFm4cKGpU6eOyc3NdbRZsWKF8fb2NtnZ2cYYYxo1amReeOEFx+OFhYXmqquucoShX375xQQHB5tNmzY5je3BBx80w4cPN8YYc+utt5rRo0dX4Z57lri4ODNu3DjH9xc7HueHoV/74IMPTGBgoPnss8+MMcYcOnTI+Pj4mO+//96p3U033WQmT55cZeP3FOcf5yeeeMK0a9fOqc2TTz5ZJgxJMl9++eVF+y4uLjY1a9Y0//3vf40x595XfH19nY79qlWrnMLQO++8Y1q3bu30+iwoKDBBQUHm448//g176hni4uJM9+7dnZZdf/315oknnjBr1qwxPj4+5vDhw47Hdu/ebSSZrVu3GmPOhSE/Pz9z7Nixcvu/VBj65JNPHMtWrFhhJJkzZ85UwZ5d+S71vlyZ96BRo0aZsLAwpyBfked448aNzZNPPllFe2ad85/PRUVFJiQkxNx3332OZVlZWUaS2bx5s5k1a5bp16+fUx9HjhxxhIzy+jTmf68RY0yFXic1a9Y0b731VrljvtBr5HxffPGFkeQIS6WvodL3STs5fvy4kWR27txpXnvtNVOvXj2n943XX3/d6fVRkTp7Gj4mV0Fdu3aVl5eX4/vY2Fjt27dPxcXFkqROnTo5td+zZ49uuOEGp2U33HCDY52MjAz5+vqqQ4cOjsdbtGihOnXqlNn2+X1/9dVXmjlzpmrUqOH4N2bMGGVlZSk/P19ffvmlrrrqKrVq1eo37/eV6FK1uO666xyPlX6kpPR0+J49e9S+fXuFhIQ42txwww0qKSlRRkaGTp8+raysLHXp0sXxuK+vr1MN9u/fr/z8fPXt29epBv/85z8dp5r/8Ic/aPHixYqJidHjjz+uTZs2uedgeIjKHI8dO3bovvvu08svv+x4Le3cuVPFxcVq1aqV07Fft26d02l+u8rIyND111/vtKxz585l2vn7+zu9TiTp6NGjGjNmjFq2bKlatWopNDRUubm5Onz4sKRzr52mTZuqcePGjnViY2Od+vjqq6+0f/9+1axZ01GbunXr6pdffrFNfc4/ro0aNdKxY8ccx69p06aOx9q2bavatWtrz549jmXNmjVTgwYNfvO2GzVqJEmO977q7lLvy5V9T46Ojna6TuhSz/Fjx47phx9+0E033eSuXb2sfv2c8vHxUb169RQdHe1YFhYWJunc8+yrr77S2rVrnY5/VFSUJDm9/i/0GpFUoddJQkKCHnroIfXp00d//etfK/TekpaWpltvvVVXX321atasqbi4OElyvL/Zyb59+zR8+HBdc801Cg0NVUREhKRzxyIjI0PXXXedAgMDHe3P/xlS0Tp7EiZQqCK//uXa3X3n5uZqxowZGjJkSJm2gYGBCgoKcttYPMH5E0x4eXmppKSkyvovvb5oxYoVatKkidNjAQEBkqQBAwbo0KFDWrlypZKTk3XTTTfpT3/6k+bMmVNl4/Akrh6P7Oxs3XbbbXrooYf04IMPOpbn5ubKx8dHaWlp8vHxcVrn19dO4OKCgoKc/qAgSaNGjdLJkyf14osvqlmzZgoICFBsbKzOnj1b4X5zc3PVsWNHvfvuu2Ueq+wv+J7mt77//JafJb/edml9q/K970p2qfflpk2bVuo9ubyfvxd7jle3iUjKez5f6HmWm5urW2+9Vc8//3yZfkrD+YX6dOV5On36dI0YMUIrVqzQqlWrNG3aNC1evFi33357ue3z8vLUv39/9e/fX++++64aNGigw4cPq3///i69v1UXt956q5o1a6bXX39djRs3VklJidq1a1fhY1HROnsSwlAFff75507fb9myRS1btizzC1mpNm3aaOPGjU7LNm7cqFatWsnHx0etW7dWUVGRduzYoY4dO0o695etn3766ZJj6dChgzIyMtSiRYtyH7/uuuv03Xffae/evdXy7JCrtfi1Nm3a6K233lJeXp7jh9zGjRvl7e2t1q1bq1atWmrUqJE+//xz9ezZU5JUVFSktLQ0x1m8X190XvrXpfI0aNBAo0aN0qhRo9SjRw9NmjTJNmHI39/fcaauVEWPxy+//KLBgwcrKipK8+bNc3rsd7/7nYqLi3Xs2DH16NHDrfvgCc4/zq1bt9bKlSud2nzxxRcV6mvjxo169dVXdcstt0g6d5H4ry+IbdOmjY4cOaKsrCzHD7wtW7Y49dGhQwctWbJEDRs2VGhoaKX2qboqPX5Hjhxx/NX7m2++0alTp9S2bVuLR+f5KvK+fKH3oNIzP+e/Z5WnIs/xiIgIpaSkOC7Kt4sOHTrogw8+UEREhHx9K/frZUVfJ61atVKrVq305z//WcOHD9ebb76p22+/vdyfPenp6Tp58qT++te/Ovo8fwZGV54DnuzkyZPKyMjQ66+/7vgZ+tlnnzkeb926tf71r3+poKDA8cfd83+GVEWdrzTV608YbnT48GElJCQoIyND7733nl566SWNGzfugu0nTJiglJQUzZo1S3v37tXbb7+tl19+WRMnTpQkRUVFqU+fPnr44Ye1detW7dixQw8//HC5f7E939SpU/XPf/5TM2bM0O7du7Vnzx4tXrxYTz31lCQpLi5OPXv21B133KHk5GRlZmZq1apVWr16ddUdEAu5Wotfu+eeexQYGKhRo0Zp165dWrt2rR599FHdd999jtP948aN01//+lclJSUpPT1df/zjH53uPVCzZk1NnDhRf/7zn/X222/rwIED2r59u1566SW9/fbbks7V6MMPP9T+/fu1e/duLV++XG3atKnyY3GlioiI0Oeff66DBw/qxIkTLh2P3//+9zpy5Ij+/ve/6/jx48rOzlZ2drbOnj2rVq1a6Z577tHIkSO1bNkyZWZmauvWrUpMTNSKFSsu815a7/zjPGbMGKWnp+uJJ57Q3r179e9//1tvvfWWJF3yfaVly5Z65513tGfPHn3++ee65557nM4y9+nTR61atdKoUaP01VdfacOGDXryySed+rjnnntUv359DR48WBs2bFBmZqZSU1P12GOP6bvvvqvy/fckffr0UXR0tO655x5t375dW7du1ciRIxUXF1fmo9Bw3aXely/2HtSwYUMFBQVp9erVOnr0qE6fPn3B7VTkOT59+nTNnTtXf//737Vv3z7HOKq7P/3pT/rxxx81fPhwffHFFzpw4IA+/vhjjR49usIh41KvkzNnzmjs2LFKTU3VoUOHtHHjRn3xxReOWkZERCg3N1cpKSk6ceKE8vPzdfXVV8vf318vvfSSvv32W3300UeaNWuW03abNWsmLy8vLV++XMePH3eaYbY6qVOnjurVq6eFCxdq//79+vTTT5WQkOB4fMSIESopKdHDDz+sPXv26OOPP3b80bL0Z0hV1PmKY/VFS54gLi7O/PGPfzSPPPKICQ0NNXXq1DFTpkxxXEDZrFmzcmeKWbp0qWnbtq3x8/MzV199tZk9e7bT4z/88IMZMGCACQgIMM2aNTOLFi0yDRs2NAsWLHC00a8uTv611atXm27dupmgoCATGhpqOnfu7JhRzRhjTp48aUaPHm3q1atnAgMDTbt27czy5cur5oBYqDK1aN++vZk2bZrj+6+//tr07t3bBAYGmrp165oxY8Y4LqI05tyECePGjTOhoaGmdu3aJiEhwYwcOdJpNrmSkhIzf/5807p1a+Pn52caNGhg+vfvb9atW2eMOXeBYZs2bUxQUJCpW7euGTx4sPn222/ddlyuNBkZGaZr164mKCjISLro8Tj/4uVmzZoZSWX+rV271hhzbsayqVOnmoiICOPn52caNWpkbr/9dvP1119btLfWOf84Z2Zmmg8//NC0aNHCBAQEmF69epnXXnvN6UL6C11gvH37dtOpUycTGBhoWrZsad5///0yr6eMjAzTvXt34+/vb1q1amVWr15d5j0qKyvLjBw50tSvX98EBASYa665xowZM8acPn3azUfDeudPaGGMMYMHD3bMVnno0CFz2223mZCQEFOzZk0zbNgwx8QtxpybQKF9+/YX7P9SEyj8+uLvHTt2OJ4TdnGx9+VLvSe//vrrpmnTpsbb29sxc9moUaOc3vdLVeQ5vmDBAsc4GjVqZB599FF3736VK+/5XN7P2F+/B+zdu9fcfvvtpnbt2iYoKMhERUWZ8ePHO35GX+o1YszFXycFBQXm7rvvNk2bNjX+/v6mcePGZuzYsU4X/D/yyCOmXr16RpLjZ/+iRYtMRESECQgIMLGxseajjz4qM2nGzJkzTXh4uPHy8nIaT3WTnJxs2rRpYwICAsx1111nUlNTnWq4ceNGc9111xl/f3/TsWNHs2jRIiPJMSuvMZeus6fxMua8G6igjF69eikmJsbp/j/u8N1336lp06b65JNPqs3Fl1XtctUCqC6effZZLViwQEeOHLF6KAAAD/Puu+867t9UXa9Jrx4f9vNQn376qXJzcxUdHa2srCw9/vjjioiIcFyrAgCuevXVV3X99derXr162rhxo2bPnu2RN3wEAFx+//znP3XNNdeoSZMm+uqrr/TEE0/ozjvvrLZBSCIMWaqwsFBTpkzRt99+q5o1a6pbt2569913y8y0AgAVtW/fPj3zzDP68ccfdfXVV2vChAmaPHmy1cMCAHiA7OxsTZ06VdnZ2WrUqJGGDRumZ5991uphuRUfkwMAAABgS8wmBwAAAMCWCEMAAAAAbIkwBAAAAMCWCEMAAAAAbIkwBAAAAMCWCEMAAAAAbIkwBAAAAMCWCEMAAAAAbIkwBAAAAMCW/n8xiPL9XycfFgAAAABJRU5ErkJggg==\n" | |
| }, | |
| "metadata": {} | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "ZNHQ-bkWALNy", | |
| "outputId": "d3e3a725-a4ea-45f2-8408-7893f3bf8bef", | |
| "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_['alpha']}\"\n", | |
| ")" | |
| ], | |
| "execution_count": 45, | |
| "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: 39.67605077052987\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "MrhAveCQAdxF", | |
| "outputId": "2e6be89e-ca58-4cc0-eb7a-abe260fb59ad", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| } | |
| }, | |
| "source": [ | |
| "alpha = model_random_search.best_params_['alpha']\n", | |
| "cox_best = make_pipeline(CoxPHSurvivalAnalysis(alpha=alpha))\n", | |
| "cox_best.fit(X_trn, y_trn)\n", | |
| "\n", | |
| "ci_cox = concordance_index_censored(y_test[\"cens\"], y_test[\"time\"], cox_best.predict(X_test))\n", | |
| "print(f'The c-index of Cox is given by {ci_cox[0]:.3f}')" | |
| ], | |
| "execution_count": 46, | |
| "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": 28, | |
| "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": 80 | |
| }, | |
| "id": "vU06jwE7Kuec", | |
| "outputId": "5dc70f5b-0b51-4c9b-e6ad-d1afb1e8908b" | |
| }, | |
| "execution_count": 29, | |
| "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 {\n", | |
| " /* Definition of color scheme common for light and dark mode */\n", | |
| " --sklearn-color-text: #000;\n", | |
| " --sklearn-color-text-muted: #666;\n", | |
| " --sklearn-color-line: gray;\n", | |
| " /* Definition of color scheme for unfitted estimators */\n", | |
| " --sklearn-color-unfitted-level-0: #fff5e6;\n", | |
| " --sklearn-color-unfitted-level-1: #f6e4d2;\n", | |
| " --sklearn-color-unfitted-level-2: #ffe0b3;\n", | |
| " --sklearn-color-unfitted-level-3: chocolate;\n", | |
| " /* Definition of color scheme for fitted estimators */\n", | |
| " --sklearn-color-fitted-level-0: #f0f8ff;\n", | |
| " --sklearn-color-fitted-level-1: #d4ebff;\n", | |
| " --sklearn-color-fitted-level-2: #b3dbfd;\n", | |
| " --sklearn-color-fitted-level-3: cornflowerblue;\n", | |
| "\n", | |
| " /* Specific color for light theme */\n", | |
| " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n", | |
| " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n", | |
| " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n", | |
| " --sklearn-color-icon: #696969;\n", | |
| "\n", | |
| " @media (prefers-color-scheme: dark) {\n", | |
| " /* Redefinition of color scheme for dark theme */\n", | |
| " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n", | |
| " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n", | |
| " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n", | |
| " --sklearn-color-icon: #878787;\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 pre {\n", | |
| " padding: 0;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 input.sk-hidden--visually {\n", | |
| " border: 0;\n", | |
| " clip: rect(1px 1px 1px 1px);\n", | |
| " clip: rect(1px, 1px, 1px, 1px);\n", | |
| " height: 1px;\n", | |
| " margin: -1px;\n", | |
| " overflow: hidden;\n", | |
| " padding: 0;\n", | |
| " position: absolute;\n", | |
| " width: 1px;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-dashed-wrapped {\n", | |
| " border: 1px dashed var(--sklearn-color-line);\n", | |
| " margin: 0 0.4em 0.5em 0.4em;\n", | |
| " box-sizing: border-box;\n", | |
| " padding-bottom: 0.4em;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-container {\n", | |
| " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n", | |
| " but bootstrap.min.css set `[hidden] { display: none !important; }`\n", | |
| " so we also need the `!important` here to be able to override the\n", | |
| " default hidden behavior on the sphinx rendered scikit-learn.org.\n", | |
| " See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n", | |
| " display: inline-block !important;\n", | |
| " position: relative;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-text-repr-fallback {\n", | |
| " display: none;\n", | |
| "}\n", | |
| "\n", | |
| "div.sk-parallel-item,\n", | |
| "div.sk-serial,\n", | |
| "div.sk-item {\n", | |
| " /* draw centered vertical line to link estimators */\n", | |
| " background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n", | |
| " background-size: 2px 100%;\n", | |
| " background-repeat: no-repeat;\n", | |
| " background-position: center center;\n", | |
| "}\n", | |
| "\n", | |
| "/* Parallel-specific style estimator block */\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-parallel-item::after {\n", | |
| " content: \"\";\n", | |
| " width: 100%;\n", | |
| " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n", | |
| " flex-grow: 1;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-parallel {\n", | |
| " display: flex;\n", | |
| " align-items: stretch;\n", | |
| " justify-content: center;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " position: relative;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-parallel-item {\n", | |
| " display: flex;\n", | |
| " flex-direction: column;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n", | |
| " align-self: flex-end;\n", | |
| " width: 50%;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n", | |
| " align-self: flex-start;\n", | |
| " width: 50%;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n", | |
| " width: 0;\n", | |
| "}\n", | |
| "\n", | |
| "/* Serial-specific style estimator block */\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-serial {\n", | |
| " display: flex;\n", | |
| " flex-direction: column;\n", | |
| " align-items: center;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " padding-right: 1em;\n", | |
| " padding-left: 1em;\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n", | |
| "clickable and can be expanded/collapsed.\n", | |
| "- Pipeline and ColumnTransformer use this feature and define the default style\n", | |
| "- Estimators will overwrite some part of the style using the `sk-estimator` class\n", | |
| "*/\n", | |
| "\n", | |
| "/* Pipeline and ColumnTransformer style (default) */\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-toggleable {\n", | |
| " /* Default theme specific background. It is overwritten whether we have a\n", | |
| " specific estimator or a Pipeline/ColumnTransformer */\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| "}\n", | |
| "\n", | |
| "/* Toggleable label */\n", | |
| "#sk-container-id-2 label.sk-toggleable__label {\n", | |
| " cursor: pointer;\n", | |
| " display: flex;\n", | |
| " width: 100%;\n", | |
| " margin-bottom: 0;\n", | |
| " padding: 0.5em;\n", | |
| " box-sizing: border-box;\n", | |
| " text-align: center;\n", | |
| " align-items: start;\n", | |
| " justify-content: space-between;\n", | |
| " gap: 0.5em;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 label.sk-toggleable__label .caption {\n", | |
| " font-size: 0.6rem;\n", | |
| " font-weight: lighter;\n", | |
| " color: var(--sklearn-color-text-muted);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n", | |
| " /* Arrow on the left of the label */\n", | |
| " content: \"▸\";\n", | |
| " float: left;\n", | |
| " margin-right: 0.25em;\n", | |
| " color: var(--sklearn-color-icon);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| "}\n", | |
| "\n", | |
| "/* Toggleable content - dropdown */\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-toggleable__content {\n", | |
| " max-height: 0;\n", | |
| " max-width: 0;\n", | |
| " overflow: hidden;\n", | |
| " text-align: left;\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-toggleable__content.fitted {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-toggleable__content pre {\n", | |
| " margin: 0.2em;\n", | |
| " border-radius: 0.25em;\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n", | |
| " /* Expand drop-down */\n", | |
| " max-height: 200px;\n", | |
| " max-width: 100%;\n", | |
| " overflow: auto;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n", | |
| " content: \"▾\";\n", | |
| "}\n", | |
| "\n", | |
| "/* Pipeline/ColumnTransformer-specific style */\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Estimator-specific style */\n", | |
| "\n", | |
| "/* Colorize estimator box */\n", | |
| "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n", | |
| "#sk-container-id-2 div.sk-label label {\n", | |
| " /* The background is the default theme color */\n", | |
| " color: var(--sklearn-color-text-on-default-background);\n", | |
| "}\n", | |
| "\n", | |
| "/* On hover, darken the color of the background */\n", | |
| "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Label box, darken color on hover, fitted */\n", | |
| "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Estimator label */\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-label label {\n", | |
| " font-family: monospace;\n", | |
| " font-weight: bold;\n", | |
| " display: inline-block;\n", | |
| " line-height: 1.2em;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-label-container {\n", | |
| " text-align: center;\n", | |
| "}\n", | |
| "\n", | |
| "/* Estimator-specific */\n", | |
| "#sk-container-id-2 div.sk-estimator {\n", | |
| " font-family: monospace;\n", | |
| " border: 1px dotted var(--sklearn-color-border-box);\n", | |
| " border-radius: 0.25em;\n", | |
| " box-sizing: border-box;\n", | |
| " margin-bottom: 0.5em;\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-estimator.fitted {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "/* on hover */\n", | |
| "#sk-container-id-2 div.sk-estimator:hover {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 div.sk-estimator.fitted:hover {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n", | |
| "\n", | |
| "/* Common style for \"i\" and \"?\" */\n", | |
| "\n", | |
| ".sk-estimator-doc-link,\n", | |
| "a:link.sk-estimator-doc-link,\n", | |
| "a:visited.sk-estimator-doc-link {\n", | |
| " float: right;\n", | |
| " font-size: smaller;\n", | |
| " line-height: 1em;\n", | |
| " font-family: monospace;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " border-radius: 1em;\n", | |
| " height: 1em;\n", | |
| " width: 1em;\n", | |
| " text-decoration: none !important;\n", | |
| " margin-left: 0.5em;\n", | |
| " text-align: center;\n", | |
| " /* unfitted */\n", | |
| " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", | |
| " color: var(--sklearn-color-unfitted-level-1);\n", | |
| "}\n", | |
| "\n", | |
| ".sk-estimator-doc-link.fitted,\n", | |
| "a:link.sk-estimator-doc-link.fitted,\n", | |
| "a:visited.sk-estimator-doc-link.fitted {\n", | |
| " /* fitted */\n", | |
| " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", | |
| " color: var(--sklearn-color-fitted-level-1);\n", | |
| "}\n", | |
| "\n", | |
| "/* On hover */\n", | |
| "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n", | |
| ".sk-estimator-doc-link:hover,\n", | |
| "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n", | |
| ".sk-estimator-doc-link:hover {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-3);\n", | |
| " color: var(--sklearn-color-background);\n", | |
| " text-decoration: none;\n", | |
| "}\n", | |
| "\n", | |
| "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n", | |
| ".sk-estimator-doc-link.fitted:hover,\n", | |
| "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n", | |
| ".sk-estimator-doc-link.fitted:hover {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-3);\n", | |
| " color: var(--sklearn-color-background);\n", | |
| " text-decoration: none;\n", | |
| "}\n", | |
| "\n", | |
| "/* Span, style for the box shown on hovering the info icon */\n", | |
| ".sk-estimator-doc-link span {\n", | |
| " display: none;\n", | |
| " z-index: 9999;\n", | |
| " position: relative;\n", | |
| " font-weight: normal;\n", | |
| " right: .2ex;\n", | |
| " padding: .5ex;\n", | |
| " margin: .5ex;\n", | |
| " width: min-content;\n", | |
| " min-width: 20ex;\n", | |
| " max-width: 50ex;\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " box-shadow: 2pt 2pt 4pt #999;\n", | |
| " /* unfitted */\n", | |
| " background: var(--sklearn-color-unfitted-level-0);\n", | |
| " border: .5pt solid var(--sklearn-color-unfitted-level-3);\n", | |
| "}\n", | |
| "\n", | |
| ".sk-estimator-doc-link.fitted span {\n", | |
| " /* fitted */\n", | |
| " background: var(--sklearn-color-fitted-level-0);\n", | |
| " border: var(--sklearn-color-fitted-level-3);\n", | |
| "}\n", | |
| "\n", | |
| ".sk-estimator-doc-link:hover span {\n", | |
| " display: block;\n", | |
| "}\n", | |
| "\n", | |
| "/* \"?\"-specific style due to the `<a>` HTML tag */\n", | |
| "\n", | |
| "#sk-container-id-2 a.estimator_doc_link {\n", | |
| " float: right;\n", | |
| " font-size: 1rem;\n", | |
| " line-height: 1em;\n", | |
| " font-family: monospace;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " border-radius: 1rem;\n", | |
| " height: 1rem;\n", | |
| " width: 1rem;\n", | |
| " text-decoration: none;\n", | |
| " /* unfitted */\n", | |
| " color: var(--sklearn-color-unfitted-level-1);\n", | |
| " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 a.estimator_doc_link.fitted {\n", | |
| " /* fitted */\n", | |
| " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", | |
| " color: var(--sklearn-color-fitted-level-1);\n", | |
| "}\n", | |
| "\n", | |
| "/* On hover */\n", | |
| "#sk-container-id-2 a.estimator_doc_link:hover {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-3);\n", | |
| " color: var(--sklearn-color-background);\n", | |
| " text-decoration: none;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-3);\n", | |
| "}\n", | |
| "</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 fitted 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 fitted sk-toggleable__label-arrow\"><div><div>RandomSurvivalForest</div></div><div><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><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).item()" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "LJ0Tp63pKvMJ", | |
| "outputId": "94fd7eaa-f860-43a2-8345-5e2da78cdb4e" | |
| }, | |
| "execution_count": 31, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "0.6785901467505241" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "execution_count": 31 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "ci_cox = concordance_index_censored(y_test[\"cens\"], y_test[\"time\"], rsf.predict(X_test))\n", | |
| "print(f'The c-index of Cox is given by {ci_cox[0]:.3f}')" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "Y1hNGO_QO2pW", | |
| "outputId": "f091984b-f3f4-4dc0-9e2b-64d09b21d51b" | |
| }, | |
| "execution_count": 32, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "The c-index of Cox is given by 0.679\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "times = np.arange(365, 1826)" | |
| ], | |
| "metadata": { | |
| "id": "XHsIhuW7PHik" | |
| }, | |
| "execution_count": 33, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "survs = rsf.predict_survival_function(X_test)" | |
| ], | |
| "metadata": { | |
| "id": "iSZ0pa17PSJS" | |
| }, | |
| "execution_count": 34, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "preds = np.asarray([[fn(t) for t in times] for fn in survs])" | |
| ], | |
| "metadata": { | |
| "id": "np-god8mPW5W" | |
| }, | |
| "execution_count": 35, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "integrated_brier_score(y_trn, y_test, preds, times).item()" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "U1avp5nfPaOS", | |
| "outputId": "e07e050d-28d5-4d43-c265-ad8b49890881" | |
| }, | |
| "execution_count": 37, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "0.17664251295573888" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "execution_count": 37 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "param_distributions = {\n", | |
| " 'min_samples_leaf': [3, 7, 15],\n", | |
| " 'max_depth': [3, 7, None]\n", | |
| "}\n", | |
| "\n", | |
| "model_random_search = RandomizedSearchCV(\n", | |
| " rsf, param_distributions=param_distributions, n_iter=50, n_jobs=-1, cv=3, random_state=42)\n", | |
| "model_random_search.fit(X_trn, y_trn)" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 244 | |
| }, | |
| "id": "QjiQ8TfBPfZg", | |
| "outputId": "7020ee60-1b9f-4cea-c3f2-5be37822fb6d" | |
| }, | |
| "execution_count": 47, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stderr", | |
| "text": [ | |
| "/usr/local/lib/python3.12/dist-packages/sklearn/model_selection/_search.py:317: UserWarning: The total space of parameters 9 is smaller than n_iter=50. Running 9 iterations. For exhaustive searches, use GridSearchCV.\n", | |
| " warnings.warn(\n" | |
| ] | |
| }, | |
| { | |
| "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=50, n_jobs=-1,\n", | |
| " param_distributions={'max_depth': [3, 7, None],\n", | |
| " 'min_samples_leaf': [3, 7, 15]},\n", | |
| " random_state=42)" | |
| ], | |
| "text/html": [ | |
| "<style>#sk-container-id-3 {\n", | |
| " /* Definition of color scheme common for light and dark mode */\n", | |
| " --sklearn-color-text: #000;\n", | |
| " --sklearn-color-text-muted: #666;\n", | |
| " --sklearn-color-line: gray;\n", | |
| " /* Definition of color scheme for unfitted estimators */\n", | |
| " --sklearn-color-unfitted-level-0: #fff5e6;\n", | |
| " --sklearn-color-unfitted-level-1: #f6e4d2;\n", | |
| " --sklearn-color-unfitted-level-2: #ffe0b3;\n", | |
| " --sklearn-color-unfitted-level-3: chocolate;\n", | |
| " /* Definition of color scheme for fitted estimators */\n", | |
| " --sklearn-color-fitted-level-0: #f0f8ff;\n", | |
| " --sklearn-color-fitted-level-1: #d4ebff;\n", | |
| " --sklearn-color-fitted-level-2: #b3dbfd;\n", | |
| " --sklearn-color-fitted-level-3: cornflowerblue;\n", | |
| "\n", | |
| " /* Specific color for light theme */\n", | |
| " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n", | |
| " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n", | |
| " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n", | |
| " --sklearn-color-icon: #696969;\n", | |
| "\n", | |
| " @media (prefers-color-scheme: dark) {\n", | |
| " /* Redefinition of color scheme for dark theme */\n", | |
| " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n", | |
| " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n", | |
| " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n", | |
| " --sklearn-color-icon: #878787;\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 pre {\n", | |
| " padding: 0;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 input.sk-hidden--visually {\n", | |
| " border: 0;\n", | |
| " clip: rect(1px 1px 1px 1px);\n", | |
| " clip: rect(1px, 1px, 1px, 1px);\n", | |
| " height: 1px;\n", | |
| " margin: -1px;\n", | |
| " overflow: hidden;\n", | |
| " padding: 0;\n", | |
| " position: absolute;\n", | |
| " width: 1px;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-dashed-wrapped {\n", | |
| " border: 1px dashed var(--sklearn-color-line);\n", | |
| " margin: 0 0.4em 0.5em 0.4em;\n", | |
| " box-sizing: border-box;\n", | |
| " padding-bottom: 0.4em;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-container {\n", | |
| " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n", | |
| " but bootstrap.min.css set `[hidden] { display: none !important; }`\n", | |
| " so we also need the `!important` here to be able to override the\n", | |
| " default hidden behavior on the sphinx rendered scikit-learn.org.\n", | |
| " See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n", | |
| " display: inline-block !important;\n", | |
| " position: relative;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-text-repr-fallback {\n", | |
| " display: none;\n", | |
| "}\n", | |
| "\n", | |
| "div.sk-parallel-item,\n", | |
| "div.sk-serial,\n", | |
| "div.sk-item {\n", | |
| " /* draw centered vertical line to link estimators */\n", | |
| " background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n", | |
| " background-size: 2px 100%;\n", | |
| " background-repeat: no-repeat;\n", | |
| " background-position: center center;\n", | |
| "}\n", | |
| "\n", | |
| "/* Parallel-specific style estimator block */\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-parallel-item::after {\n", | |
| " content: \"\";\n", | |
| " width: 100%;\n", | |
| " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n", | |
| " flex-grow: 1;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-parallel {\n", | |
| " display: flex;\n", | |
| " align-items: stretch;\n", | |
| " justify-content: center;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " position: relative;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-parallel-item {\n", | |
| " display: flex;\n", | |
| " flex-direction: column;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-parallel-item:first-child::after {\n", | |
| " align-self: flex-end;\n", | |
| " width: 50%;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-parallel-item:last-child::after {\n", | |
| " align-self: flex-start;\n", | |
| " width: 50%;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-parallel-item:only-child::after {\n", | |
| " width: 0;\n", | |
| "}\n", | |
| "\n", | |
| "/* Serial-specific style estimator block */\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-serial {\n", | |
| " display: flex;\n", | |
| " flex-direction: column;\n", | |
| " align-items: center;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " padding-right: 1em;\n", | |
| " padding-left: 1em;\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n", | |
| "clickable and can be expanded/collapsed.\n", | |
| "- Pipeline and ColumnTransformer use this feature and define the default style\n", | |
| "- Estimators will overwrite some part of the style using the `sk-estimator` class\n", | |
| "*/\n", | |
| "\n", | |
| "/* Pipeline and ColumnTransformer style (default) */\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-toggleable {\n", | |
| " /* Default theme specific background. It is overwritten whether we have a\n", | |
| " specific estimator or a Pipeline/ColumnTransformer */\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| "}\n", | |
| "\n", | |
| "/* Toggleable label */\n", | |
| "#sk-container-id-3 label.sk-toggleable__label {\n", | |
| " cursor: pointer;\n", | |
| " display: flex;\n", | |
| " width: 100%;\n", | |
| " margin-bottom: 0;\n", | |
| " padding: 0.5em;\n", | |
| " box-sizing: border-box;\n", | |
| " text-align: center;\n", | |
| " align-items: start;\n", | |
| " justify-content: space-between;\n", | |
| " gap: 0.5em;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 label.sk-toggleable__label .caption {\n", | |
| " font-size: 0.6rem;\n", | |
| " font-weight: lighter;\n", | |
| " color: var(--sklearn-color-text-muted);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 label.sk-toggleable__label-arrow:before {\n", | |
| " /* Arrow on the left of the label */\n", | |
| " content: \"▸\";\n", | |
| " float: left;\n", | |
| " margin-right: 0.25em;\n", | |
| " color: var(--sklearn-color-icon);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| "}\n", | |
| "\n", | |
| "/* Toggleable content - dropdown */\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-toggleable__content {\n", | |
| " max-height: 0;\n", | |
| " max-width: 0;\n", | |
| " overflow: hidden;\n", | |
| " text-align: left;\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-toggleable__content.fitted {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-toggleable__content pre {\n", | |
| " margin: 0.2em;\n", | |
| " border-radius: 0.25em;\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-toggleable__content.fitted pre {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n", | |
| " /* Expand drop-down */\n", | |
| " max-height: 200px;\n", | |
| " max-width: 100%;\n", | |
| " overflow: auto;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n", | |
| " content: \"▾\";\n", | |
| "}\n", | |
| "\n", | |
| "/* Pipeline/ColumnTransformer-specific style */\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Estimator-specific style */\n", | |
| "\n", | |
| "/* Colorize estimator box */\n", | |
| "#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-label label.sk-toggleable__label,\n", | |
| "#sk-container-id-3 div.sk-label label {\n", | |
| " /* The background is the default theme color */\n", | |
| " color: var(--sklearn-color-text-on-default-background);\n", | |
| "}\n", | |
| "\n", | |
| "/* On hover, darken the color of the background */\n", | |
| "#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Label box, darken color on hover, fitted */\n", | |
| "#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Estimator label */\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-label label {\n", | |
| " font-family: monospace;\n", | |
| " font-weight: bold;\n", | |
| " display: inline-block;\n", | |
| " line-height: 1.2em;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-label-container {\n", | |
| " text-align: center;\n", | |
| "}\n", | |
| "\n", | |
| "/* Estimator-specific */\n", | |
| "#sk-container-id-3 div.sk-estimator {\n", | |
| " font-family: monospace;\n", | |
| " border: 1px dotted var(--sklearn-color-border-box);\n", | |
| " border-radius: 0.25em;\n", | |
| " box-sizing: border-box;\n", | |
| " margin-bottom: 0.5em;\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-estimator.fitted {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "/* on hover */\n", | |
| "#sk-container-id-3 div.sk-estimator:hover {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 div.sk-estimator.fitted:hover {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n", | |
| "\n", | |
| "/* Common style for \"i\" and \"?\" */\n", | |
| "\n", | |
| ".sk-estimator-doc-link,\n", | |
| "a:link.sk-estimator-doc-link,\n", | |
| "a:visited.sk-estimator-doc-link {\n", | |
| " float: right;\n", | |
| " font-size: smaller;\n", | |
| " line-height: 1em;\n", | |
| " font-family: monospace;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " border-radius: 1em;\n", | |
| " height: 1em;\n", | |
| " width: 1em;\n", | |
| " text-decoration: none !important;\n", | |
| " margin-left: 0.5em;\n", | |
| " text-align: center;\n", | |
| " /* unfitted */\n", | |
| " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", | |
| " color: var(--sklearn-color-unfitted-level-1);\n", | |
| "}\n", | |
| "\n", | |
| ".sk-estimator-doc-link.fitted,\n", | |
| "a:link.sk-estimator-doc-link.fitted,\n", | |
| "a:visited.sk-estimator-doc-link.fitted {\n", | |
| " /* fitted */\n", | |
| " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", | |
| " color: var(--sklearn-color-fitted-level-1);\n", | |
| "}\n", | |
| "\n", | |
| "/* On hover */\n", | |
| "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n", | |
| ".sk-estimator-doc-link:hover,\n", | |
| "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n", | |
| ".sk-estimator-doc-link:hover {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-3);\n", | |
| " color: var(--sklearn-color-background);\n", | |
| " text-decoration: none;\n", | |
| "}\n", | |
| "\n", | |
| "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n", | |
| ".sk-estimator-doc-link.fitted:hover,\n", | |
| "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n", | |
| ".sk-estimator-doc-link.fitted:hover {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-3);\n", | |
| " color: var(--sklearn-color-background);\n", | |
| " text-decoration: none;\n", | |
| "}\n", | |
| "\n", | |
| "/* Span, style for the box shown on hovering the info icon */\n", | |
| ".sk-estimator-doc-link span {\n", | |
| " display: none;\n", | |
| " z-index: 9999;\n", | |
| " position: relative;\n", | |
| " font-weight: normal;\n", | |
| " right: .2ex;\n", | |
| " padding: .5ex;\n", | |
| " margin: .5ex;\n", | |
| " width: min-content;\n", | |
| " min-width: 20ex;\n", | |
| " max-width: 50ex;\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " box-shadow: 2pt 2pt 4pt #999;\n", | |
| " /* unfitted */\n", | |
| " background: var(--sklearn-color-unfitted-level-0);\n", | |
| " border: .5pt solid var(--sklearn-color-unfitted-level-3);\n", | |
| "}\n", | |
| "\n", | |
| ".sk-estimator-doc-link.fitted span {\n", | |
| " /* fitted */\n", | |
| " background: var(--sklearn-color-fitted-level-0);\n", | |
| " border: var(--sklearn-color-fitted-level-3);\n", | |
| "}\n", | |
| "\n", | |
| ".sk-estimator-doc-link:hover span {\n", | |
| " display: block;\n", | |
| "}\n", | |
| "\n", | |
| "/* \"?\"-specific style due to the `<a>` HTML tag */\n", | |
| "\n", | |
| "#sk-container-id-3 a.estimator_doc_link {\n", | |
| " float: right;\n", | |
| " font-size: 1rem;\n", | |
| " line-height: 1em;\n", | |
| " font-family: monospace;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " border-radius: 1rem;\n", | |
| " height: 1rem;\n", | |
| " width: 1rem;\n", | |
| " text-decoration: none;\n", | |
| " /* unfitted */\n", | |
| " color: var(--sklearn-color-unfitted-level-1);\n", | |
| " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 a.estimator_doc_link.fitted {\n", | |
| " /* fitted */\n", | |
| " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", | |
| " color: var(--sklearn-color-fitted-level-1);\n", | |
| "}\n", | |
| "\n", | |
| "/* On hover */\n", | |
| "#sk-container-id-3 a.estimator_doc_link:hover {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-3);\n", | |
| " color: var(--sklearn-color-background);\n", | |
| " text-decoration: none;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-3 a.estimator_doc_link.fitted:hover {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-3);\n", | |
| "}\n", | |
| "</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=50, n_jobs=-1,\n", | |
| " param_distributions={'max_depth': [3, 7, None],\n", | |
| " 'min_samples_leaf': [3, 7, 15]},\n", | |
| " random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted 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 fitted sk-toggleable__label-arrow\"><div><div>RandomizedSearchCV</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.model_selection.RandomizedSearchCV.html\">?<span>Documentation for RandomizedSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>RandomizedSearchCV(cv=3,\n", | |
| " estimator=RandomSurvivalForest(min_samples_leaf=15,\n", | |
| " n_jobs=-1, random_state=20),\n", | |
| " n_iter=50, n_jobs=-1,\n", | |
| " param_distributions={'max_depth': [3, 7, None],\n", | |
| " 'min_samples_leaf': [3, 7, 15]},\n", | |
| " random_state=42)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted 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 fitted sk-toggleable__label-arrow\"><div><div>best_estimator_: RandomSurvivalForest</div></div></label><div class=\"sk-toggleable__content fitted\"><pre>RandomSurvivalForest(max_depth=3, min_samples_leaf=15, n_jobs=-1,\n", | |
| " random_state=20)</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted 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 fitted sk-toggleable__label-arrow\"><div><div>RandomSurvivalForest</div></div></label><div class=\"sk-toggleable__content fitted\"><pre>RandomSurvivalForest(max_depth=3, min_samples_leaf=15, n_jobs=-1,\n", | |
| " random_state=20)</pre></div> </div></div></div></div></div></div></div></div></div>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "execution_count": 47 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "model_random_search.score(X_test, y_test)" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "_X2klnTmQVXX", | |
| "outputId": "9fac2e08-1926-40b3-925b-6db952c4ed01" | |
| }, | |
| "execution_count": 48, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "np.float64(0.677541928721174)" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "execution_count": 48 | |
| } | |
| ] | |
| }, | |
| { | |
| "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": "16ad93ac-6749-4a47-a555-002883b42fb4" | |
| }, | |
| "execution_count": 49, | |
| "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": 97 | |
| }, | |
| "id": "PbSNPjgQQruO", | |
| "outputId": "5d510b2b-8143-431d-de28-6ad3dffe2f3d" | |
| }, | |
| "execution_count": 50, | |
| "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 {\n", | |
| " /* Definition of color scheme common for light and dark mode */\n", | |
| " --sklearn-color-text: #000;\n", | |
| " --sklearn-color-text-muted: #666;\n", | |
| " --sklearn-color-line: gray;\n", | |
| " /* Definition of color scheme for unfitted estimators */\n", | |
| " --sklearn-color-unfitted-level-0: #fff5e6;\n", | |
| " --sklearn-color-unfitted-level-1: #f6e4d2;\n", | |
| " --sklearn-color-unfitted-level-2: #ffe0b3;\n", | |
| " --sklearn-color-unfitted-level-3: chocolate;\n", | |
| " /* Definition of color scheme for fitted estimators */\n", | |
| " --sklearn-color-fitted-level-0: #f0f8ff;\n", | |
| " --sklearn-color-fitted-level-1: #d4ebff;\n", | |
| " --sklearn-color-fitted-level-2: #b3dbfd;\n", | |
| " --sklearn-color-fitted-level-3: cornflowerblue;\n", | |
| "\n", | |
| " /* Specific color for light theme */\n", | |
| " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n", | |
| " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n", | |
| " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n", | |
| " --sklearn-color-icon: #696969;\n", | |
| "\n", | |
| " @media (prefers-color-scheme: dark) {\n", | |
| " /* Redefinition of color scheme for dark theme */\n", | |
| " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n", | |
| " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n", | |
| " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n", | |
| " --sklearn-color-icon: #878787;\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 pre {\n", | |
| " padding: 0;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 input.sk-hidden--visually {\n", | |
| " border: 0;\n", | |
| " clip: rect(1px 1px 1px 1px);\n", | |
| " clip: rect(1px, 1px, 1px, 1px);\n", | |
| " height: 1px;\n", | |
| " margin: -1px;\n", | |
| " overflow: hidden;\n", | |
| " padding: 0;\n", | |
| " position: absolute;\n", | |
| " width: 1px;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-dashed-wrapped {\n", | |
| " border: 1px dashed var(--sklearn-color-line);\n", | |
| " margin: 0 0.4em 0.5em 0.4em;\n", | |
| " box-sizing: border-box;\n", | |
| " padding-bottom: 0.4em;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-container {\n", | |
| " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n", | |
| " but bootstrap.min.css set `[hidden] { display: none !important; }`\n", | |
| " so we also need the `!important` here to be able to override the\n", | |
| " default hidden behavior on the sphinx rendered scikit-learn.org.\n", | |
| " See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n", | |
| " display: inline-block !important;\n", | |
| " position: relative;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-text-repr-fallback {\n", | |
| " display: none;\n", | |
| "}\n", | |
| "\n", | |
| "div.sk-parallel-item,\n", | |
| "div.sk-serial,\n", | |
| "div.sk-item {\n", | |
| " /* draw centered vertical line to link estimators */\n", | |
| " background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n", | |
| " background-size: 2px 100%;\n", | |
| " background-repeat: no-repeat;\n", | |
| " background-position: center center;\n", | |
| "}\n", | |
| "\n", | |
| "/* Parallel-specific style estimator block */\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-parallel-item::after {\n", | |
| " content: \"\";\n", | |
| " width: 100%;\n", | |
| " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n", | |
| " flex-grow: 1;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-parallel {\n", | |
| " display: flex;\n", | |
| " align-items: stretch;\n", | |
| " justify-content: center;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " position: relative;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-parallel-item {\n", | |
| " display: flex;\n", | |
| " flex-direction: column;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-parallel-item:first-child::after {\n", | |
| " align-self: flex-end;\n", | |
| " width: 50%;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-parallel-item:last-child::after {\n", | |
| " align-self: flex-start;\n", | |
| " width: 50%;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-parallel-item:only-child::after {\n", | |
| " width: 0;\n", | |
| "}\n", | |
| "\n", | |
| "/* Serial-specific style estimator block */\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-serial {\n", | |
| " display: flex;\n", | |
| " flex-direction: column;\n", | |
| " align-items: center;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " padding-right: 1em;\n", | |
| " padding-left: 1em;\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n", | |
| "clickable and can be expanded/collapsed.\n", | |
| "- Pipeline and ColumnTransformer use this feature and define the default style\n", | |
| "- Estimators will overwrite some part of the style using the `sk-estimator` class\n", | |
| "*/\n", | |
| "\n", | |
| "/* Pipeline and ColumnTransformer style (default) */\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-toggleable {\n", | |
| " /* Default theme specific background. It is overwritten whether we have a\n", | |
| " specific estimator or a Pipeline/ColumnTransformer */\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| "}\n", | |
| "\n", | |
| "/* Toggleable label */\n", | |
| "#sk-container-id-4 label.sk-toggleable__label {\n", | |
| " cursor: pointer;\n", | |
| " display: flex;\n", | |
| " width: 100%;\n", | |
| " margin-bottom: 0;\n", | |
| " padding: 0.5em;\n", | |
| " box-sizing: border-box;\n", | |
| " text-align: center;\n", | |
| " align-items: start;\n", | |
| " justify-content: space-between;\n", | |
| " gap: 0.5em;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 label.sk-toggleable__label .caption {\n", | |
| " font-size: 0.6rem;\n", | |
| " font-weight: lighter;\n", | |
| " color: var(--sklearn-color-text-muted);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 label.sk-toggleable__label-arrow:before {\n", | |
| " /* Arrow on the left of the label */\n", | |
| " content: \"▸\";\n", | |
| " float: left;\n", | |
| " margin-right: 0.25em;\n", | |
| " color: var(--sklearn-color-icon);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 label.sk-toggleable__label-arrow:hover:before {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| "}\n", | |
| "\n", | |
| "/* Toggleable content - dropdown */\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-toggleable__content {\n", | |
| " max-height: 0;\n", | |
| " max-width: 0;\n", | |
| " overflow: hidden;\n", | |
| " text-align: left;\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-toggleable__content.fitted {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-toggleable__content pre {\n", | |
| " margin: 0.2em;\n", | |
| " border-radius: 0.25em;\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-toggleable__content.fitted pre {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n", | |
| " /* Expand drop-down */\n", | |
| " max-height: 200px;\n", | |
| " max-width: 100%;\n", | |
| " overflow: auto;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n", | |
| " content: \"▾\";\n", | |
| "}\n", | |
| "\n", | |
| "/* Pipeline/ColumnTransformer-specific style */\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Estimator-specific style */\n", | |
| "\n", | |
| "/* Colorize estimator box */\n", | |
| "#sk-container-id-4 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-label label.sk-toggleable__label,\n", | |
| "#sk-container-id-4 div.sk-label label {\n", | |
| " /* The background is the default theme color */\n", | |
| " color: var(--sklearn-color-text-on-default-background);\n", | |
| "}\n", | |
| "\n", | |
| "/* On hover, darken the color of the background */\n", | |
| "#sk-container-id-4 div.sk-label:hover label.sk-toggleable__label {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Label box, darken color on hover, fitted */\n", | |
| "#sk-container-id-4 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Estimator label */\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-label label {\n", | |
| " font-family: monospace;\n", | |
| " font-weight: bold;\n", | |
| " display: inline-block;\n", | |
| " line-height: 1.2em;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-label-container {\n", | |
| " text-align: center;\n", | |
| "}\n", | |
| "\n", | |
| "/* Estimator-specific */\n", | |
| "#sk-container-id-4 div.sk-estimator {\n", | |
| " font-family: monospace;\n", | |
| " border: 1px dotted var(--sklearn-color-border-box);\n", | |
| " border-radius: 0.25em;\n", | |
| " box-sizing: border-box;\n", | |
| " margin-bottom: 0.5em;\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-estimator.fitted {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-0);\n", | |
| "}\n", | |
| "\n", | |
| "/* on hover */\n", | |
| "#sk-container-id-4 div.sk-estimator:hover {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 div.sk-estimator.fitted:hover {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-2);\n", | |
| "}\n", | |
| "\n", | |
| "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n", | |
| "\n", | |
| "/* Common style for \"i\" and \"?\" */\n", | |
| "\n", | |
| ".sk-estimator-doc-link,\n", | |
| "a:link.sk-estimator-doc-link,\n", | |
| "a:visited.sk-estimator-doc-link {\n", | |
| " float: right;\n", | |
| " font-size: smaller;\n", | |
| " line-height: 1em;\n", | |
| " font-family: monospace;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " border-radius: 1em;\n", | |
| " height: 1em;\n", | |
| " width: 1em;\n", | |
| " text-decoration: none !important;\n", | |
| " margin-left: 0.5em;\n", | |
| " text-align: center;\n", | |
| " /* unfitted */\n", | |
| " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", | |
| " color: var(--sklearn-color-unfitted-level-1);\n", | |
| "}\n", | |
| "\n", | |
| ".sk-estimator-doc-link.fitted,\n", | |
| "a:link.sk-estimator-doc-link.fitted,\n", | |
| "a:visited.sk-estimator-doc-link.fitted {\n", | |
| " /* fitted */\n", | |
| " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", | |
| " color: var(--sklearn-color-fitted-level-1);\n", | |
| "}\n", | |
| "\n", | |
| "/* On hover */\n", | |
| "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n", | |
| ".sk-estimator-doc-link:hover,\n", | |
| "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n", | |
| ".sk-estimator-doc-link:hover {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-3);\n", | |
| " color: var(--sklearn-color-background);\n", | |
| " text-decoration: none;\n", | |
| "}\n", | |
| "\n", | |
| "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n", | |
| ".sk-estimator-doc-link.fitted:hover,\n", | |
| "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n", | |
| ".sk-estimator-doc-link.fitted:hover {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-3);\n", | |
| " color: var(--sklearn-color-background);\n", | |
| " text-decoration: none;\n", | |
| "}\n", | |
| "\n", | |
| "/* Span, style for the box shown on hovering the info icon */\n", | |
| ".sk-estimator-doc-link span {\n", | |
| " display: none;\n", | |
| " z-index: 9999;\n", | |
| " position: relative;\n", | |
| " font-weight: normal;\n", | |
| " right: .2ex;\n", | |
| " padding: .5ex;\n", | |
| " margin: .5ex;\n", | |
| " width: min-content;\n", | |
| " min-width: 20ex;\n", | |
| " max-width: 50ex;\n", | |
| " color: var(--sklearn-color-text);\n", | |
| " box-shadow: 2pt 2pt 4pt #999;\n", | |
| " /* unfitted */\n", | |
| " background: var(--sklearn-color-unfitted-level-0);\n", | |
| " border: .5pt solid var(--sklearn-color-unfitted-level-3);\n", | |
| "}\n", | |
| "\n", | |
| ".sk-estimator-doc-link.fitted span {\n", | |
| " /* fitted */\n", | |
| " background: var(--sklearn-color-fitted-level-0);\n", | |
| " border: var(--sklearn-color-fitted-level-3);\n", | |
| "}\n", | |
| "\n", | |
| ".sk-estimator-doc-link:hover span {\n", | |
| " display: block;\n", | |
| "}\n", | |
| "\n", | |
| "/* \"?\"-specific style due to the `<a>` HTML tag */\n", | |
| "\n", | |
| "#sk-container-id-4 a.estimator_doc_link {\n", | |
| " float: right;\n", | |
| " font-size: 1rem;\n", | |
| " line-height: 1em;\n", | |
| " font-family: monospace;\n", | |
| " background-color: var(--sklearn-color-background);\n", | |
| " border-radius: 1rem;\n", | |
| " height: 1rem;\n", | |
| " width: 1rem;\n", | |
| " text-decoration: none;\n", | |
| " /* unfitted */\n", | |
| " color: var(--sklearn-color-unfitted-level-1);\n", | |
| " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 a.estimator_doc_link.fitted {\n", | |
| " /* fitted */\n", | |
| " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", | |
| " color: var(--sklearn-color-fitted-level-1);\n", | |
| "}\n", | |
| "\n", | |
| "/* On hover */\n", | |
| "#sk-container-id-4 a.estimator_doc_link:hover {\n", | |
| " /* unfitted */\n", | |
| " background-color: var(--sklearn-color-unfitted-level-3);\n", | |
| " color: var(--sklearn-color-background);\n", | |
| " text-decoration: none;\n", | |
| "}\n", | |
| "\n", | |
| "#sk-container-id-4 a.estimator_doc_link.fitted:hover {\n", | |
| " /* fitted */\n", | |
| " background-color: var(--sklearn-color-fitted-level-3);\n", | |
| "}\n", | |
| "</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 fitted 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 fitted sk-toggleable__label-arrow\"><div><div>RandomSurvivalForest</div></div><div><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><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": 50 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "times = np.arange(365, 1826)\n", | |
| "survs = rsf_best.predict_survival_function(X_test)" | |
| ], | |
| "metadata": { | |
| "id": "iO5hU-exQZup" | |
| }, | |
| "execution_count": 51, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "preds = np.asarray([[fn(t) for t in times] for fn in survs])" | |
| ], | |
| "metadata": { | |
| "id": "nVQsQOocQhOI" | |
| }, | |
| "execution_count": 52, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "integrated_brier_score(y_trn, y_test, preds, times).item()" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "rYRRmruYRCgq", | |
| "outputId": "af0a058c-3b8c-4f72-a0e5-4e719d91cea3" | |
| }, | |
| "execution_count": 54, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "0.17950457624496508" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "execution_count": 54 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "%pip install -q shap\n", | |
| "import shap\n", | |
| "explainer = shap.Explainer(cox.predict, X_trn)\n", | |
| "shap_values = explainer(X_test[:100])\n", | |
| "shap.plots.waterfall(shap_values[0])" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 540 | |
| }, | |
| "id": "J03T1z80N8fg", | |
| "outputId": "05d11793-d853-4291-9271-05136817d490" | |
| }, | |
| "execution_count": 39, | |
| "outputs": [ | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "text/plain": [ | |
| "<Figure size 800x550 with 3 Axes>" | |
| ], | |
| "image/png": "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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": "ecd92e20-a937-47fd-88dc-fd9a0cb6b9b4" | |
| }, | |
| "execution_count": 41, | |
| "outputs": [ | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "text/plain": [ | |
| "<Figure size 800x470 with 2 Axes>" | |
| ], | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtcAAAG0CAYAAAD5Bgs0AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAh9VJREFUeJzs3Xd4FFXbx/Hv7KY3EnrovVdBEJVYKCJNqh0QfSmKD/buo6A+KjZQpCkdG4J0UUFFuqIUxUIRpIWahJBednfeP2I2bHYTQkjn97muvWDOnDnnzG6SvffsPWcM0zRNRERERETkklmKewAiIiIiImWFgmsRERERkQKi4FpEREREpIAouBYRERERKSAKrkVERERECoiCaxERERGRAqLgWkRERESkgCi4FhEREREpIAquRUREREQKiIJrERERESkU48aNIygo6IL7Dh06hGEYLF68+KLaz+9xhcmruAcgIiIiIpe38PBwtm7dSqNGjYp7KJdMwbWIiIiIFCtfX1+uuuqq4h5GgVBaiIiIiIgUK0/pHWlpaYwdO5by5csTGhrKqFGj+OSTTzAMg0OHDrkcn5KSwoMPPkhYWBjh4eE8/vjj2Gy2Ij6LDAquRURERKRQ2Ww2t4fD4cj1mKeffpoZM2bw1FNPsXDhQhwOB08//bTHus899xwWi4XPP/+c0aNH8/bbbzNz5szCOJULUlqIiIiIiBSaxMREvL29Pe4LDAz0WB4TE8O0adN4/vnneeqppwC46aab6Nq1K0ePHnWr37FjR9577z0AunXrxrp161i8eDGjR48uoLPIOwXXIiIiBSw9PZ05c+YAMHz48BwDC5FSyRjgXmYuybG6v78/GzZscCv/4IMP+OSTTzwes3v3blJSUujbt69L+S233MJ3333nVr979+4u282aNeP777/PcUyFScG1iIiIiFwE46JqWywW2rdv71a+atWqHI85ceIEAJUqVXIpr1y5ssf6oaGhLts+Pj6kpKRc1DgLinKuRURERKRECQ8PB+DMmTMu5adPny6O4VwUBdciIiIichEMD4+C1aJFC/z8/Fi+fLlL+bJlywq8r4KmtBARERERuQgFH0xnV6FCBe6//37+97//4efnR5s2bVi0aBH79u0DMlJNSqqSOzIRERERKYEKf+Ya4PXXX2fkyJG89tprDB48mPT0dOdSfOXKlSuUPguC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r3iS+ctx6623sn79el5//XUmT55M69atufrqq7npppsICwvL8fiidv6sOuDyIQfAx8eHChUquJSFh4fnul21alX1oT7Uh/oodX24hdhWS0b6QyabHdKytn1N05kHndWIibcjq06KtzcB6VkhuOFxtjur7PxjMzkwnIkhAOl443NeWG/DGyuuwZyFNJdt45YOBAcHO7fdnqtbroQvfvQwtix+t3bOWgy85xUZOcTnB5FXNSKo3r/v034+GDe1ga93njcoCyF33eDSZnG/5oXSR+Pq0KQ67MmKXwj0w7tnuwI9Dym5SkRwnVcWS84T7TnOPBQwwzB47733chxL/foZ65WGhoYyf/58du7cyU8//cTOnTt55513mDFjBu+++y6tWrUqkvGKiEjeuM29eVsy0hsybwqTLTAOtrsvw4dhUKlBILF/J+Ltn4xvjOvctsXDBZDeQd74VTdIPZlMSPMK8HP2GUoDGxa8/52hTjYCCOhdDdvX+zAqBOD9fF8sh47jmLExo49RnbHUCYL/LYGouIx0kPeG537ymekey7ZBeBi8MBh+PwqzvgMvCzzYE/7vvIv2a1eGRY/D4/PgwEno2go+vN+1zTkPwshp8OUOqFkBXrsbml8Gq5gYBix7GkZMg41/QrOa8O69UD74wseWElqKL3clIrg+dOiQW9k///wDeJ6tzk1YWBiBgYEcPHjQbV9cXBxRUVE0atTIWTcgIIDDhw+71fV0fM2aNdmyZQtVq1Z1zqznxmq10r59e2fKyf79+7n77ruZNWsW77777kWdl4iIFDJPq4WcX5gtZSPB4jqjnKnnHZVo0yScuXPnErOwCZhZIXi6nw/eCcku9ev1qkHE/67ANE3SDsezu97HLuOwBHjhVzUE+8FYLBX8Kf/2jQQPa4lpmhjnj+nNbN+qjumRkUftIdXETYVgWPyke/1J9+Z8/C0dMh459VE1DFY8m/cxlCWNq8OGV8rsuSsNJHclIud68eLFJCQkOLcTEhL44osvCA4Opl27drkc6c5isdC5c2f27t3Lli1bXPbNnTsXh8PB9ddfD2QEv9deey1//vknv/zyi7OeaZrMnz/fre2ePXsCGRdM2j3MPpyfLxUbG+u2v06dOvj5+REXF3dR5yQiIkUge2Btc7he0OhtBZ+sRJBAh+cQIyOeythjLe+6rF5ycACBdbNmMCu2COXK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r7/+mv/973/89ddf1K9fn+3btzv7PV+VKlV4+umneeWVVxg8eDA9e/YkPDycs2fP8vfff/PDDz+waNEiqlWrdqlPk4iIXEDP+hZO3G/w9T8mVQKha20DS2GnbRTkxPVT/eHVL7K2DWBmztf0iBSFspIWEhkZyYYNGzh9+jQDBw6kRo0a2O12zp07R7ly5dyutcurEhlcV61alRdeeIF58+bx+uuvY7PZnDeRmTlzJpMmTWLFihUYhkG7du2YPn06Q4cOxdc374l0jz76KIGBgaxdu5b169dTpUoV+vfvT7NmzdwuRgwJCWHmzJm88847rF69GshYym/GjBncf7/71bF9+/alVq1afPTRRyxZsoT4+HhCQ0OpXbs2999/PxUqVLi0J0hERPKsUoDBkOZF+DV2QUYe/7sLGoXDlK+hfBC8dAd0aFiAHYhcPEcpTwsxTZPHHnuM999/H5vNhmEYtGzZkho1apCQkECdOnV46aWXePjhh/PVfolciu9ixcbG0rVrVwYMGMCzzz5b3MMREZHLRKEvxSdSAm01PnAr62SOLIaR5M8bb7zBM888w1NPPUWXLl3o1q0b3377LTfeeCMA99xzDwcOHGDjxo35ar9E5lznxlMec2busy4gFBEREZHcfPjhhwwdOpRXX32VNm3auO1v1aoV+/bty3f7JTItJDcPPfQQ4eHhNGnSBIfDwc8//8zGjRtp1aoV119/fXEPT0RERKRMK+0pD0ePHuXqq6/OcX9gYKDbohoXo9QF1507d+bLL79k3bp1pKamUqVKFe6++25GjBiR78RzERGRAuMo7gGIFK7SvhRf5cqVPS69nGn79u053oQwL0pdcH333Xdz9913F/cwREREPCvdcYdImTdgwACmT5/OPffc41wlLnPFuTVr1jB37lyefPLJfLdf6nKuRURESjLDouhayjYTw+1RmowfP57w8HDatGnD0KFDMQyDCRMmcO2113LzzTfTqlWrS1ogQ8G1iIhIAfIJ0cogUraZHh6lSbly5fjxxx958skniYyMxM/Pj/Xr1xMbG8uLL77Ixo0bCQgIyHf7pS4tREREpKQIqOpH0knXVayaDqlXTKMRkbzy9/fn+eef5/nnny/wtjVzLSIikk895l2LT7msmerwqyrS9oEmxTgikcJX2tNCCptmrkVERPIprH4Id23rTdTus/iG+lCu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oTh06JDbbZiDg4OpWLEihw4dKpYxiUjRUs61lFlHjx6lf//+zu377ruvxN0i9XIzf/58zpw5w5133lncQxEpFHFxcW53loOMAFv57iKXBwXXUiokJCQQFRV1wXrVq1d3XpFfpUoV5s+fT1JSErt27WLu3LlYLBZGjRpV2MMts/LzOmT68ccfmTFjBv/3f/9H06ZNC2uIl4VLeR1ERKRwKbiWUuHbb7/llVdeuWC9xYsXO7+S9fHxoVmzZgC0b9+ewMBAJk2axMCBA6lYsWJhDrfMys/rALBnzx6eeuopevTowYgRIwpxhJeH/L4OUvhCQkJISEhwK4+Pj3e7BkFEyiYF11Iq9OvXj379+l1SG02bNsVut3PixAkF1/mUn9fh6NGjjB07llatWvHf//63cAZ2mSmI3wcpHHXq1HHLrc78pkEfdEQuD7qgUS4bu3btwjAMqlWrVtxDuWxERUXx4IMPUrVqVSZMmICXlz7PS9l29dVXs23bNuLj451l3377LRaLhauuuqoYRyYiRUXvdFLmJCQkMHbsWHr27EmNGjWw2Wxs376dzz77jAEDBlChQoXiHuJlISUlhbFjxxIbG8tjjz3GgQMHnPu8vb1p0qRJMY7u8nLixAn++OMPION1iYyM5NtvvwWga9euxTm0MmfgwIEsXLiQxx57jHvvvZfTp0/z7rvvMmDAAK1xXcRSUlLYtGkTkPE7kJiY6Py5b9euHWFhYcU5PCnDdBMZKXPS0tJ47bXX2LVrF6dPn8bPz48aNWowcOBAevXqhdVqLe4hXhaOHz9O3759Pe4LDw9n5cqVRTyiy9fKlSsZP368x32//PJLEY+m7Pvnn3948803+fXXXwkMDKRXr166/XkxyO1v0PTp02nfvn0Rj0guFwquRUREREQKiHKuRUREREQKiIJrEREREZECouBaRERERKSAKLgWERERESkgCq5FRERERAqIgmsRERERkQKi4FpEREREpIAouBaRInHPPfdgGEZxDwOA33//HS8vL9auXess++GHHzAMg7lz5xbfwKREmDt3LoZh8MMPP+TreP0sebZr1y4sFgvr168v7qGIFCoF1yKX4ODBg4wcOZImTZoQEBBAWFgYTZs2ZdiwYaxbt86lbp06dWjRokWObWUGn1FRUR73//XXXxiGgWEYbNy4Mcd2MutkPvz8/GjYsCGPPvooMTEx+TvRMubRRx/lmmuuoVu3bsU9lCJx6NAhxo0bx65du4p7KFJEYmNjGTduXL4/IORXbj9rbdq0oV+/fjz22GPo/nVSlnkV9wBESqtffvmF6667Dm9vb4YOHUrz5s1JTk5m//79rFmzhuDgYG644YYC62/WrFkEBwfj7+/P7Nmz6dy5c45127Rpw2OPPQZATEwMq1evZuLEiaxdu5bt27fj4+NTYOMqbbZu3cratWtZtmyZS3lERATJycll8hbVhw4dYvz48dSpU4c2bdoU93CkCMTGxjpveX/99dcXWb8X+ll7+OGHue6661i9ejW9evUqsnGJFCUF1yL5NH78eJKSkti1axetW7d223/y5MkC6ys9PZ0FCxYwePBgypUrxwcffMB7771HcHCwx/rVq1fn7rvvdm6PHTuWPn36sGrVKpYvX87gwYMLbGylzdSpU6lYsSI9e/Z0KbdYLPj5+RXTqEQuD507d6ZOnTpMnz5dwbWUWUoLEcmn/fv3U6FCBY+BNUDVqlULrK+VK1dy+vRphg0bxj333ENiYiILFy68qDZuuukmAP7+++8c60ybNg3DMFixYoXbPofDQY0aNVxmo9asWcNtt91GvXr18Pf3JzQ0lO7du+c5p/L666+nTp06buWHDh3CMAzGjRvnUm6aJtOmTaNdu3YEBAQQFBTEDTfc4JaCkxObzcayZcvo2rWr2wy1pzzZ88umTp1K48aN8fPzo2XLlqxatQqA3bt306NHD0JCQqhQoQJjx44lPT3d43kePHiQW265hXLlyhESEkL//v05ePCgS12Hw8H//vc/IiIiqFq1Kj4+PtSqVYv777+f6Ohoj+f1xRdfcP311xMaGkpAQACNGzdm7NixpKWlMXfuXOc3KMOHD3emC+VlNvPQoUMMGTKEKlWq4OvrS/369Xn22WdJSkpyqTdu3DgMw2Dv3r08++yz1KhRA19fX1q3bs3q1asv2A9k5Tl/9913vPTSS9SuXRt/f386duzIjz/+CMD69eu59tprCQwMJDw8nJdfftljW8uWLeOaa64hMDCQoKAgrrnmGpYvX+6x7ocffkiTJk3w9fWlQYMGTJo0KceUhXPnzvHUU0/RoEEDfH19qVSpEnfccYfba3ix8vo853bdgmEY3HPPPUDGz23dunWBjEmAzNc883ft/N+vTz/9lFatWuHn50etWrUY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Js/51o0aNSI+Pp5t27Y5yxwOBxMnTnSrO3ToUBwOB88884zHtk6dOnXB/tq2bUtISIhzabei9vrrr7tsL126lL1797p8OLJarRiG4TJDbZqmM83nfHfeeScAzz77LGlpaW77M1+bzA8jeZ2xt1gs9OnTh507d/L111+7nYPD4aB///55aqsodevWjcDAQCZPnkx8fLyzPD4+nsmTJxMUFOS8K2e3bt3w9/dnypQpLkveHTt2zO3bEYvFwl133cW2bdtYvHixx77zkz98sc9zZspTZt54prffftut7by85mvXrmXHjh3ObdM0eeONNwBcfiYv5vc0L/3++OOPeHl5cc011+RYR6Q008y1SD498sgjREdH07dvX1q2bElAQABHjx7lk08+Yd++fQwdOpSWLVvmu/1PP/2U5ORkBg4cmGOdgQMHMnfuXObNm+d2sdylGjZsGI899hgTJkygUaNGXHXVVS77r732WqpWrcpjjz3GoUOHqFGjBrt27WLBggW0bNmS3bt3X7CPkSNH8vbbb9O/f38eeughfHx8WLx4sccPLZnL773//vvs2LGD3r17U7FiRY4dO8bWrVv5+++/L5gnarVaGTBgAMuWLSM1NdVlJr6wVaxYkSVLlnD8+HGuv/5651J8VapUcVnPe9CgQXzxxRfceOONDB06lPT0dJYtW+a25jFAhw4deOqpp5gwYQJXXHEFt912G1WrVuWff/5h8eLFbNu2jdDQUJo1a0ZwcDBTp04lICCA0NBQKleu7LxI0pNXX32VtWvX0q9fPx544AEaNGjAhg0bWLhwIREREW4ftkqC0NBQ3njjDcaMGUPHjh2d6z7PnTuXv//+mxkzZjgvTA0LC+Pll1/m8ccf5+qrr2bo0KEkJSUxffp0GjZsyM6dO13a/t///sfmzZu59dZbufXWW7nqqqvw8fHh8OHDrF69mnbt2rmskZ5XF/M833HHHTz77LOMHDmSPXv2UL58eb7++muPy3tWqFCBBg0a8Nlnn1G/fn2qVKlCYGAgffr0cdZp3bo1N954I2PGjCE8PJzly5fz7bffMmTIEDp16uSsdzG/pxf6WTNNk6+//poePXrk+xsokRKvWNYoESkDvvnmG/OBBx4wW7VqZVaoUMG0Wq1m+fLlzeuvv96cNWuWabfbXerXrl3bbN68eY7tZS6zlbkUX/v27U0vLy+3JfHOl5KSYgYHB5uNGjVylvHvkmiX6uTJk6aXl5cJmK+88orHOr/++qt50003maGhoWZQUJB53XXXmRs2bPC4ZFhOy4h9+eWXZuvWrU0fHx8zPDzcfPLJJ809e/bkuIzY/PnzzWuvvdYMDg42fX19zdq1a5v9+/c3P/vsszydV+bydYsXL3Ypz20pPk/LitWuXdu87rrr3Mozl6X7559/nGWZS5kdOHDA7Nu3rxkcHGwGBQWZffv2Nffv3+/Wxv+3d7csqkQBGMfPDevIYBPBYBHBF9RgdJLRajdqNhtEsItV/ABGRdAuGFQMfgMZMIvJYnluUta3vbsyu9zd/f/ywJlzmIGH4Zxner2eUqmULMtSOBxWtVrVbre7qVs76ff7chxHgUBAtm0rkUioVqtdVNpNJhPlcjlZliVjzN17v7bZbFQulxUKhfTy8qJoNKp6vX5RXfdozv9ap2unKr7X9Xcnj+b96JkaDAbK5/OybVu2bSufz2s4HN4dt9vtKh6Py+fzKRaLqdPpnCsbr+/lcDio1Wopk8nI7/crEAgomUyqUqlosVicr/to9eF711mSFouFHMeRZVkKBoOqVqva7/d312i5XMpxHNm2LWPMuU7vdYVev99XNpuVz+dTJBJRo9HQ8Xi8Gfcj7+lbz9p0OpUxRuPx+F1rA3xHf6QnT90AwDdVLBbN4XAws9nsS8YrFArGdV3juu6XjAe8xXVdE41GTbPZvPkL6mcrlUpmu92a1Wr13xzEBbzGnmsAv0673Tbz+fypbmIAz1mv12Y0Gpl2u02wxo/GnmsAv046nf70+jIAl3K53E2VJPAT8eUaAAAA8Ah7rgEAAACP8OUaAAAA8AjhGgAAAPAI4RoAAADwCOEaAAAA8AjhGgAAAPAI4RoAAADwCOEaAAAA8AjhGgAAAPAI4RoAAADwyF/AUpMYNavU6gAAAABJRU5ErkJggg==\n" | |
| }, | |
| "metadata": {} | |
| } | |
| ] | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment