{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "-Uy-yBGsd9W1"
},
"source": [
"# Survival analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook presents example usage of package for solving survival problem on `bmt` dataset. You can download dataset [here](https://raw.githubusercontent.com/adaa-polsl/RuleKit/master/data/bmt/bmt.arff) \n",
"\n",
"This tutorial will cover topics such as: \n",
"- training model \n",
"- changing model hyperparameters \n",
"- hyperparameters tuning \n",
"- calculating metrics for model \n",
"- getting RuleKit inbuilt "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "KjtU7PA8eOTr"
},
"source": [
"## Summary of the dataset"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "Tp1TpfCkd58n"
},
"outputs": [],
"source": [
"from scipy.io import arff\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"datasets_path = \"\" \n",
"\n",
"file_name = 'bmt.arff'\n",
"\n",
"data_df = pd.DataFrame(arff.loadarff(open(datasets_path + file_name, 'r', encoding=\"cp1252\"))[0])\n",
"\n",
"# code to fix the problem with encoding of the file\n",
"tmp_df = data_df.select_dtypes([object]) \n",
"tmp_df = tmp_df.stack().str.decode(\"cp1252\").unstack()\n",
"for col in tmp_df:\n",
" data_df[col] = tmp_df[col]\n",
" \n",
"data_df = data_df.replace({'?': None})"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Recipientgender | \n",
" Stemcellsource | \n",
" Donorage | \n",
" Donorage35 | \n",
" IIIV | \n",
" Gendermatch | \n",
" DonorABO | \n",
" RecipientABO | \n",
" RecipientRh | \n",
" ABOmatch | \n",
" ... | \n",
" extcGvHD | \n",
" CD34kgx10d6 | \n",
" CD3dCD34 | \n",
" CD3dkgx10d8 | \n",
" Rbodymass | \n",
" ANCrecovery | \n",
" PLTrecovery | \n",
" time_to_aGvHD_III_IV | \n",
" survival_time | \n",
" survival_status | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 1 | \n",
" 1 | \n",
" 22.830137 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" ... | \n",
" 1 | \n",
" 7.20 | \n",
" 1.338760 | \n",
" 5.38 | \n",
" 35.0 | \n",
" 19.0 | \n",
" 51.0 | \n",
" 32.0 | \n",
" 999.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" | 1 | \n",
" 1 | \n",
" 0 | \n",
" 23.342466 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" -1 | \n",
" -1 | \n",
" 1 | \n",
" 0 | \n",
" ... | \n",
" 1 | \n",
" 4.50 | \n",
" 11.078295 | \n",
" 0.41 | \n",
" 20.6 | \n",
" 16.0 | \n",
" 37.0 | \n",
" 1000000.0 | \n",
" 163.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" | 2 | \n",
" 1 | \n",
" 0 | \n",
" 26.394521 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" -1 | \n",
" -1 | \n",
" 1 | \n",
" 0 | \n",
" ... | \n",
" 1 | \n",
" 7.94 | \n",
" 19.013230 | \n",
" 0.42 | \n",
" 23.4 | \n",
" 23.0 | \n",
" 20.0 | \n",
" 1000000.0 | \n",
" 435.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" | 3 | \n",
" 0 | \n",
" 0 | \n",
" 39.684932 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 1 | \n",
" 1 | \n",
" ... | \n",
" None | \n",
" 4.25 | \n",
" 29.481647 | \n",
" 0.14 | \n",
" 50.0 | \n",
" 23.0 | \n",
" 29.0 | \n",
" 19.0 | \n",
" 53.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" | 4 | \n",
" 0 | \n",
" 1 | \n",
" 33.358904 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 0 | \n",
" 1 | \n",
" ... | \n",
" 1 | \n",
" 51.85 | \n",
" 3.972255 | \n",
" 13.05 | \n",
" 9.0 | \n",
" 14.0 | \n",
" 14.0 | \n",
" 1000000.0 | \n",
" 2043.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" | ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" | 182 | \n",
" 1 | \n",
" 1 | \n",
" 37.575342 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 1 | \n",
" 11.08 | \n",
" 2.522750 | \n",
" 4.39 | \n",
" 44.0 | \n",
" 15.0 | \n",
" 22.0 | \n",
" 16.0 | \n",
" 385.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" | 183 | \n",
" 0 | \n",
" 1 | \n",
" 22.895890 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" ... | \n",
" 1 | \n",
" 4.64 | \n",
" 1.038858 | \n",
" 4.47 | \n",
" 44.5 | \n",
" 12.0 | \n",
" 30.0 | \n",
" 1000000.0 | \n",
" 634.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" | 184 | \n",
" 0 | \n",
" 1 | \n",
" 27.347945 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 1 | \n",
" -1 | \n",
" 1 | \n",
" 1 | \n",
" ... | \n",
" 1 | \n",
" 7.73 | \n",
" 1.635559 | \n",
" 4.73 | \n",
" 33.0 | \n",
" 16.0 | \n",
" 16.0 | \n",
" 1000000.0 | \n",
" 1895.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" | 185 | \n",
" 1 | \n",
" 1 | \n",
" 27.780822 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" ... | \n",
" 0 | \n",
" 15.41 | \n",
" 8.077770 | \n",
" 1.91 | \n",
" 24.0 | \n",
" 13.0 | \n",
" 14.0 | \n",
" 54.0 | \n",
" 382.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" | 186 | \n",
" 1 | \n",
" 1 | \n",
" 55.553425 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 1 | \n",
" 1 | \n",
" ... | \n",
" 1 | \n",
" 9.91 | \n",
" 0.948135 | \n",
" 10.45 | \n",
" 37.0 | \n",
" 18.0 | \n",
" 20.0 | \n",
" 1000000.0 | \n",
" 1109.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
"
\n",
"
187 rows × 37 columns
\n",
"
"
],
"text/plain": [
" Recipientgender Stemcellsource Donorage Donorage35 IIIV Gendermatch \\\n",
"0 1 1 22.830137 0 1 0 \n",
"1 1 0 23.342466 0 1 0 \n",
"2 1 0 26.394521 0 1 0 \n",
"3 0 0 39.684932 1 1 0 \n",
"4 0 1 33.358904 0 0 0 \n",
".. ... ... ... ... ... ... \n",
"182 1 1 37.575342 1 1 0 \n",
"183 0 1 22.895890 0 0 0 \n",
"184 0 1 27.347945 0 1 0 \n",
"185 1 1 27.780822 0 1 0 \n",
"186 1 1 55.553425 1 1 0 \n",
"\n",
" DonorABO RecipientABO RecipientRh ABOmatch ... extcGvHD CD34kgx10d6 \\\n",
"0 1 1 1 0 ... 1 7.20 \n",
"1 -1 -1 1 0 ... 1 4.50 \n",
"2 -1 -1 1 0 ... 1 7.94 \n",
"3 1 2 1 1 ... None 4.25 \n",
"4 1 2 0 1 ... 1 51.85 \n",
".. ... ... ... ... ... ... ... \n",
"182 1 1 0 0 ... 1 11.08 \n",
"183 1 0 1 1 ... 1 4.64 \n",
"184 1 -1 1 1 ... 1 7.73 \n",
"185 1 0 1 1 ... 0 15.41 \n",
"186 1 2 1 1 ... 1 9.91 \n",
"\n",
" CD3dCD34 CD3dkgx10d8 Rbodymass ANCrecovery PLTrecovery \\\n",
"0 1.338760 5.38 35.0 19.0 51.0 \n",
"1 11.078295 0.41 20.6 16.0 37.0 \n",
"2 19.013230 0.42 23.4 23.0 20.0 \n",
"3 29.481647 0.14 50.0 23.0 29.0 \n",
"4 3.972255 13.05 9.0 14.0 14.0 \n",
".. ... ... ... ... ... \n",
"182 2.522750 4.39 44.0 15.0 22.0 \n",
"183 1.038858 4.47 44.5 12.0 30.0 \n",
"184 1.635559 4.73 33.0 16.0 16.0 \n",
"185 8.077770 1.91 24.0 13.0 14.0 \n",
"186 0.948135 10.45 37.0 18.0 20.0 \n",
"\n",
" time_to_aGvHD_III_IV survival_time survival_status \n",
"0 32.0 999.0 0.0 \n",
"1 1000000.0 163.0 1.0 \n",
"2 1000000.0 435.0 1.0 \n",
"3 19.0 53.0 1.0 \n",
"4 1000000.0 2043.0 0.0 \n",
".. ... ... ... \n",
"182 16.0 385.0 1.0 \n",
"183 1000000.0 634.0 1.0 \n",
"184 1000000.0 1895.0 0.0 \n",
"185 54.0 382.0 1.0 \n",
"186 1000000.0 1109.0 0.0 \n",
"\n",
"[187 rows x 37 columns]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_df"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 378
},
"id": "y9uVi9SFeZSa",
"outputId": "6809c06d-5d8c-48a0-9b6d-3c433574f7f7"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Dataset overview:\n",
"Name: bmt.arff\n",
"Objects number: 187; Attributes number: 37\n",
"Basic attribute statistics:\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Donorage | \n",
" Recipientage | \n",
" CD34kgx10d6 | \n",
" CD3dCD34 | \n",
" CD3dkgx10d8 | \n",
" Rbodymass | \n",
" ANCrecovery | \n",
" PLTrecovery | \n",
" time_to_aGvHD_III_IV | \n",
" survival_time | \n",
" survival_status | \n",
"
\n",
" \n",
" \n",
" \n",
" | count | \n",
" 187.000000 | \n",
" 187.000000 | \n",
" 187.000000 | \n",
" 182.000000 | \n",
" 182.000000 | \n",
" 185.000000 | \n",
" 187.000000 | \n",
" 187.000000 | \n",
" 187.000000 | \n",
" 187.000000 | \n",
" 187.000000 | \n",
"
\n",
" \n",
" | mean | \n",
" 33.472068 | \n",
" 9.931551 | \n",
" 11.891781 | \n",
" 5.385096 | \n",
" 4.745714 | \n",
" 35.801081 | \n",
" 26752.866310 | \n",
" 90937.919786 | \n",
" 775408.042781 | \n",
" 938.743316 | \n",
" 0.454545 | \n",
"
\n",
" \n",
" | std | \n",
" 8.271826 | \n",
" 5.305639 | \n",
" 9.914386 | \n",
" 9.598716 | \n",
" 3.859128 | \n",
" 19.650922 | \n",
" 161747.200525 | \n",
" 288242.407688 | \n",
" 418425.252689 | \n",
" 849.589495 | \n",
" 0.499266 | \n",
"
\n",
" \n",
" | min | \n",
" 18.646575 | \n",
" 0.600000 | \n",
" 0.790000 | \n",
" 0.204132 | \n",
" 0.040000 | \n",
" 6.000000 | \n",
" 9.000000 | \n",
" 9.000000 | \n",
" 10.000000 | \n",
" 6.000000 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" | 25% | \n",
" 27.039726 | \n",
" 5.050000 | \n",
" 5.350000 | \n",
" 1.786683 | \n",
" 1.687500 | \n",
" 19.000000 | \n",
" 13.000000 | \n",
" 16.000000 | \n",
" 1000000.000000 | \n",
" 168.500000 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" | 50% | \n",
" 33.550685 | \n",
" 9.600000 | \n",
" 9.720000 | \n",
" 2.734462 | \n",
" 4.325000 | \n",
" 33.000000 | \n",
" 15.000000 | \n",
" 21.000000 | \n",
" 1000000.000000 | \n",
" 676.000000 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" | 75% | \n",
" 40.117809 | \n",
" 14.050000 | \n",
" 15.415000 | \n",
" 5.823565 | \n",
" 6.785000 | \n",
" 50.600000 | \n",
" 17.000000 | \n",
" 37.000000 | \n",
" 1000000.000000 | \n",
" 1604.000000 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" | max | \n",
" 55.553425 | \n",
" 20.200000 | \n",
" 57.780000 | \n",
" 99.560970 | \n",
" 20.020000 | \n",
" 103.400000 | \n",
" 1000000.000000 | \n",
" 1000000.000000 | \n",
" 1000000.000000 | \n",
" 3364.000000 | \n",
" 1.000000 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Donorage Recipientage CD34kgx10d6 CD3dCD34 CD3dkgx10d8 \\\n",
"count 187.000000 187.000000 187.000000 182.000000 182.000000 \n",
"mean 33.472068 9.931551 11.891781 5.385096 4.745714 \n",
"std 8.271826 5.305639 9.914386 9.598716 3.859128 \n",
"min 18.646575 0.600000 0.790000 0.204132 0.040000 \n",
"25% 27.039726 5.050000 5.350000 1.786683 1.687500 \n",
"50% 33.550685 9.600000 9.720000 2.734462 4.325000 \n",
"75% 40.117809 14.050000 15.415000 5.823565 6.785000 \n",
"max 55.553425 20.200000 57.780000 99.560970 20.020000 \n",
"\n",
" Rbodymass ANCrecovery PLTrecovery time_to_aGvHD_III_IV \\\n",
"count 185.000000 187.000000 187.000000 187.000000 \n",
"mean 35.801081 26752.866310 90937.919786 775408.042781 \n",
"std 19.650922 161747.200525 288242.407688 418425.252689 \n",
"min 6.000000 9.000000 9.000000 10.000000 \n",
"25% 19.000000 13.000000 16.000000 1000000.000000 \n",
"50% 33.000000 15.000000 21.000000 1000000.000000 \n",
"75% 50.600000 17.000000 37.000000 1000000.000000 \n",
"max 103.400000 1000000.000000 1000000.000000 1000000.000000 \n",
"\n",
" survival_time survival_status \n",
"count 187.000000 187.000000 \n",
"mean 938.743316 0.454545 \n",
"std 849.589495 0.499266 \n",
"min 6.000000 0.000000 \n",
"25% 168.500000 0.000000 \n",
"50% 676.000000 0.000000 \n",
"75% 1604.000000 1.000000 \n",
"max 3364.000000 1.000000 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(\"Dataset overview:\")\n",
"print(f\"Name: {file_name}\")\n",
"print(f\"Objects number: {data_df.shape[0]}; Attributes number: {data_df.shape[1]}\")\n",
"print(\"Basic attribute statistics:\")\n",
"data_df.describe()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "al2J-WKIesF7"
},
"source": [
"### Survival curve for the entire set (Kaplan Meier curve)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 296
},
"id": "vQSEvAcRfES0",
"outputId": "acd03cb0-a7a8-4d7c-dee9-7f0bb0bddd6f"
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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ULdu3TRt2jT9/PPP+sc//iFJmjBhgp555hk9+OCDuuWWW/Txxx/r9ddf18qVKz13FE0UEmhXn5hw5eQVKyevWIfLK90esgXgv46O1Frj74QuXbrojTfe0NChQzVs2DC9//77ztM4P/30k6688krdcccdevzxx9WhQwetW7dOt956q8rKyppccDpmzBj9+uuvWrBggeLj4xUUFKSUlBSVlZW5rFez+NVmszX6bt+33HKLFi1apJycnDpHbQ4ePCi73a6NGzfWOgVTXyHswYMHNXv2bF1zzTW1XgsODnb+uW3bto1qY0REhHr27FnnawMHDtSuXbv0/vvva82aNfqP//gPpaamuj2aUVcfNtSv2dnZGjVqlGbPnq20tDRFRERo2bJlJ5yVdvDgQcXExLjUEFXztanobn8zN2zYoKFDhzqfV9eqjBkzRkuXLlVeXp5L+u7evbtWrlyp++67TwsWLFDXrl31wgsvKC3NO/+qOZ7NZtOKCSk6YybXpAFgffHx8frkk0+cIWb16tVq166dNm7cqKqqKj311FPOf8XXPH0kHb2Z5YYNG5yjLTt27ND+/ft1+umn17m/zz77TM8++6wuv/xySdKePXu0b98+jx7TTTfdpClTpqhfv37q06dPrdcHDBigyspKFRYW6vzzz2/Uew4cOFA7duyoN3R4Wnh4uNLT05Wenq7rrrtOw4YN02+//aYOHTooMDDQeQ8uT/r8888VHx/vMjK0e/dul3UcDketfQ8cOFD5+flq06aNs6jYV7kdYC688MIGq+PrusruhRdeqE2bNrm7qxbBGSMA/iQuLk5ZWVkaOnSo0tLStHr1avXs2VPl5eV6+umnNXz4cH322WdavHhxrW0DAwN11113aeHChWrTpo0mTZqkc845p87TR5KUmJioV155RUlJSSouLtYDDzxw0tOVa2rfvr3y8vLqncLcq1cvjRo1SqNHj9ZTTz2lAQMGaO/evcrMzNRZZ52lK664otY2M2bM0JVXXqlu3brpuuuuU0BAgLZs2aJt27bpsccec7uNJSUlys/Pd1kWFBSk9u3ba968eYqJidGAAQMUEBCgFStWKDo62jmakZCQoMzMTA0ZMsS5jSckJiYqNzdXy5Yt09lnn62VK1fqrbfeclknISHBeRala9euateunVJTU5WSkqIRI0Zo7ty56tWrl3755RetXLlSI0eObPRptZbAvZAAwM907dpVWVlZ2rdvn9LS0tS9e3fNmzdP//Vf/6W+ffvq1VdfdU7lPV5oaKgeeugh3XTTTRoyZIjCwsK0fPnyevfz4osv6vfff9fAgQN188036+677641xdkTIiMjGzyds2TJEo0ePVr333+/evfurREjRujLL7+st/A2LS1N7733nj788EOdffbZOuecc/TXv/5V8fHxTWrf3//+d8XExLg8qgt127Vrp7lz5yopKUlnn322fvrpJ61atco5EvbUU0/po48+UlxcnAYMGNCk/dflqquu0n333adJkyapf//++vzzz/Xoo4+6rHPttddq2LBhGjp0qDp16qTXXntNNptNq1at0gUXXKBx48apV69euuGGG7R79+5al0TxNpuxwGVoi4uLFRERoaKiIo/PSCopq3BOk2zKtEUA/uPIkSPatWuXunfv7lIL0RosXbpU9957r/bv3+/tpsBiGvreNOfvNyMwAADAcggwAADAcggwAACNHTuW00ewFAIMANRggdJAwGd46/tCgDkOf2cBrVv1hdBqXogNQP1KSkok1b7YXnNjys1xuJ0A0Lq1adNGoaGh2rt3rwIDA10u3Q7AlTFGJSUlKiwsVGRkZIM3o2wOrT7AcDsBANVsNptiYmK0a9euWlctBVC36ptRtrRW/0vN7QQAHM/hcCgxMZHTSEAjBAYGtvjIS7VWH2Ak19sJUAcDICAgoNVdyA6wGk7w1nD94mxmIAAA4OMIMDpWByPJWQcDAAB8FwFGx+pgAACANRBg/o2Z0wAAWAcBBgAAWA4BBgAAWA4BBgAAWA4BBgAAWA4BBgAAWA4BBgAAWA4BBgAAWA4BBgAAWA4BBgAAWA4BBgAAWA4BBgAAWA4Bpg7GeLsFAACgIQSYOly/OFuGFAMAgM8iwPxbSKBdfWLCJUk5ecU6XF7p5RYBAID6EGD+zWazacWEFOdzBmAAAPBdBJjj2GzH/sxpJAAAfBcB5jicRgIAwBoIMMepeRoJAAD4JgJMDcefRgIAAL6JAAMAACyHAAMAACyHAAMAACyHAAMAACyHAAMAACyHAAMAACyHAAMAACyHAAMAACyHAAMAACyHAAMAACyHAAMAACyHAAMAACyHAAMAACyHAAMAACyHAAMAACyHANMAY7zdAgAAUBcCTAOuX5wtQ4oBAMDnEGBqCAm0q09MuCQpJ69Yh8srvdwiAABQEwGmBpvNphUTUrzdDAAA0AACTB1sNm+3AAAANIQAAwAALIcAAwAALIcAAwAALIcAAwAALIcAAwAALIcAAwAALIcAcwJciBcAAN/TpACzaNEiJSQkKDg4WMnJyVq/fn2965aXl2vOnDk69dRTFRwcrH79+mn16tVNbnBL43YCAAD4HrcDzPLlyzV58mTNnDlTX331lfr166e0tDQVFhbWuf706dP1/PPP6+mnn1ZOTo4mTJigkSNHatOmTSfd+ObC7QQAAPBtNuPm8EJycrLOPvtsPfPMM5KkqqoqxcXF6a677tLUqVNrrR8bG6tHHnlEEydOdC679tprFRISov/+7/9u1D6Li4sVERGhoqIihYeHu9PcJjtUWqEzZn4gScqZk6ZQR5sW2S8AAP6iOX+/3RqBKSsr08aNG5WamnrsDQIClJqaquzs7Dq3KS0tVXBwsMuykJAQrVu3rt79lJaWqri42OXR0ridAAAAvsutALNv3z5VVlYqKirKZXlUVJTy8/Pr3CYtLU3z5s3T999/r6qqKn300Ud68803lZeXV+9+MjIyFBER4XzExcW500wAAODnmn0W0oIFC5SYmKjTTjtNDodDkyZN0rhx4xQQUP+up02bpqKiIudjz549zd1MAABgIW4FmI4dO8put6ugoMBleUFBgaKjo+vcplOnTnr77bd16NAh7d69W9u3b1dYWJh69OhR736CgoIUHh7u8gAAAKjmVoBxOBwaNGiQMjMzncuqqqqUmZmplJSUBrcNDg5Wly5dVFFRof/93//V1Vdf3bQWAwCAVs/tqTWTJ0/WmDFjlJSUpMGDB2v+/Pk6dOiQxo0bJ0kaPXq0unTpooyMDEnSF198oZ9//ln9+/fXzz//rFmzZqmqqkoPPvigZ48EAAC0Gm4HmPT0dO3du1czZsxQfn6++vfvr9WrVzsLe3Nzc13qW44cOaLp06frxx9/VFhYmC6//HK98sorioyM9NhBAACA1sXt68B4gzeuA1NSVqE+M7gODAAATeUz14EBAADwBQQYAABgOQQYAABgOQQYAABgOQQYAABgOQQYAABgOQQYAABgOQQYAABgOQQYAABgOQQYAABgOQQYAABgOQQYAABgOQQYAABgOQQYAABgOQQYAABgOQQYAABgOQQYAABgOQQYAABgOQQYAABgOQSY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6Yt3333XrFy50nz33Xdmx44d5uGHHzaBgYFm27ZtxpjW85kw5sR94UufiVYbYAYPHmwmTpzofF5ZWWliY2NNRkaGF1vlWTNnzjT9+vWr87X9+/ebwMBAs2LFCueyb7/91kgy2dnZxpijP3wBAQEmPz/fuc5zzz1nwsPDTWlpabO23ZNq/mhXVVWZ6Oho8+c//9m5bP/+/SYoKMi89tprxhhjcnJyjCTz5ZdfOtd5//33jc1mMz///LMxxphnn33WtG/f3qUvHnroIdO7d+9mPqKmqy/AXH311fVu4699YYwxhYWFRpL55JNPjDGe+148+OCD5owzznDZV3p6uklLS2vuQ2qymn1hzNEfq3vuuafebfy1L4wxpn379uaFF15o1Z+JatV9YYxvfSZa5SmksrIybdy4Uampqc5lAQEBSk1NVXZ2thdb5nnff/+9YmNj1aNHD40aNUq5ubmSpI0bN6q8vNylD0477TR169bN2QfZ2dk688wzFRUV5VwnLS1NxcXF+uabb1r2QDxo165dys/Pdzn2iIgIJScnuxx7ZGSkkpKSnOukpqYqICBAX3zxhXOdCy64QA6Hw7lOWlqaduzYod9//72FjsYzsrKy1LlzZ/Xu3Vt33HGHfv31V+dr/twXRUVFkqQOHTpI8tz3Ijs72+U9qtfx5b9favZFtVdffVUdO3ZU3759NW3aNJWUlDhf88e+qKys1LJly3To0CGlpKS06s9Ezb6o5iufCUvczNHT9u3bp8rKSpcOlqSoqCht377dS63yvOTkZC1dulS9e/dWXl6eZs+erfPPP1/btm1Tfn6+HA6HIiMjXbaJiopSfn6+JCk/P7/OPqp+zaqq217XsR1/7J07d3Z5vU2bNurQoYPLOt27d6/1HtWvtW/fvlna72nDhg3TNddco+7du+uHH37Qww8/rMsuu0zZ2dmy2+1+2xdVVVW69957NWTIEPXt21eSPPa9qG+d4uJiHT58WCEhIc1xSE1WV19I0k033aT4+HjFxsbq66+/1kMPPaQdO3bozTfflORffbF161alpKToyJEjCgsL01tvvaU+ffpo8+bNre4zUV9fSL71mWiVAaa1uOyyy5x/Puuss5ScnKz4+Hi9/vrrPvVlgXfdcMMNzj+feeaZOuuss3TqqacqKytLF198sRdb1rwmTpyobdu2ad26dd5uitfV1xe33367889nnnmmYmJidPHFF+uHH37Qqaee2tLNbFa9e/fW5s2bVVRUpDfeeENjxozRJ5984u1meUV9fdGnTx+f+ky0ylNIHTt2lN1ur1VFXlBQoOjoaC+1qvlFRkaqV69e2rlzp6Kjo1VWVqb9+/e7rHN8H0RHR9fZR9WvWVV12xv6/x8dHa3CwkKX1ysqKvTbb7/5ff/06NFDHTt21M6dOyX5Z19MmjRJ7733ntauXauuXbs6l3vqe1HfOuHh4T73j4f6+qIuycnJkuTy2fCXvnA4HOrZs6cGDRqkjIwM9evXTwsWLGiVn4n6+qIu3vxMtMoA43A4NGjQIGVmZjqXVVVVKTMz0+U8n785ePCgfvjhB8XExGjQoEEKDAx06YMdO3YoNzfX2QcpKSnaunWry4/XRx99pPDwcOdwohV1795d0dHRLsdeXFysL774wuXY9+/fr40bNzrX+fjjj1VVVeX8wqakpOjTTz9VeXm5c52PPvpIvXv39slTJo31f//3f/r1118VExMjyb/6whijSZMm6a233tLHH39c67SXp74XKSkpLu9RvY4v/f1yor6oy+bNmyXJ5bPhD31Rl6qqKpWWlraqz0R9qvuiLl79TLhV8utHli1bZoKCgszSpUtNTk6Ouf32201kZKRL5bTV3X///SYrK8vs2rXLfPbZZyY1NdV07NjRFBYWGmOOTg3s1q2b+fjjj82GDRtMSkqKSUlJcW5fPR3u0ksvNZs3bzarV682nTp1ssQ06gMHDphNmzaZTZs2GUlm3rx5ZtOmTWb37t3GmKPTqCMjI80777xjvv76a3P11VfXOY16wIAB5osvvjDr1q0ziYmJLlOH9+/fb6KioszNN99stm3bZpYtW2ZCQ0N9bupwQ31x4MABM2XKFJOdnW127dpl1qxZYwYOHGgSExPNkSNHnO/hL31xxx13mIiICJOVleUyDbSkpMS5jie+F9XTRB944AHz7bffmkWLFvnclNkT9cXOnTvNnDlzzIYNG8yuXbvMO++8Y3r06GEuuOAC53v4S19MnTrVfPLJJ2bXrl3m66+/NlOnTjU2m818+OGHxpjW85kwpuG+8LXPRKsNMMYY8/TTT5tu3boZh8NhBg8ebP71r395u0kelZ6ebmJiYozD4TBdunQx6enpZufOnc7XDx8+bO68807Tvn17ExoaakaOHGny8vJc3uOnn34yl112mQkJCTEdO3Y0999/vykvL2/pQ3Hb2rVrjaRajzFjxhhjjk6lfvTRR01UVJQJCgoyF198sdmxY4fLe/z666/mxhtvNGFhYSY8PNyMGzfOHDhwwGWdLVu2mPPOO88EBQWZLl26mCeffLKlDrHRGuqLkpISc+mll5pOnTqZwMBAEx8fb8aPH18ryPtLX9TVD5LMkiVLnOt46nuxdu1a079/f+NwOEyPHj1c9uELTtQXubm55oILLjAdOnQwQUFBpmfPnuaBBx5wueaHMf7RF7fccouJj483DofDdOrUyVx88cXO8GJM6/lMGNNwX/jaZ8JmjDHujdkAAAB4V6usgQEAANZGgAEAAJZDgAEAAJZDgAEAAJZDgAEAAJZDgAEAAJZDgAEAAJZDgAEAAJZDgAHQKFlZWbLZbLVuaudpS5cuVWRkpPP5rFmz1L9//2bdJwDrIcAAqNOFF16oe++91/n83HPPVV5eniIiIlq0HVOmTKl14zcAaOPtBgCwBofDoejo6Bbfb1hYmMLCwlp8vwB8GyMwAGoZO3asPvnkEy1YsEA2m002m01Lly51OYVUfarnvffeU+/evRUaGqrrrrtOJSUlevnll5WQkKD27dvr7rvvVmVlpfO9S0tLNWXKFHXp0kVt27ZVcnKysrKy6m1LzVNIY8eO1YgRI/SXv/xFMTExOuWUUzRx4kSVl5c3eR8ArIcRGAC1LFiwQN9995369u2rOXPmSJK++eabWuuVlJRo4cKFWrZsmQ4cOKBrrrlGI0eOVGRkpFatWqUff/xR1157rYYMGaL09HRJ0qRJk5STk6Nly5YpNjZWb731loYNG6atW7cqMTGxUe1bu3atYmJitHbtWu3cuVPp6enq37+/xo8f77F9APBtBBgAtURERMjhcCg0NNR52mj79u211isvL9dzzz2nU089VZJ03XXX6ZVXXlFBQYHCwsLUp08fDR06VGvXrlV6erpyc3O1ZMkS5ebmKjY2VtLRGpfVq1dryZIleuKJJxrVvvbt2+uZZ56R3W7XaaedpiuuuEKZmZkaP368x/YBwLcRYAA0WWhoqDO8SFJUVJQSEhJcalaioqJUWFgoSdq6dasqKyvVq1cvl/cpLS3VKaec0uj9nnHGGbLb7c7nMTEx2rp1q0f3AcC3EWAANFlgYKDLc5vNVueyqqoqSdLBgwdlt9u1ceNGlwAiya1C3ZbYBwDfRoABUCeHw+FSfOsJAwYMUGVlpQoLC3X++ed79L1bch8AvI9ZSADqlJCQoC+++EI//fST9u3b5xzhOBm9evXSqFGjNHr0aL355pvatWuX1q9fr4yMDK1cudIDrW6ZfQDwPgIMgDpNmTJFdrtdffr0UadOnZSbm+uR912yZIlGjx6t+++/X71799aIESP05Zdfqlu3bh55/5baBwDvshljjLcbAQAA4A5GYAAAgOUQYAAAgOUQYAAAgOUQYAAAgOUQYAAAgOUQYAAAgOUQYAAAgOUQYAAAgOUQYAAAgOUQYAAAgOUQYAAAgOX8P0D3fyRIv8NTAAAAAElFTkSuQmCC",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from lifelines import KaplanMeierFitter\n",
"\n",
"# create a kmf object\n",
"kmf = KaplanMeierFitter() \n",
"\n",
"# Fit the data into the model\n",
"kmf.fit(data_df['survival_time'], data_df['survival_status'],label='Kaplan Meier Estimate')\n",
"\n",
"# Create an estimate\n",
"kmf.plot(ci_show=False) "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "r8TgXKGmmSJf"
},
"source": [
"## Import RuleKit"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"id": "w0hYM-8Ele2j"
},
"outputs": [],
"source": [
"from rulekit.survival import SurvivalRules\n",
"from rulekit.params import Measures"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dattexxGmaqJ"
},
"source": [
"## Helper function for creating ruleset characteristics dataframe"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"id": "aLCZkT_SmU4a"
},
"outputs": [],
"source": [
"def get_ruleset_stats(model) -> pd.DataFrame:\n",
" tmp = model.parameters.__dict__\n",
" del tmp['_java_object']\n",
" return pd.DataFrame.from_records([{**tmp, **model.stats.__dict__}])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "u4wOfecjme_d"
},
"source": [
"## Rule induction on full dataset"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"id": "TrO-LyN2mpiP"
},
"outputs": [],
"source": [
"X = data_df.drop(['survival_status'], axis=1)\n",
"y = data_df['survival_status']"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"id": "c5tmU4IHnFjw"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" minimum_covered | \n",
" maximum_uncovered_fraction | \n",
" ignore_missing | \n",
" pruning_enabled | \n",
" max_growing_condition | \n",
" time_total_s | \n",
" time_growing_s | \n",
" time_pruning_s | \n",
" rules_count | \n",
" conditions_per_rule | \n",
" induced_conditions_per_rule | \n",
" avg_rule_coverage | \n",
" avg_rule_precision | \n",
" avg_rule_quality | \n",
" pvalue | \n",
" FDR_pvalue | \n",
" FWER_pvalue | \n",
" fraction_significant | \n",
" fraction_FDR_significant | \n",
" fraction_FWER_significant | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 5.0 | \n",
" 0.0 | \n",
" False | \n",
" True | \n",
" 0.0 | \n",
" 2.245832 | \n",
" 1.209875 | \n",
" 1.013907 | \n",
" 5 | \n",
" 2.4 | \n",
" 72.4 | \n",
" 0.407487 | \n",
" 1.0 | \n",
" 0.999742 | \n",
" 0.000258 | \n",
" 0.00029 | \n",
" 0.000384 | \n",
" 1.0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" minimum_covered maximum_uncovered_fraction ignore_missing \\\n",
"0 5.0 0.0 False \n",
"\n",
" pruning_enabled max_growing_condition time_total_s time_growing_s \\\n",
"0 True 0.0 2.245832 1.209875 \n",
"\n",
" time_pruning_s rules_count conditions_per_rule \\\n",
"0 1.013907 5 2.4 \n",
"\n",
" induced_conditions_per_rule avg_rule_coverage avg_rule_precision \\\n",
"0 72.4 0.407487 1.0 \n",
"\n",
" avg_rule_quality pvalue FDR_pvalue FWER_pvalue fraction_significant \\\n",
"0 0.999742 0.000258 0.00029 0.000384 1.0 \n",
"\n",
" fraction_FDR_significant fraction_FWER_significant \n",
"0 1.0 1.0 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"srv = SurvivalRules(\n",
" survival_time_attr = 'survival_time'\n",
")\n",
"srv.fit(X, y)\n",
"ruleset = srv.model\n",
"predictions = srv.predict(X)\n",
"\n",
"ruleset_stats = get_ruleset_stats(ruleset)\n",
"\n",
"display(ruleset_stats)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(predictions[0][\"times\"], predictions[0][\"probabilities\"])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "abrtDQOtpVoL"
},
"source": [
"### Generated rules"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"id": "FskFiB6PpVI_"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"IF Relapse = {0} AND Donorage = (-inf, 45.16) AND Recipientage = (-inf, 17.45) THEN \n",
"IF HLAmismatch = {0} AND Donorage = <33.34, 42.14) AND Gendermatch = {0} AND RecipientRh = {1} AND Recipientage = <3.30, inf) THEN \n",
"IF Relapse = {1} AND PLTrecovery = <15.50, inf) THEN \n",
"IF PLTrecovery = (-inf, 266) THEN \n",
"IF PLTrecovery = <266, inf) THEN \n"
]
}
],
"source": [
"for rule in ruleset.rules:\n",
" print(rule)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GkNBc5iBpwmj"
},
"source": [
"### Rules evaluation on full set"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"id": "9UjrC8r-p59d"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Integrated Brier Score: 0.19431881630173065\n"
]
}
],
"source": [
"integrated_brier_score = srv.score(X, y)\n",
"print(f'Integrated Brier Score: {integrated_brier_score}')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FpoSoaKdqAGQ"
},
"source": [
"## Stratified K-Folds cross-validation"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"id": "0nNv6a84qTsq"
},
"outputs": [],
"source": [
"from sklearn.model_selection import StratifiedKFold\n",
"from rulekit.exceptions import RuleKitJavaException\n",
"skf = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)\n",
"\n",
"ruleset_stats = pd.DataFrame()\n",
"survival_metrics = []\n",
"\n",
"\n",
"for train_index, test_index in skf.split(X, y):\n",
" x_train, x_test = X.iloc[train_index], X.iloc[test_index]\n",
" y_train, y_test = y.iloc[train_index], y.iloc[test_index]\n",
"\n",
" srv = SurvivalRules(\n",
" survival_time_attr = 'survival_time'\n",
" )\n",
" try:\n",
" srv.fit(x_train, y_train)\n",
" except Exception as e:\n",
" e = RuleKitJavaException(e)\n",
" print(e.print_java_stack_trace())\n",
" ruleset = srv.model\n",
"\n",
" ibs = srv.score(x_test, y_test)\n",
"\n",
" survival_metrics.append(ibs)\n",
" ruleset_stats = pd.concat([ruleset_stats, get_ruleset_stats(ruleset)])\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MfCOH_f3sICm"
},
"source": [
"Ruleset characteristics (average)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"id": "xzbazr51sRd3"
},
"outputs": [
{
"data": {
"text/plain": [
"minimum_covered 5.000000\n",
"maximum_uncovered_fraction 0.000000\n",
"ignore_missing 0.000000\n",
"pruning_enabled 1.000000\n",
"max_growing_condition 0.000000\n",
"time_total_s 1.273897\n",
"time_growing_s 0.482035\n",
"time_pruning_s 0.790854\n",
"rules_count 5.100000\n",
"conditions_per_rule 2.535119\n",
"induced_conditions_per_rule 69.852381\n",
"avg_rule_coverage 0.438761\n",
"avg_rule_precision 1.000000\n",
"avg_rule_quality 0.992375\n",
"pvalue 0.007625\n",
"FDR_pvalue 0.007751\n",
"FWER_pvalue 0.008209\n",
"fraction_significant 0.948214\n",
"fraction_FDR_significant 0.948214\n",
"fraction_FWER_significant 0.948214\n",
"dtype: float64"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display(ruleset_stats.mean())"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_SmDJho4sVEO"
},
"source": [
"Rules evaluation on dataset (average)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"id": "Co-fNd9nshWB"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Integrated Brier Score: 0.2057312271821908\n"
]
}
],
"source": [
"print(f'Integrated Brier Score: {np.mean(survival_metrics)}')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "d-GdQ-wUtzW9"
},
"source": [
"## Hyperparameters tuning\n",
"\n",
"This one gonna take a while..."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import StratifiedKFold\n",
"from sklearn.model_selection import GridSearchCV\n",
"from rulekit.params import Measures"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"def scorer(estimator, X, y):\n",
" return (-1 * estimator.score(X,y))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"id": "xNUji8U7t2wd"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Best Integrated Brier Score: 0.214374 using {'minsupp_new': 3, 'survival_time_attr': 'survival_time'}\n"
]
}
],
"source": [
"# define models and parameters\n",
"model = SurvivalRules()\n",
"\n",
"# define grid search\n",
"grid = {\n",
" 'survival_time_attr': ['survival_time'],\n",
" 'minsupp_new': range(3, 10),\n",
"}\n",
"\n",
"cv = StratifiedKFold(n_splits=3)\n",
"grid_search = GridSearchCV(estimator=model, param_grid=grid, cv=cv, scoring=scorer) \n",
"grid_result = grid_search.fit(X, y)\n",
"\n",
"# summarize results\n",
"print(\"Best Integrated Brier Score: %f using %s\" % ( (-1)*grid_result.best_score_, grid_result.best_params_))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Building model with tuned hyperparameters\n",
"\n",
"### Split dataset to train and test (80%/20%)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True, stratify=y)\n",
"\n",
"srv = SurvivalRules(\n",
" survival_time_attr='survival_time',\n",
" minsupp_new=5\n",
")\n",
"srv.fit(X_train, y_train)\n",
"ruleset = srv.model\n",
"ruleset_stats = get_ruleset_stats(ruleset)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Rules evaluation"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"minimum_covered 5.0\n",
"maximum_uncovered_fraction 0.0\n",
"ignore_missing False\n",
"pruning_enabled True\n",
"max_growing_condition 0.0\n",
"time_total_s 0.625197\n",
"time_growing_s 0.259452\n",
"time_pruning_s 0.364996\n",
"rules_count 5\n",
"conditions_per_rule 3.2\n",
"induced_conditions_per_rule 61.0\n",
"avg_rule_coverage 0.430872\n",
"avg_rule_precision 1.0\n",
"avg_rule_quality 0.999995\n",
"pvalue 0.000005\n",
"FDR_pvalue 0.000005\n",
"FWER_pvalue 0.000005\n",
"fraction_significant 1.0\n",
"fraction_FDR_significant 1.0\n",
"fraction_FWER_significant 1.0\n",
"Name: 0, dtype: object"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display(ruleset_stats.iloc[0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Validate model on test dataset"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Integrated Brier Score: 0.22981693833242725\n"
]
}
],
"source": [
"integrated_brier_score = srv.score(X_test, y_test)\n",
"print(f'Integrated Brier Score: {integrated_brier_score}')"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"predictions = srv.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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DAAAiDgxG2CWLl2qoUOHKiEhQQUFBdqwYYPVJQXdT37yE9lsti6vCy+80P9+Y2Ojbr/9dvXv318pKSn6+7//e1VUVHTZR1lZma6++molJSVp4MCBuueee9Ta2trXhxKwd999V9dcc41ycnJks9m0evXqLu8bY7Rw4UJlZ2crMTFRRUVF2r17d5d1jh07phtvvFFut1tpaWm6+eabVVdX12Wdbdu26dJLL1VCQoLy8vL0i1/8ItSHFrCztcW//Mu/fOU8mT59epd1oqUtFi9erEsuuUT9+vXTwIEDdd1112nXrl1d1gnW92LdunW6+OKL5XK5NHLkSD3zzDOhPryAnEtbXHHFFV85N2699dYu60RDW/zmN7/RhAkT/DdgKyws1Ouvv+5/P1bOCensbRFW54SJQStXrjROp9OsWLHCfPLJJ2bu3LkmLS3NVFRUWF1aUC1atMiMHTvWHD582P86cuSI//1bb73V5OXlmZKSErNx40bzta99zXz961/3v9/a2mrGjRtnioqKzJYtW8xrr71mMjMzzYIFC6w4nIC89tpr5sEHHzSrVq0ykszLL7/c5f2f//znJjU11axevdp89NFH5tvf/rYZNmyYaWho8K8zffp0k5+fbz744APz3nvvmZEjR5rrr7/e/35NTY3xeDzmxhtvNNu3bzfPPfecSUxMNE899VRfHeY5OVtbzJ4920yfPr3LeXLs2LEu60RLWxQXF5vf/e53Zvv27Wbr1q1m5syZZvDgwaaurs6/TjC+F3v37jVJSUlm/vz5ZseOHeaJJ54wDofDrFmzpk+P90zOpS0uv/xyM3fu3C7nRk1Njf/9aGmLV155xbz66qvms88+M7t27TIPPPCAiY+PN9u3bzfGxM45YczZ2yKczomYDDBTp041t99+u//vbW1tJicnxyxevNjCqoJv0aJFJj8/v9v3qqurTXx8vHnxxRf9y3bu3GkkmdLSUmNM+w+f3W435eXl/nV+85vfGLfbbZqamkJaezCd/qPt8/lMVlaW+a//+i//surqauNyucxzzz1njDFmx44dRpL529/+5l/n9ddfNzabzRw8eNAYY8yTTz5p0tPTu7TFfffdZ0aPHh3iI+q9ngLMtdde2+M20doWxhhTWVlpJJl33nnHGBO878W9995rxo4d2+WzZs2aZYqLi0N9SL12elsY0/5jdccdd/S4TbS2hTHGpKenm6effjqmz4lOnW1hTHidEzE3hNTc3KxNmzapqKjIv8xut6uoqEilpaUWVhYau3fvVk5OjoYPH64bb7xRZWVlkqRNmzappaWlSztceOGFGjx4sL8dSktLNX78eHk8Hv86xcXF8nq9+uSTT/r2QIJo3759Ki8v73LsqampKigo6HLsaWlpmjJlin+doqIi2e12ffjhh/51LrvsMjmdTv86xcXF2rVrl44fP95HRxMc69at08CBAzV69GjddtttOnr0qP+9aG6LmpoaSVJGRoak4H0vSktLu+yjc51w/m/M6W3R6X/+53+UmZmpcePGacGCBTpx4oT/vWhsi7a2Nq1cuVL19fUqLCyM6XPi9LboFC7nREQ8zDGYqqqq1NbW1qVxJcnj8ejTTz+1qKrQKCgo0DPPPKPRo0fr8OHD+o//+A9deuml2r59u8rLy+V0OpWWltZlG4/Ho/LycklSeXl5t+3U+V6k6qy9u2M79dgHDhzY5f24uDhlZGR0WWfYsGFf2Ufne+np6SGpP9imT5+u7373uxo2bJg+//xzPfDAA5oxY4ZKS0vlcDiiti18Pp/uvPNOTZs2TePGjZOkoH0velrH6/WqoaFBiYmJoTikXuuuLSTphhtu0JAhQ5STk6Nt27bpvvvu065du7Rq1SpJ0dUWH3/8sQoLC9XY2KiUlBS9/PLLGjNmjLZu3Rpz50RPbSGF1zkRcwEmlsyYMcP/5wkTJqigoEBDhgzRCy+8EFZfFljre9/7nv/P48eP14QJEzRixAitW7dOV155pYWVhdbtt9+u7du3a/369VaXYrme2uKWW27x/3n8+PHKzs7WlVdeqc8//1wjRozo6zJDavTo0dq6datqamr00ksvafbs2XrnnXesLssSPbXFmDFjwuqciLkhpMzMTDkcjq/MIK+oqFBWVpZFVfWNtLQ0jRo1Snv27FFWVpaam5tVXV3dZZ1T2yErK6vbdup8L1J11n6mcyArK0uVlZVd3m9tbdWxY8eivn2GDx+uzMxM7dmzR1J0tsW8efP05z//WW+//bYGDRrkXx6s70VP67jd7rD7n4ee2qI7BQUFktTl3IiWtnA6nRo5cqQmT56sxYsXKz8/X7/61a9i8pzoqS26Y+U5EXMBxul0avLkySopKfEv8/l8Kikp6TLGF43q6ur0+eefKzs7W5MnT1Z8fHyXdti1a5fKysr87VBYWKiPP/64y4/X2rVr5Xa7/d2JkWjYsGHKysrqcuxer1cffvhhl2Ovrq7Wpk2b/Ou89dZb8vl8/i9sYWGh3n33XbW0tPjXWbt2rUaPHh2WQybn6sCBAzp69Kiys7MlRVdbGGM0b948vfzyy3rrrbe+MuwVrO9FYWFhl310rhNO/405W1t0Z+vWrZLU5dyIhrbojs/nU1NTU0ydEz3pbIvuWHpOBDTlN0qsXLnSuFwu88wzz5gdO3aYW265xaSlpXWZNR0N7r77brNu3Tqzb98+89e//tUUFRWZzMxMU1lZaYxpvzRw8ODB5q233jIbN240hYWFprCw0L995+VwV111ldm6datZs2aNGTBgQERcRl1bW2u2bNlitmzZYiSZJUuWmC1btpgvv/zSGNN+GXVaWpr505/+ZLZt22auvfbabi+jnjRpkvnwww/N+vXrzQUXXNDl0uHq6mrj8XjM97//fbN9+3azcuVKk5SUFHaXDp+pLWpra82Pf/xjU1paavbt22f+8pe/mIsvvthccMEFprGx0b+PaGmL2267zaSmppp169Z1uQz0xIkT/nWC8b3ovEz0nnvuMTt37jRLly4Nu0tmz9YWe/bsMY888ojZuHGj2bdvn/nTn/5khg8fbi677DL/PqKlLe6//37zzjvvmH379plt27aZ+++/39hsNvPmm28aY2LnnDDmzG0RbudETAYYY4x54oknzODBg43T6TRTp041H3zwgdUlBd2sWbNMdna2cTqdJjc318yaNcvs2bPH/35DQ4P5t3/7N5Oenm6SkpLMd77zHXP48OEu+/jiiy/MjBkzTGJiosnMzDR33323aWlp6etDCdjbb79tJH3lNXv2bGNM+6XUDz/8sPF4PMblcpkrr7zS7Nq1q8s+jh49aq6//nqTkpJi3G63mTNnjqmtre2yzkcffWS+8Y1vGJfLZXJzc83Pf/7zvjrEc3amtjhx4oS56qqrzIABA0x8fLwZMmSImTt37lfCfLS0RXftIMn87ne/868TrO/F22+/bSZOnGicTqcZPnx4l88IB2dri7KyMnPZZZeZjIwM43K5zMiRI80999zT5Z4fxkRHW/zgBz8wQ4YMMU6n0wwYMMBceeWV/vBiTOycE8acuS3C7ZywGWNMYH02AAAA1oq5OTAAACDyEWAAAEDEIcAAAICIQ4ABAAARhwADAAAiDgEGAABEHAIMAACIOAQYAAAQcQgwAAAg4hBgAABAxCHAAACAiEOAAQAAEef/AsLZK9kfC4woAAAAAElFTkSuQmCC",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(predictions[0][\"times\"], predictions[0][\"probabilities\"])"
]
}
],
"metadata": {
"colab": {
"collapsed_sections": [],
"name": "Raport_przezyciowy.ipynb",
"provenance": [],
"toc_visible": true
},
"kernelspec": {
"display_name": "env",
"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.9.10"
},
"metadata": {
"interpreter": {
"hash": "62266c16fff41e971c13e9cb2ad3d47e4ef45d0678714c255381eb9fdcbd7032"
}
}
},
"nbformat": 4,
"nbformat_minor": 0
}