{
"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 access 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 "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Install dependencies"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%pip install matplotlib "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "KjtU7PA8eOTr"
},
"source": [
"## Summary of the dataset"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Tp1TpfCkd58n"
},
"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 | \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 | \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 | \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 | \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 | \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 | \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 | \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 | \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 | \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 | \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 \n",
"1 1000000.0 163.0 1 \n",
"2 1000000.0 435.0 1 \n",
"3 19.0 53.0 1 \n",
"4 1000000.0 2043.0 0 \n",
".. ... ... ... \n",
"182 16.0 385.0 1 \n",
"183 1000000.0 634.0 1 \n",
"184 1000000.0 1895.0 0 \n",
"185 54.0 382.0 1 \n",
"186 1000000.0 1109.0 0 \n",
"\n",
"[187 rows x 37 columns]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"from rulekit.arff import read_arff\n",
"\n",
"DATASET_URL: str = (\n",
" 'https://raw.githubusercontent.com/'\n",
" 'adaa-polsl/RuleKit/master/data/bmt/'\n",
" 'bmt.arff'\n",
")\n",
"data_df: pd.DataFrame = read_arff(DATASET_URL)\n",
"data_df['survival_status'] = data_df['survival_status'].astype(int).astype(str)\n",
"data_df\n"
]
},
{
"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\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",
"
\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",
"
\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",
"
\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",
"
\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",
"
\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",
"
\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",
"
\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",
"
\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",
"
\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 \n",
"count 187.000000 \n",
"mean 938.743316 \n",
"std 849.589495 \n",
"min 6.000000 \n",
"25% 168.500000 \n",
"50% 676.000000 \n",
"75% 1604.000000 \n",
"max 3364.000000 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(\"Dataset overview:\")\n",
"print(f\"Name: bmt\")\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": "dattexxGmaqJ"
},
"source": [
"## Helper function for creating ruleset characteristics dataframe"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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": 5,
"metadata": {
"id": "TrO-LyN2mpiP"
},
"outputs": [],
"source": [
"X: pd.DataFrame = data_df.drop(['survival_status'], axis=1)\n",
"y: pd.Series = data_df['survival_status']"
]
},
{
"cell_type": "code",
"execution_count": 6,
"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",
" 0.05 | \n",
" 0.0 | \n",
" False | \n",
" True | \n",
" 0.0 | \n",
" 1.771417 | \n",
" 0.797513 | \n",
" 0.902853 | \n",
" 5 | \n",
" 3.6 | \n",
" 65.2 | \n",
" 0.308021 | \n",
" 1.0 | \n",
" 0.999865 | \n",
" 0.000135 | \n",
" 0.000147 | \n",
" 0.000184 | \n",
" 1.0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" minimum_covered maximum_uncovered_fraction ignore_missing \\\n",
"0 0.05 0.0 False \n",
"\n",
" pruning_enabled max_growing_condition time_total_s time_growing_s \\\n",
"0 True 0.0 1.771417 0.797513 \n",
"\n",
" time_pruning_s rules_count conditions_per_rule \\\n",
"0 0.902853 5 3.6 \n",
"\n",
" induced_conditions_per_rule avg_rule_coverage avg_rule_precision \\\n",
"0 65.2 0.308021 1.0 \n",
"\n",
" avg_rule_quality pvalue FDR_pvalue FWER_pvalue fraction_significant \\\n",
"0 0.999865 0.000135 0.000147 0.000184 1.0 \n",
"\n",
" fraction_FDR_significant fraction_FWER_significant \n",
"0 1.0 1.0 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from rulekit.survival import SurvivalRules\n",
"from rulekit.rules import RuleSet, SurvivalRule\n",
"\n",
"srv = SurvivalRules(survival_time_attr='survival_time')\n",
"\n",
"srv.fit(X, y)\n",
"\n",
"ruleset: RuleSet[SurvivalRule] = srv.model\n",
"\n",
"predictions: np.ndarray = srv.predict(X)\n",
"\n",
"\n",
"ruleset_stats = get_ruleset_stats(ruleset)\n",
"\n",
"\n",
"display(ruleset_stats)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot predicted estimators for the first five examples"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"for i in range(5):\n",
" plt.step(\n",
" predictions[i][\"times\"],\n",
" predictions[i][\"probabilities\"],\n",
" label=f'Example {i}'\n",
" )\n",
"plt.legend(title='Example index:')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot rules Kaplan-Meier's estimators on top of the training dataset estimator"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"r1: IF Donorage = (-inf, 45.16) AND Relapse = {0} AND Recipientage = (-inf, 17.45) THEN \n",
"r2: IF Donorage = (-inf, 43.63) AND HLAmismatch = {0} AND Relapse = {1} THEN \n",
"r3: IF PLTrecovery = (-inf, 266) AND time_to_aGvHD_III_IV = <12.50, inf) AND ANCrecovery = <10.50, 19.50) AND Rbodymass = (-inf, 69) AND Donorage = (-inf, 44.06) AND Recipientage = <4.60, inf) AND CD34kgx10d6 = (-inf, 16.98) THEN \n",
"r4: IF Donorage = <37.16, inf) AND Recipientage = <5.15, inf) AND time_to_aGvHD_III_IV = <23.50, inf) AND CD3dCD34 = <0.90, 73.72) THEN \n",
"r5: IF Recipientage = <17.85, 18.85) THEN \n"
]
},
{
"data": {
"image/png": "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Fi1sjomKikJRUREAoKioyO59srwmV5bY7b236u+9TZs2Nq+HhISgVatWNvt06NCh1jksr7Vs2dIt8btaeno6/vd//xcdOnTA2bNn8eqrr2Lw4MHIzs5GcHCw394Lk8mEadOmYdCgQejVqxcAuOz3oq59SktLodPpoFar3fGWGs3evQCAESNGoH379oiNjcXx48cxc+ZM5OTkYNOmTQD8616cOHECycnJKC8vR1hYGL788kv07NkTx44dC7jPRF33AvCtz0TAJTCBZPDgwdafe/fujaSkJLRv3x6fffaZT/2ykHc98cQT1p/j4+PRu3dvdOrUCVlZWbjvvvu8GJl7TZ48GSdPnsR3333n7VC8rq57MWHCBOvP8fHxiImJwX333YezZ8+iU6dOng7Trbp164Zjx46hpKQEn3/+OcaOHYu9e/d6OyyvqOte9OzZ06c+EwHXhBQZGYng4OBaPciLi4sRHR3tpag8o0WLFujatSvOnDmD6OhoGAwGXL161Waf6vchOjra7n2yvCZXltjr+wxER0fj4sWLNq9XVlbiypUrfn9/OnbsiMjISJw5cwaAf96LKVOm4F//+hf27NmDW2+91brdVb8Xde0THh7uc3881HUv7ElKSgIAm8+Gv9wLpVKJzp07IzExEZmZmejTpw+WLl0akJ+Juu6FPd78TARcAqNUKpGYmIhdu3ZZt5lMJuzatcumjc8fXb9+HWfPnkVMTAwSExOhUChs7kNOTg7y8/Ot9yE5ORknTpyw+fLasWMHwsPDreVEOerQoQOio6Nt3ntpaSkOHDhg896vXr2Kw4cPW/fZvXs3TCaT9Rc2OTkZ3377LSoqKqz77NixA926dfPJJhNH/frrr/j9998RExMDwL/uhRACU6ZMwZdffondu3fXavZy1e9FcnKyzTks+/jSvzEN3Qt7jh07BgA2nw1/uBf2mEwm6PX6gPpM1MVyL+zx6mfCqS6/fmLDhg1CpVKJNWvWiJ9++klMmDBBtGjRwqbXtD946aWXRFZWlsjNzRX79u0TqampIjIyUly8eFEIYR4a2K5dO7F7925x6NAhkZycLJKTk63HW4bD3X///eLYsWNi27ZtonXr1rIYRn3t2jVx9OhRcfToUQFAvPPOO+Lo0aPi/PnzQgjzMOoWLVqIf/7zn+L48ePiwQcftDuMul+/fuLAgQPiu+++E126dLEZOnz16lURFRUlRo8eLU6ePCk2bNggNBqNzw0dru9eXLt2TcyYMUNkZ2eL3NxcsXPnTpGQkCC6dOkiysvLrefwl3sxadIkERERIbKysmyGgZaVlVn3ccXvhWWY6MsvvyxOnTolli1b5nNDZhu6F2fOnBELFiwQhw4dErm5ueKf//yn6Nixo7j77rut5/CXezFr1iyxd+9ekZubK44fPy5mzZolJEkS33zzjRAicD4TQtR/L3ztMxGQCYwQQrz33nuiXbt2QqlUigEDBoj9+/d7OySXGzZsmIiJiRFKpVK0bdtWDBs2TJw5c8b6uk6nE88995xo2bKl0Gg04uGHHxaFhYU258jLyxODBw8WarVaREZGipdeeklUVFR4+q04bc+ePQJArcfYsWOFEOah1K+99pqIiooSKpVK3HfffSInJ8fmHL///rsYPny4CAsLE+Hh4WLcuHHi2rVrNvv88MMP4s477xQqlUq0bdtWLFq0yFNv0WH13YuysjJx//33i9atWwuFQiHat28vxo8fXyuZ95d7Ye8+ABCrV6+27uOq34s9e/aIvn37CqVSKTp27GhzDV/Q0L3Iz88Xd999t2jVqpVQqVSic+fO4uWXX7aZ80MI/7gXTz31lGjfvr1QKpWidevW4r777rMmL0IEzmdCiPrvha99JiQhhHCuZkNERETkXQHXB4aIiIjkjwkMERERyQ4TGCIiIpIdJjBEREQkO0xgiIiISHaYwBAREZHsMIEhIiIi2WECQ0RERLLDBIaIiIhkhwkMERERyQ4TGCIiIpIdJjBEREQkO/8fqX4vTbPH7I4AAAAASUVORK5CYII=",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from rulekit.kaplan_meier import KaplanMeierEstimator\n",
"\n",
"# plot rules kaplan-meier curves\n",
"for i, rule in enumerate(ruleset.rules):\n",
" rule_label: str = f'r{i + 1}'\n",
" rule_km: KaplanMeierEstimator = rule.kaplan_meier_estimator\n",
" plt.step(\n",
" rule_km.times,\n",
" rule_km.probabilities,\n",
" label=rule_label\n",
" )\n",
" print(f'{rule_label}: {rule}')\n",
"\n",
"# plot whole dataset kaplan-meier curve\n",
"train_km: KaplanMeierEstimator = srv.get_train_set_kaplan_meier()\n",
"plt.step(\n",
" train_km.times,\n",
" train_km.probabilities,\n",
" label='Training set estimator'\n",
")\n",
"\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GkNBc5iBpwmj"
},
"source": [
"### Rules evaluation on full set"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"id": "9UjrC8r-p59d"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Integrated Brier Score: 0.19651358709002972\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": 10,
"metadata": {
"id": "0nNv6a84qTsq"
},
"outputs": [],
"source": [
"from sklearn.model_selection import StratifiedKFold\n",
"from rulekit.exceptions import RuleKitJavaException\n",
"\n",
"skf = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)\n",
"\n",
"ruleset_stats = pd.DataFrame()\n",
"survival_metrics = []\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",
"\n",
" ruleset = srv.model\n",
"\n",
" ibs: float = srv.score(X_test, y_test)\n",
"\n",
" survival_metrics.append(ibs)\n",
" ruleset_stats = pd.concat([ruleset_stats, get_ruleset_stats(ruleset)])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MfCOH_f3sICm"
},
"source": [
"Ruleset characteristics (average)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"id": "xzbazr51sRd3"
},
"outputs": [
{
"data": {
"text/plain": [
"minimum_covered 0.050000\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 0.799019\n",
"time_growing_s 0.296248\n",
"time_pruning_s 0.477474\n",
"rules_count 4.000000\n",
"conditions_per_rule 2.581667\n",
"induced_conditions_per_rule 59.825000\n",
"avg_rule_coverage 0.486613\n",
"avg_rule_precision 1.000000\n",
"avg_rule_quality 0.995955\n",
"pvalue 0.004045\n",
"FDR_pvalue 0.004061\n",
"FWER_pvalue 0.004104\n",
"fraction_significant 0.980000\n",
"fraction_FDR_significant 0.980000\n",
"fraction_FWER_significant 0.980000\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": 12,
"metadata": {
"id": "Co-fNd9nshWB"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Integrated Brier Score: 0.20178456199764142\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": 13,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import StratifiedKFold\n",
"from sklearn.model_selection import GridSearchCV"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"def scorer(estimator: SurvivalRules, X: pd.DataFrame, y: pd.Series) -> float:\n",
" return -1 * estimator.score(X, y)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Best Integrated Brier Score: -0.21437408819868886 using {'minsupp_new': 3, 'survival_time_attr': 'survival_time'}\n"
]
}
],
"source": [
"# define models and parameters\n",
"model = SurvivalRules(survival_time_attr='survival_time')\n",
"\n",
"# define grid search\n",
"grid = {\n",
" 'survival_time_attr': ['survival_time'],\n",
" 'minsupp_new': range(1, 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(\n",
" 'Best Integrated Brier Score: '\n",
" f'{grid_result.best_score_} using {grid_result.best_params_}'\n",
")"
]
},
{
"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": 19,
"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: RuleSet[SurvivalRule] = srv.model\n",
"ruleset_stats: pd.DataFrame = get_ruleset_stats(ruleset)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Rules evaluation"
]
},
{
"cell_type": "code",
"execution_count": 20,
"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.594173\n",
"time_growing_s 0.244234\n",
"time_pruning_s 0.312523\n",
"rules_count 4\n",
"conditions_per_rule 2.25\n",
"induced_conditions_per_rule 55.25\n",
"avg_rule_coverage 0.389262\n",
"avg_rule_precision 1.0\n",
"avg_rule_quality 1.0\n",
"pvalue 0.0\n",
"FDR_pvalue 0.0\n",
"FWER_pvalue 0.0\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": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Integrated Brier Score: 0.14054870564224475\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": 22,
"metadata": {},
"outputs": [],
"source": [
"predictions = srv.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Predicted Kaplan-Meier curves for 5 examples from test set')"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for i in range(5):\n",
" plt.step(\n",
" predictions[i][\"times\"], \n",
" predictions[i][\"probabilities\"],\n",
" label=f'Example {i}'\n",
" )\n",
"plt.legend(title='Examples indices:')\n",
"plt.title('Predicted Kaplan-Meier curves for 5 examples from test set')"
]
}
],
"metadata": {
"colab": {
"collapsed_sections": [],
"name": "Raport_przezyciowy.ipynb",
"provenance": [],
"toc_visible": true
},
"kernelspec": {
"display_name": "tutorials_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.12.0"
},
"metadata": {
"interpreter": {
"hash": "62266c16fff41e971c13e9cb2ad3d47e4ef45d0678714c255381eb9fdcbd7032"
}
}
},
"nbformat": 4,
"nbformat_minor": 0
}