{
"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",
" 3.486387 | \n",
" 1.575069 | \n",
" 1.873982 | \n",
" 4 | \n",
" 3.0 | \n",
" 86.25 | \n",
" 0.485294 | \n",
" 1.0 | \n",
" 0.999678 | \n",
" 0.000322 | \n",
" 0.000375 | \n",
" 0.00048 | \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 3.486387 1.575069 \n",
"\n",
" time_pruning_s rules_count conditions_per_rule \\\n",
"0 1.873982 4 3.0 \n",
"\n",
" induced_conditions_per_rule avg_rule_coverage avg_rule_precision \\\n",
"0 86.25 0.485294 1.0 \n",
"\n",
" avg_rule_quality pvalue FDR_pvalue FWER_pvalue fraction_significant \\\n",
"0 0.999678 0.000322 0.000375 0.00048 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"
]
}
],
"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.2154545054362314\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",
"\n",
"skf = StratifiedKFold(n_splits=10)\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",
" srv.fit(x_train, y_train)\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 2.550110\n",
"time_growing_s 1.032773\n",
"time_pruning_s 1.515146\n",
"rules_count 5.700000\n",
"conditions_per_rule 3.329405\n",
"induced_conditions_per_rule 68.789167\n",
"avg_rule_coverage 0.389676\n",
"avg_rule_precision 1.000000\n",
"avg_rule_quality 0.998029\n",
"pvalue 0.001971\n",
"FDR_pvalue 0.002043\n",
"FWER_pvalue 0.002328\n",
"fraction_significant 1.000000\n",
"fraction_FDR_significant 1.000000\n",
"fraction_FWER_significant 1.000000\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.24666778331912664\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.215827 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": 22,
"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 2.74258\n",
"time_growing_s 0.960948\n",
"time_pruning_s 1.78038\n",
"rules_count 7\n",
"conditions_per_rule 3.428571\n",
"induced_conditions_per_rule 71.142857\n",
"avg_rule_coverage 0.299137\n",
"avg_rule_precision 1.0\n",
"avg_rule_quality 0.994714\n",
"pvalue 0.005286\n",
"FDR_pvalue 0.005376\n",
"FWER_pvalue 0.005743\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": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Integrated Brier Score: 0.22534751550121987\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": 24,
"metadata": {},
"outputs": [],
"source": [
"predictions = srv.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjEAAAGdCAYAAADjWSL8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAuzUlEQVR4nO3de3xU9Z3/8ffMkJkk5gYkJCEEwk0oEkBDifHekoriWrX97VJ1C5tWfMji1jZdq3gBa3dNH+2j/PDnorit1K5thdbi5VEp1Y3ipUapXOSmKIKEWwIBciGBhMx8f3/ADIwkmElm5syZeT0fj/N4xJlzTj7z9cR5+72c4zDGGAEAANiM0+oCAAAAeoMQAwAAbIkQAwAAbIkQAwAAbIkQAwAAbIkQAwAAbIkQAwAAbIkQAwAAbKmf1QX0hM/n0759+5Seni6Hw2F1OQAAoAeMMWppadHgwYPldIa/38QWIWbfvn0qLCy0ugwAANALu3fv1pAhQ8J+XluEmPT0dEknGyEjI8PiagAAQE80NzersLAw8D0ebrYIMf4hpIyMDEIMAAA2E6mpIEzsBQAAtkSIAQAAtkSIAQAAtkSIAQAAtkSIAQAAtkSIAQAAtkSIAQAAtkSIAQAAtkSIAQAAtkSIAQAAtkSIAQAAtkSIAQAAtpTQIWbZmlrd+ft1OtBy3OpSAABAiBI6xDzz7i79eeN+1Xx6yOpSAABAiBI6xFwycqAk6d0dhBgAAOwmwUNMtiTpHXpiAACwnYQOMV8ePkAup0O7DrVpz5E2q8sBAAAhSOgQk+bpp4lDMiWJeTEAANhMQocY6fSQEiEGAAB7IcScmtz7zqeHZIyxuBoAANBTCR9iLhrWX26XU3XNx7WzodXqcgAAQA8lfIhJTnLpomFZklilBACAnSR8iJGYFwMAgB0RYnR6XkzNjkPy+ZgXAwCAHRBiJE0YkqVUt0uHWzv08YEWq8sBAAA9QIiR5O7n1JeLBkiS3tnOkBIAAHZAiDnlzKXWAAAg9hFiTvFP7n1vxyF1en0WVwMAAL4IIeaUcYMzlJHcTy3tndqyr9nqcgAAwBcgxJzicjpUOoIhJQAA7IIQc4bT82IaLK4EAAB8EULMGfzzYv7+2WF1dDIvBgCAWEaIOcP5uWkaeJ5bx0/4tGF3o9XlAACAcyDEnMHhcKjs1JDSL9/aoWMdXosrAgAA3SHEfM4/TS6U0yG9urVeNy7+m7YfOGp1SQAAoAuEmM+54vwc/e62i5WT7tG2+hZ9/b/e1osb9lpdFgAA+BxCTBfKRg7Uyu9drktGDlRbh1d3LdugeSs26fgJhpcAAIgVhJhu5KR79Mx3S/W9qaPlcEjPrqnVNx5/Rw1H260uDQAAiBBzTi6nQ5VfO1//850pGnieW1v3N2vZmlqrywIAACLE9Mjlo3P0jYsKJEktxzstrgYAAEiEmB5zOhySJK/PWFwJAACQCDE95nSeDDFkGAAAYgMhpodcDn+IIcUAABALCDE95O+JYTgJAIDYQIjpoVMZRl56YgAAiAmEmB7yDycZQgwAADGBENNDDCcBABBbCDE95AqEGIsLAQAAkggxPcbqJAAAYgshpodOZRhCDAAAMYIQ00Mu5sQAABBTCDE95HIynAQAQCwhxPQQz04CACC2EGJ66HSIsbgQAAAgiRDTY65TLcXN7gAAiA2EmB4K9MQQYgAAiAmEmB5idRIAALGFENNDrE4CACC2EGJ6yOG/Yy8TewEAiAmEmB5yMScGAICYQojpIf/qJB9zYgAAiAmEmB5idRIAALGFENNDzsBTrC0uBAAASOpliFm8eLGKioqUnJys0tJSrVmzptt9T5w4oYcfflgjR45UcnKyJk6cqFWrVvW6YKv0c50MMSc6mdkLAEAsCDnELF++XJWVlVqwYIHWrVuniRMnatq0aTpw4ECX+z/wwAN68skn9dhjj2nr1q264447dNNNN2n9+vV9Lj6a0pP7SZKOtndaXAkAAJB6EWIWLlyo2bNnq6KiQuPGjdOSJUuUmpqqpUuXdrn/M888o/vuu0/Tp0/XiBEjNGfOHE2fPl2/+MUv+lx8NGUkJ0mSWo6fsLgSAAAghRhiOjo6tHbtWpWXl58+gdOp8vJy1dTUdHlMe3u7kpOTg15LSUnR22+/3e3vaW9vV3Nzc9BmtfRTIab5eCfPTwIAIAaEFGIaGhrk9XqVm5sb9Hpubq7q6uq6PGbatGlauHChPvnkE/l8Pr366qtasWKF9u/f3+3vqaqqUmZmZmArLCwMpcyIyEg5OZzk9Rm1dXgtrgYAAER8ddKjjz6q0aNHa+zYsXK73brzzjtVUVEhp7P7Xz1v3jw1NTUFtt27d0e6zC+UkuQKPHqg5TjzYgAAsFpIISY7O1sul0v19fVBr9fX1ysvL6/LY3JycvTCCy+otbVVu3bt0kcffaS0tDSNGDGi29/j8XiUkZERtFnN4XAEJvcyLwYAAOuFFGLcbrdKSkpUXV0deM3n86m6ulplZWXnPDY5OVkFBQXq7OzUn/70J91www29q9hCGWfMiwEAANbqF+oBlZWVmjVrliZPnqwpU6Zo0aJFam1tVUVFhSRp5syZKigoUFVVlSTpvffe0969ezVp0iTt3btXDz30kHw+n370ox+F95NEgb8nppmeGAAALBdyiJkxY4YOHjyo+fPnq66uTpMmTdKqVasCk31ra2uD5rscP35cDzzwgHbs2KG0tDRNnz5dzzzzjLKyssL2IaIlJ90jSXrr4wZ9Zcwgi6sBACCxOYwN1gs3NzcrMzNTTU1Nls6PefPjg5q5dI1cTode/t5lGptn/VwdAABiVaS/v3l2UgiuOD9H147Pk9dnNP+FLdwvBgAACxFiQvTAP4xTSpJLaz47rBc27LW6HAAAEhYhJkQFWSm686ujJEmPrPxI7Z3c+A4AACsQYnrhtsuHKzfDo4Mt7Vq97aDV5QAAkJAIMb3g6efSjZMKJEnPr2NICQAAKxBieunGC0+GmNc+OqCmNu4bAwBAtBFieulL+Rkam5euDq9PKzd3/zBLAAAQGYSYPriuOF+S9LftDRZXAgBA4iHE9IH/Dr7HT7BCCQCAaCPE9IEn6WTztXf6LK4EAIDEQ4jpA7fLJUlqP0GIAQAg2ggxfeDpd7L5Go62y+fjEQQAAEQTIaYPiodkKiXJpR0NrXryzR1WlwMAQEIhxPRBbkayHvr6OEnSL17Zpg27G60tCACABEKI6aN/mlyo64rz1ekzumvZeh1t77S6JAAAEgIhpo8cDoceualYBVkp2nWoTQte3GJ1SQAAJARCTBhkpiZp0bcmSZL+tG6PGo62W1sQAAAJgBATJl8uGqBRg9IkSRv3NFpbDAAACYAQE0YTh2RJkjbsbrK2EAAAEgAhJowmFWZKkj5glRIAABFHiAmjCad6YhhOAgAg8ggxYZSflSxJajx2wuJKAACIf4SYMHLIIUkyPIEAAICII8SEkdNx+mdDkgEAIKIIMWHkcJxOMWQYAAAiixATRkE9MdaVAQBAQiDEhJF/Towk+eiKAQAgoggx4RQ0J8a6MgAASASEmDA6cziJnhgAACKLEBNGZ07sBQAAkUWICSMnw0kAAEQNISaMmNgLAED0EGLCyMESawAAooYQE0YOJvYCABA1hJgwOnM4iQwDAEBkEWLC6MyJvYwnAQAQWYSYMDpziTXDSQAARBYhJozoiAEAIHoIMWHExF4AAKKHEBNGZw4nkWEAAIgsQkyY+Sf3GlIMAAARRYgJM39vDBEGAIDIIsSEmX9AiY4YAAAiixATZs5TPTFM7AUAILIIMeHmnxNjbRUAAMQ9QkyY+Sf2thw/YW0hAADEOUJMmF00tL8k6f9Vf2JxJQAAxDdCTJg9+A/j5HI6tHJTnd78+KDV5QAAELcIMWH2pfwMzSwbJkl66KUtau/0WlwRAADxiRATAT/42vnKTvNoR0OrfvXWTqvLAQAgLhFiIiAjOUk/umaMJOlP6/ZYXA0AAPGJEBMhFw8fKEnae+QYjyAAACACCDERkpeZLIdDau/06VBrh9XlAAAQdwgxEeLu59SgdI+kk70xAAAgvAgxETQ4K0WStK+REAMAQLgRYiKo4FSI2UuIAQAg7AgxEUSIAQAgcggxEVTQn+EkAAAihRATQYMz6YkBACBSCDERdLon5rjFlQAAEH8IMRHkX510uLVDbR2dFlcDAEB8IcREUGZKktI9/STRGwMAQLj1KsQsXrxYRUVFSk5OVmlpqdasWXPO/RctWqQxY8YoJSVFhYWF+sEPfqDjxxPjS30wK5QAAIiIkEPM8uXLVVlZqQULFmjdunWaOHGipk2bpgMHDnS5/+9//3vde++9WrBggT788EM99dRTWr58ue67774+F28HrFACACAyQg4xCxcu1OzZs1VRUaFx48ZpyZIlSk1N1dKlS7vc/5133tGll16qW265RUVFRbr66qt18803f2HvTbwYnJUsiUcPAAAQbiGFmI6ODq1du1bl5eWnT+B0qry8XDU1NV0ec8kll2jt2rWB0LJjxw6tXLlS06dP7/b3tLe3q7m5OWizq4KsVEn0xAAAEG79Qtm5oaFBXq9Xubm5Qa/n5ubqo48+6vKYW265RQ0NDbrssstkjFFnZ6fuuOOOcw4nVVVV6cc//nEopcUsf0/MHkIMAABhFfHVSatXr9Yjjzyixx9/XOvWrdOKFSv08ssv6yc/+Um3x8ybN09NTU2Bbffu3ZEuM2KGMCcGAICICKknJjs7Wy6XS/X19UGv19fXKy8vr8tjHnzwQX3729/WbbfdJkkqLi5Wa2urbr/9dt1///1yOs/OUR6PRx6PJ5TSYpZ/dVJd03F5fUYup8PiigAAiA8h9cS43W6VlJSouro68JrP51N1dbXKysq6PKatre2soOJyuSRJxphQ67WdQenJ6ud0qNNndKAlMZaVAwAQDSH1xEhSZWWlZs2apcmTJ2vKlClatGiRWltbVVFRIUmaOXOmCgoKVFVVJUm6/vrrtXDhQl144YUqLS3V9u3b9eCDD+r6668PhJl45nI6lJeZrD1Hjmlf4zHln3qeEgAA6JuQQ8yMGTN08OBBzZ8/X3V1dZo0aZJWrVoVmOxbW1sb1PPywAMPyOFw6IEHHtDevXuVk5Oj66+/Xv/5n/8Zvk8R4wqyUrTnyDHtOXJMJcOsrgYAgPjgMDYY02lublZmZqaampqUkZFhdTkhq1y+QSvW79U914zVnKtGWl0OAABREenvb56dFAX+u/bubWyzuBIAAOIHISYK/CuUeAgkAADhQ4iJgqEDTt6195MDLRZXAgBA/CDERMGEIZlyOqTdh49pfxM3vQMAIBwIMVGQnpyk8QWZkqQ1Ow9bXA0AAPGBEBMlU4oGSJLe3UGIAQAgHAgxUVI6YqAkac3OQxZXAgBAfCDERMmXi/rL4ZA+Pdiqgy3tVpcDAIDtEWKiJCvVrTG56ZKkv3/GkBIAAH1FiImi0uEn58W8t4MhJQAA+ooQE0X+eTHvsUIJAIA+I8RE0ZRTPTHb6lvU2NZhcTUAANgbISaKstM8GplznozhfjEAAPQVISbKTi+1JsQAANAXhJgoC0zuJcQAANAnhJgo88+L2bKvSS3HT1hcDQAA9kWIibL8zBQNHZAqn5He33XE6nIAALAtQowF/ENKzIsBAKD3CDEWmMJN7wAA6DNCjAUuPrVCaeOeJh3r8FpcDQAA9kSIscCQ/inKz0xWp89oXS3zYgAA6A1CjAUcDgdLrQEA6CNCjEX8N7178+ODFlcCAIA9EWIs8tWxg+R2ObVhdyMTfAEA6AVCjEVyM5L1fyYPkSQ99tp2i6sBAMB+CDEWmnPlSPVzOvT29gYm+AIAECJCjIUKB6TqpgsLJEmPVX9icTUAANgLIcZic78ySk6H9Pq2g9q0p8nqcgAAsA1CjMWKss/TDZNO9ca8Rm8MAAA9RYiJAXO/MkoOh/TK1np9uL/Z6nIAALAFQkwMGDUoTdOL8yVJ//U6K5UAAOgJQkyM+LevjpIkrdy0X9sPtFhcDQAAsY8QEyPG5mXo6nG5MkZa/PqnVpcDAEDMI8TEkH/76mhJ0osb9uqzhlaLqwEAILYRYmJI8ZBMfWVMjnxGenw1c2MAADgXQkyM+bepJ3tjVqzbq92H2yyuBgCA2EWIiTEXDe2vy0Zlq9NntOQN5sYAANAdQkwM8q9U+uP7e1TXdNziagAAiE2EmBhUOmKgpgwfoA6vj94YAAC6QYiJUd87tVLp2TW1OtBCbwwAAJ9HiIlRl44aqAuHZqm906dfvbXT6nIAAIg5hJgY5XA4Ar0xv313lw63dlhcEQAAsYUQE8OuGpOj4oJMtXV49dTbO6wuBwCAmEKIiWEOh0O3XzFCkvTKlnqLqwEAILYQYmLcBYMzJEn7Go/JGGNxNQAAxA5CTIwbnJUiSWrt8Krp2AmLqwEAIHYQYmJccpJL2WluSdLexmMWVwMAQOwgxNiAvzdm7xFCDAAAfoQYGyg4FWL20RMDAEAAIcYG/D0x+3iOEgAAAYQYGyhgOAkAgLMQYmwgMCeG4SQAAAIIMTZQQIgBAOAshBgbKOh/MsQcbGlXe6fX4moAAIgNhBgb6J+apOSkk/+q9jcyuRcAAIkQYwsOh4Nl1gAAfA4hxiaY3AsAQDBCjE0M6U+IAQDgTIQYmxicyXASAABnIsTYBMNJAAAEI8TYhH+Z9T5WJwEAIIkQYxtn3vDOGGNxNQAAWI8QYxN5mclyOKSOTp8ajnZYXQ4AAJbrVYhZvHixioqKlJycrNLSUq1Zs6bbfa+66io5HI6ztuuuu67XRSeiJJdTuenJkqQ9R9osrgYAAOuFHGKWL1+uyspKLViwQOvWrdPEiRM1bdo0HThwoMv9V6xYof379we2zZs3y+Vy6R//8R/7XHyiGTnoPEnStroWiysBAMB6IYeYhQsXavbs2aqoqNC4ceO0ZMkSpaamaunSpV3uP2DAAOXl5QW2V199VampqYSYXrhgcKYkacu+ZosrAQDAeiGFmI6ODq1du1bl5eWnT+B0qry8XDU1NT06x1NPPaVvfetbOu+887rdp729Xc3NzUEbpAsGZ0iStuxrsrgSAACsF1KIaWhokNfrVW5ubtDrubm5qqur+8Lj16xZo82bN+u22247535VVVXKzMwMbIWFhaGUGbf8IebD/S3y+lihBABIbFFdnfTUU0+puLhYU6ZMOed+8+bNU1NTU2DbvXt3lCqMbcOz05SS5NKxE17tbGi1uhwAACwVUojJzs6Wy+VSfX190Ov19fXKy8s757Gtra1atmyZvvvd737h7/F4PMrIyAjaILmcDo3NT5fEkBIAACGFGLfbrZKSElVXVwde8/l8qq6uVllZ2TmP/eMf/6j29nb98z//c+8qhaTTQ0pbmdwLAEhw/UI9oLKyUrNmzdLkyZM1ZcoULVq0SK2traqoqJAkzZw5UwUFBaqqqgo67qmnntKNN96ogQMHhqfyBMUKJQAATgo5xMyYMUMHDx7U/PnzVVdXp0mTJmnVqlWByb61tbVyOoM7eLZt26a3335br7zySniqTmBnrlAyxsjhcFhcEQAA1nAYGzyIp7m5WZmZmWpqakr4+THHT3h1wYK/yuszeuferwaebg0AQKyJ9Pc3z06ymeQkl0YPSpPEkBIAILERYmxoHDe9AwCAEGNHTO4FAIAQY0ssswYAgBBjS/7hpL2Nx9TY1mFxNQAAWIMQY0MZyUkaOiBVEr0xAIDERYixqdP3iyHEAAASEyHGpi5ghRIAIMERYmyKFUoAgERHiLEpf0/MpweP6liH1+JqAACIPkKMTQ3KSFZ2mkc+I23dT28MACDxEGJsbMKQk0NKm/Y0WlsIAAAWIMTYmD/EbNzL5F4AQOIhxNhYIMTsIcQAABIPIcbGiguyJJ2c3Hu0vdPaYgAAiDJCjI3lpHs0ODNZxkhbGFICACQYQozNFTOkBABIUIQYm5swJEsSk3sBAImHEGNzpyf3NlpbCAAAUUaIsbnigpMhZtehNjW1nbC4GgAAoocQY3NZqW4NG5gqSdrEkBIAIIEQYuKAvzfmA4aUAAAJhBATB04/foCeGABA4iDExAH/CiWGkwAAiYQQEwcuGJwhh0Pa23hMDUfbrS4HAICoIMTEgfTkJI3IPk8SQ0oAgMRBiIkTE08NKTG5FwCQKAgxcaKYyb0AgARDiIkTZz5+wBhjbTEAAERBP6sLQHiMy8+Qy+nQwZZ2rdxUp/Tkfhqbn65B6clWlwYAQEQQYuJEitul0YPS9FFdi+b+fp0kaeB5br1331T1c9HhBgCIP3y7xZHvTR2t4oJMjc1LlyQdau1Q2wmvxVUBABAZ9MTEkenF+ZpenC+vz2jkfSslSV4v82MAAPGJnpg45HSc/tnLJF8AQJwixMQhh8MRCDI+HyEGABCfCDFxqp/z5L/aTkIMACBOEWLi1KkMIy8hBgAQpwgxccrlODmeRIgBAMQrQkyccp2aFMPEXgBAvCLExCl/iGFiLwAgXhFi4pSLib0AgDhHiIlTLib2AgDiHCEmTvkn9vqYEwMAiFOEmDjlcp0MMQwnAQDiFSEmTgV6YggxAIA4RYiJU4El1oQYAECcIsTEKUIMACDeEWLilNPBze4AAPGNEBOn+jGxFwAQ5wgxcYqJvQCAeNfP6gIQGf45Md/9zfuaOCQzLOec+qVcfW/q6LCcCwCAviLExKkh/VO1rrZRkvTBnqawnPODPU0am5euqy/IC8v5AADoC4cxsT/zs7m5WZmZmWpqalJGRobV5djCsQ6v1nx2WF6fLyzne3VrvZ5ds1vZaW799ftXaGCaJyznBQDEr0h/f9MTE6dS3C5deX5O2M536ahsrd11RB/XH9UDL2zW47deJMepeTcAAFiBib3oEU8/lxb+0yT1czr0l811eumDfVaXBABIcIQY9Nj4gszAxN4HX9isuqbjFlcEAEhkhBiEZM5VIzVhSKaaj3eq8g8buCMwAMAyhBiEJMnl1KIZk5TqdumdTw/pidXbrS4JAJCgCDEI2YicNP3khvGSpP/7v5/o758dtrgiAEAiIsSgV75ZMkQ3XVggr8/ormfXq7Gtw+qSAAAJhiXW6LWf3Dhe62uP6LNDbbrjt2t1+ejgJd3Ds8/T9OJ8i6oDAMQ7bnaHPtm0p0nfeOJvOuHt+jKq/uGVGpmTFuWqAACxgJvdIaYVD8nUE7eW6JWtdUGvv7xxv1o7vGpsO2FRZQCAeNerOTGLFy9WUVGRkpOTVVpaqjVr1pxz/8bGRs2dO1f5+fnyeDw6//zztXLlyl4VjNhTPi5XP/s/E4O27HT/YwlivqMPAGBTIffELF++XJWVlVqyZIlKS0u1aNEiTZs2Tdu2bdOgQYPO2r+jo0Nf+9rXNGjQID333HMqKCjQrl27lJWVFY76EaP8DySI/cFKAIBdhRxiFi5cqNmzZ6uiokKStGTJEr388staunSp7r333rP2X7p0qQ4fPqx33nlHSUlJkqSioqK+VY2Y5zz1XCXuhQcAiJSQhpM6Ojq0du1alZeXnz6B06ny8nLV1NR0ecxLL72ksrIyzZ07V7m5uRo/frweeeQReb3ebn9Pe3u7mpubgzbYzKmuGBvMGwcA2FRIIaahoUFer1e5ublBr+fm5qqurq7LY3bs2KHnnntOXq9XK1eu1IMPPqhf/OIX+o//+I9uf09VVZUyMzMDW2FhYShlIgYEhpMsrQIAEM8ifrM7n8+nQYMG6b//+79VUlKiGTNm6P7779eSJUu6PWbevHlqamoKbLt37450mQgzx6nhJDpiAACREtKcmOzsbLlcLtXX1we9Xl9fr7y8vC6Pyc/PV1JSklwuV+C1L33pS6qrq1NHR4fcbvdZx3g8Hnk8nrNeh304GU4CAERYSD0xbrdbJSUlqq6uDrzm8/lUXV2tsrKyLo+59NJLtX37dvl8vsBrH3/8sfLz87sMMIgPjlMDSkQYAECkhDycVFlZqV/+8pf6zW9+ow8//FBz5sxRa2trYLXSzJkzNW/evMD+c+bM0eHDh3XXXXfp448/1ssvv6xHHnlEc+fODd+nQMxxBHpirK0DABC/Ql5iPWPGDB08eFDz589XXV2dJk2apFWrVgUm+9bW1srpPJ2NCgsL9de//lU/+MEPNGHCBBUUFOiuu+7SPffcE75PgZhl6IsBAEQIz05CREx/9C1t3d+s//nOFF1xfs4XHwAAiDuR/v6O+OokJCb/cJIv9jMyAMCmCDGIiMCcGGvLAADEMUIMIsIhUgwAILIIMYiI0z0xpBgAQGQQYhAR/jv2nnF7IAAAwooQg4jg2UkAgEgjxCAiHDx2AAAQYYQYRAQ9MQCASCPEICKcPMUaABBhhBhEBMNJAIBII8QgIniKNQAg0ggxiAyeYg0AiDBCDCLCyc3uAAARRohBRPiHk3xkGABAhBBiEBFM7AUARFo/qwtAfPKHmLuWbdCv3topSUpyOfT98vN1xfk5FlYGAIgXhBhEREFWSuDnTXubAj//8q0dhBgAQFgQYhARD98wXl+fWKATp54AueNgq37y563a2dBqcWUAgHhBiEFEJCe5dNno7MA/jx/crp/8eav2NR5Te6dXnn4uC6sDAMQDJvYiKrLT3Erz9JPPSLsPt1ldDgAgDhBiEBUOh0NF2amSpJ0NhBgAQN8RYhA1RQPPkyTtbDhqcSUAgHhAiEHUDM/2hxh6YgAAfUeIQdT4Q8xnrFACAIQBIQZRU+QPMYcIMQCAviPEIGqGn5oTs7/puI51eC2uBgBgd4QYRE3/89zKTEmSJO06TG8MAKBvCDGIqiLmxQAAwoQQg6gaPpB7xQAAwoMQg6gqyuZeMQCA8CDEIKpOL7OmJwYA0DeEGERV4K69LLMGAPQRIQZR5R9OOtjSrqPtnRZXAwCwM0IMoiozJUkDznNLYoUSAKBvCDGIuuHcuRcAEAaEGESdf14MPTEAgL4gxCDqhmdzrxgAQN8RYhB1PAgSABAOhBhEXWCZNcNJAIA+IMQg6vw9MYdbO9R07ITF1QAA7IoQg6hL8/RTTrpHEpN7AQC9R4iBJYYPZF4MAKBvCDGwRFFghRIhBgDQO4QYWCKwQokQAwDoJUIMLDE88CBI7hUDAOgdQgwsQU8MAKCvCDGwhP9eMU3HTuhIa4fF1QAA7IgQA0ukuF3Kz0yWJO2gNwYA0AuEGFiGB0ECAPqCEAPL8AwlAEBfEGJgmeHcKwYA0AeEGFimiLv2AgD6gBADywwPLLNukzHG4moAAHbTz+oCkLgKB6TK4ZCOtnfqwRc3K8lFpgYAq3zn0uEqHJBqdRkhIcTAMslJLg3PPk87Drbqt+/WWl0OACS06ycOJsQAoXh0xoX665Y6GTGcBABWys1ItrqEkBFiYKniIZkqHpJpdRkAABtiEgIAALAlQgwAALAlQgwAALAlQgwAALAlQgwAALClXoWYxYsXq6ioSMnJySotLdWaNWu63ffpp5+Ww+EI2pKT7beMCwAAxJaQQ8zy5ctVWVmpBQsWaN26dZo4caKmTZumAwcOdHtMRkaG9u/fH9h27drVp6IBAABCDjELFy7U7NmzVVFRoXHjxmnJkiVKTU3V0qVLuz3G4XAoLy8vsOXm5vapaAAAgJBCTEdHh9auXavy8vLTJ3A6VV5erpqamm6PO3r0qIYNG6bCwkLdcMMN2rJlS+8rBgAAUIghpqGhQV6v96yelNzcXNXV1XV5zJgxY7R06VK9+OKL+u1vfyufz6dLLrlEe/bs6fb3tLe3q7m5OWgDAAA4U8RXJ5WVlWnmzJmaNGmSrrzySq1YsUI5OTl68sknuz2mqqpKmZmZga2wsDDSZQIAAJsJKcRkZ2fL5XKpvr4+6PX6+nrl5eX16BxJSUm68MILtX379m73mTdvnpqamgLb7t27QykTAAAkgJBCjNvtVklJiaqrqwOv+Xw+VVdXq6ysrEfn8Hq92rRpk/Lz87vdx+PxKCMjI2gDAAA4U8hPsa6srNSsWbM0efJkTZkyRYsWLVJra6sqKiokSTNnzlRBQYGqqqokSQ8//LAuvvhijRo1So2Njfr5z3+uXbt26bbbbuvx7zTGSBJzYwAAsBH/97b/ezzcQg4xM2bM0MGDBzV//nzV1dVp0qRJWrVqVWCyb21trZzO0x08R44c0ezZs1VXV6f+/furpKRE77zzjsaNG9fj39nS0iJJzI0BAMCGWlpalJmZGfbzOkyk4lEY+Xw+7du3T+np6XI4HL0+T3NzswoLC7V7926GqER7fB7tcRptEYz2OI22CEZ7BPt8exhj1NLSosGDBwd1cIRLyD0xVnA6nRoyZEjYzsc8m2C0RzDa4zTaIhjtcRptEYz2CHZme0SiB8aPB0ACAABbIsQAAABbSqgQ4/F4tGDBAnk8HqtLiQm0RzDa4zTaIhjtcRptEYz2CBbt9rDFxF4AAIDPS6ieGAAAED8IMQAAwJYIMQAAwJYIMQAAwJYSKsQsXrxYRUVFSk5OVmlpqdasWWN1SWH30EMPyeFwBG1jx44NvH/8+HHNnTtXAwcOVFpamr75zW+e9VTy2tpaXXfddUpNTdWgQYN09913q7OzM9ofpVfefPNNXX/99Ro8eLAcDodeeOGFoPeNMZo/f77y8/OVkpKi8vJyffLJJ0H7HD58WLfeeqsyMjKUlZWl7373uzp69GjQPhs3btTll1+u5ORkFRYW6mc/+1mkP1rIvqgt/uVf/uWsa+Waa64J2ide2qKqqkpf/vKXlZ6erkGDBunGG2/Utm3bgvYJ19/G6tWrddFFF8nj8WjUqFF6+umnI/3xQtaT9rjqqqvOuj7uuOOOoH3ipT2eeOIJTZgwIXCDtrKyMv3lL38JvJ9I18YXtUXMXRcmQSxbtsy43W6zdOlSs2XLFjN79myTlZVl6uvrrS4trBYsWGAuuOACs3///sB28ODBwPt33HGHKSwsNNXV1eb99983F198sbnkkksC73d2dprx48eb8vJys379erNy5UqTnZ1t5s2bZ8XHCdnKlSvN/fffb1asWGEkmeeffz7o/Z/+9KcmMzPTvPDCC+aDDz4wX//6183w4cPNsWPHAvtcc801ZuLEiebdd981b731lhk1apS5+eabA+83NTWZ3Nxcc+utt5rNmzebZ5991qSkpJgnn3wyWh+zR76oLWbNmmWuueaaoGvl8OHDQfvES1tMmzbN/PrXvzabN282GzZsMNOnTzdDhw41R48eDewTjr+NHTt2mNTUVFNZWWm2bt1qHnvsMeNyucyqVaui+nm/SE/a48orrzSzZ88Ouj6ampoC78dTe7z00kvm5ZdfNh9//LHZtm2bue+++0xSUpLZvHmzMSaxro0vaotYuy4SJsRMmTLFzJ07N/DPXq/XDB482FRVVVlYVfgtWLDATJw4scv3GhsbTVJSkvnjH/8YeO3DDz80kkxNTY0x5uQXn9PpNHV1dYF9nnjiCZORkWHa29sjWnu4ff6L2+fzmby8PPPzn/888FpjY6PxeDzm2WefNcYYs3XrViPJ/P3vfw/s85e//MU4HA6zd+9eY4wxjz/+uOnfv39Qe9xzzz1mzJgxEf5EvdddiLnhhhu6PSZe28IYYw4cOGAkmTfeeMMYE76/jR/96EfmggsuCPpdM2bMMNOmTYv0R+qTz7eHMSe/rO66665uj4nn9jDGmP79+5tf/epXCX9tGHO6LYyJvesiIYaTOjo6tHbtWpWXlwdeczqdKi8vV01NjYWVRcYnn3yiwYMHa8SIEbr11ltVW1srSVq7dq1OnDgR1A5jx47V0KFDA+1QU1Oj4uLiwFPJJWnatGlqbm7Wli1bovtBwmznzp2qq6sL+vyZmZkqLS0N+vxZWVmaPHlyYJ/y8nI5nU699957gX2uuOIKud3uwD7Tpk3Ttm3bdOTIkSh9mvBYvXq1Bg0apDFjxmjOnDk6dOhQ4L14boumpiZJ0oABAySF72+jpqYm6Bz+fWL9vzOfbw+/3/3ud8rOztb48eM1b948tbW1Bd6L1/bwer1atmyZWltbVVZWltDXxufbwi+WrgtbPACyrxoaGuT1eoMaVZJyc3P10UcfWVRVZJSWlurpp5/WmDFjtH//fv34xz/W5Zdfrs2bN6uurk5ut1tZWVlBx+Tm5qqurk6SVFdX12U7+d+zM3/9XX2+Mz//oEGDgt7v16+fBgwYELTP8OHDzzqH/73+/ftHpP5wu+aaa/SNb3xDw4cP16effqr77rtP1157rWpqauRyueK2LXw+n77//e/r0ksv1fjx4yUpbH8b3e3T3NysY8eOKSUlJRIfqU+6ag9JuuWWWzRs2DANHjxYGzdu1D333KNt27ZpxYoVkuKvPTZt2qSysjIdP35caWlpev755zVu3Dht2LAh4a6N7tpCir3rIiFCTCK59tprAz9PmDBBpaWlGjZsmP7whz/E1B8JrPetb30r8HNxcbEmTJigkSNHavXq1Zo6daqFlUXW3LlztXnzZr399ttWlxITumuP22+/PfBzcXGx8vPzNXXqVH366acaOXJktMuMuDFjxmjDhg1qamrSc889p1mzZumNN96wuixLdNcW48aNi7nrIiGGk7Kzs+Vyuc6aTV5fX6+8vDyLqoqOrKwsnX/++dq+fbvy8vLU0dGhxsbGoH3ObIe8vLwu28n/np356z/XdZCXl6cDBw4Evd/Z2anDhw/HfRuNGDFC2dnZ2r59u6T4bIs777xTf/7zn/X6669ryJAhgdfD9bfR3T4ZGRkx+T8R3bVHV0pLSyUp6PqIp/Zwu90aNWqUSkpKVFVVpYkTJ+rRRx9NyGuju7boitXXRUKEGLfbrZKSElVXVwde8/l8qq6uDhrni0dHjx7Vp59+qvz8fJWUlCgpKSmoHbZt26ba2tpAO5SVlWnTpk1BX16vvvqqMjIyAt2JdjV8+HDl5eUFff7m5ma99957QZ+/sbFRa9euDezz2muvyefzBf5Yy8rK9Oabb+rEiROBfV599VWNGTMmJodPemrPnj06dOiQ8vPzJcVXWxhjdOedd+r555/Xa6+9dtYQWLj+NsrKyoLO4d8n1v4780Xt0ZUNGzZIUtD1ES/t0RWfz6f29vaEuza64m+Lrlh+XYQ8Fdimli1bZjwej3n66afN1q1bze23326ysrKCZlDHgx/+8Idm9erVZufOneZvf/ubKS8vN9nZ2ebAgQPGmJNLBYcOHWpee+018/7775uysjJTVlYWON6/PO7qq682GzZsMKtWrTI5OTm2WWLd0tJi1q9fb9avX28kmYULF5r169ebXbt2GWNOLrHOysoyL774otm4caO54YYbulxifeGFF5r33nvPvP3222b06NFBy4obGxtNbm6u+fa3v202b95sli1bZlJTU2NuWfG52qKlpcX8+7//u6mpqTE7d+40//u//2suuugiM3r0aHP8+PHAOeKlLebMmWMyMzPN6tWrg5aGtrW1BfYJx9+Gf+no3XffbT788EOzePHimFxG+0XtsX37dvPwww+b999/3+zcudO8+OKLZsSIEeaKK64InCOe2uPee+81b7zxhtm5c6fZuHGjuffee43D4TCvvPKKMSaxro1ztUUsXhcJE2KMMeaxxx4zQ4cONW6320yZMsW8++67VpcUdjNmzDD5+fnG7XabgoICM2PGDLN9+/bA+8eOHTP/+q//avr3729SU1PNTTfdZPbv3x90js8++8xce+21JiUlxWRnZ5sf/vCH5sSJE9H+KL3y+uuvG0lnbbNmzTLGnFxm/eCDD5rc3Fzj8XjM1KlTzbZt24LOcejQIXPzzTebtLQ0k5GRYSoqKkxLS0vQPh988IG57LLLjMfjMQUFBeanP/1ptD5ij52rLdra2szVV19tcnJyTFJSkhk2bJiZPXv2WaE+Xtqiq3aQZH79618H9gnX38brr79uJk2aZNxutxkxYkTQ74gVX9QetbW15oorrjADBgwwHo/HjBo1ytx9991B9wMxJn7a4zvf+Y4ZNmyYcbvdJicnx0ydOjUQYIxJrGvjXG0Ri9eFwxhjQu+/AQAAsFZCzIkBAADxhxADAABsiRADAABsiRADAABsiRADAABsiRADAABsiRADAABsiRADAABsiRADAABsiRADAABsiRADAABsiRADAABs6f8DraTZTCpwqy0AAAAASUVORK5CYII=",
"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
}