Path Signatures for Early Sepsis Detection ========================================== This notebook is based on the work of Ni et al. (2021). This work builds on the winning approach by Morrill et al. of the `PhysioNet Computing in Cardiology Challenge 2019 `__, by building a `sepsis analysis pipeline `__ to train and evaluate a suite of representative models against the MIMIC III dataset. Whereas the analysis pipeline incorporates light gradient boosting machine (LGBM), long short term memory (LSTM) and Cox proportional hazards (CoxPHM) models, this notebook showcases the application of LGBMs as one example, in a simplified setting. For more information on the aforementioned research, please see the following references: Ni, H., Cohen, S., Lou, H., Morrill, J. , Wu, Y., Yang, L., Lyons, T.: Variation of sepsis-III definitions influences predictive performance of machine learning. Manuscript submitted for publication (2021). .. Morrill, J., Kormilitzin, A., Nevado-Holgado, A., Swaminathan, S., Howison, S., Lyons, T.: The signature-based model for early detection of sepsis from electronic health records in the intensive care unit. In: 2019 Computing in Cardiology (CinC) (2019). Morrill, J., Kormilitzin, A., Nevado-Holgado, A., Swaminathan, S., Howison, S., Lyons, T.: Utilization of the signature method to identify the early onset of sepsis from multivariate physiological time series in critical care monitoring. Critical Care Medicine 48(10), 976–981 (2020). Introduction ------------ Sepsis is a life-threatening condition in which the body’s response to an infection causes injury to the body’s organs. In 2017, sepsis was estimated to affect 50 million people worldwide, the cause of 11 million deaths (Morrill et al, 2020). Being able to predict accurately whether sepsis will occur in a patient would dramatically improve patient outcomes. With the aim of predicting sepsis, this notebook demonstrates the method of training a classifier on electronic health records. These data comprise both physiological and laboratory-observed measurements, such as the patient’s heart rate, temperature, arterial pH, oxygen saturation etc. Among features used to train the classifier, the method uses path signatures to represent time series data. We will begin by setting up the environment for running the analysis code. Set up the Notebook ------------------- Obtain and Extract the Data ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Running this notebook requires that you complete the following steps: \* Become a credentialed user on PhysioNet. This involves completing a half-day online training course in human subjects research. \* Download the `MIMIC-III dataset `__ \* Populate a PostgreSQL database with the MIMIC-III dataset \* Generate CSV files for model training We provide full instructions and scripts for accomplishing the above pre-requisite steps inside the subdirectory `src/database `__ located inside our `sepsis analysis pipeline codebase `__, the latter which forms the basis of this notebook. Thus, is is necessary that you clone the following repository: git clone ‘https://github.com/HangL-39/Mimiciii_Sepsis_Label_Extraction.git’ Once you have cloned the repository, please follow the instructions in the `data extraction README `__. Configure Path to Analysis Code ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Assuming that you have completed the data extraction successfully, set up the path to sepsis analysis code: .. code:: ipython3 from pathlib import Path import sys MIMIC_ANALYSIS_PATH = Path('Mimiciii_Sepsis_Label_Extraction/') sys.path.insert(0, str(Path(MIMIC_ANALYSIS_PATH, 'src').resolve())) Install Dependencies ~~~~~~~~~~~~~~~~~~~~ Install the dependencies listed inside `requirements.txt `__: .. code:: ipython3 !{sys.executable} -m pip install -r {str(Path(MIMIC_ANALYSIS_PATH, 'requirements.txt').resolve())} .. parsed-literal:: Requirement already satisfied: ray[tune]==0.8.6 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (0.8.6) Requirement already satisfied: requests==2.26.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 2)) (2.26.0) Requirement already satisfied: scikit_learn==0.23.2 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 3)) (0.23.2) Requirement already satisfied: scipy==1.3.3 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 4)) (1.3.3) Requirement already satisfied: seaborn==0.11.1 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 5)) (0.11.1) Requirement already satisfied: torch==1.6.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 6)) (1.6.0) Requirement already satisfied: dill==0.3.1.1 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 7)) (0.3.1.1) Requirement already satisfied: joblib==0.14.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 8)) (0.14.0) Requirement already satisfied: lifelines==0.26.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 9)) (0.26.0) Requirement already satisfied: lightgbm==2.3.1 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 10)) (2.3.1) Requirement already satisfied: matplotlib==3.1.3 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 11)) (3.1.3) Requirement already satisfied: matplotlib_venn==0.11.6 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 12)) (0.11.6) Requirement already satisfied: numpy in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 13)) (1.21.2) Requirement already satisfied: pandas==1.2.4 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 14)) (1.2.4) Requirement already satisfied: iisignature==0.24 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 15)) (0.24) Requirement already satisfied: gdown==3.13.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 16)) (3.13.0) Requirement already satisfied: pillow==8.3.1 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from -r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 17)) (8.3.1) Requirement already satisfied: filelock in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from gdown==3.13.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 16)) (3.0.12) Requirement already satisfied: six in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from gdown==3.13.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 16)) (1.16.0) Requirement already satisfied: tqdm in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from gdown==3.13.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 16)) (4.62.2) Requirement already satisfied: formulaic<0.3,>=0.2.2 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from lifelines==0.26.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 9)) (0.2.4) Requirement already satisfied: autograd>=1.3 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from lifelines==0.26.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 9)) (1.3) Requirement already satisfied: autograd-gamma>=0.3 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from lifelines==0.26.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 9)) (0.5.0) Requirement already satisfied: kiwisolver>=1.0.1 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from matplotlib==3.1.3->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 11)) (1.3.2) Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from matplotlib==3.1.3->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 11)) (2.4.7) Requirement already satisfied: cycler>=0.10 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from matplotlib==3.1.3->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 11)) (0.10.0) Requirement already satisfied: python-dateutil>=2.1 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from matplotlib==3.1.3->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 11)) (2.8.2) Requirement already satisfied: pytz>=2017.3 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from pandas==1.2.4->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 14)) (2021.1) Requirement already satisfied: grpcio in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (1.39.0) Requirement already satisfied: aiohttp in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (3.7.4.post0) Requirement already satisfied: msgpack<2.0.0,>=0.6.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (1.0.2) Requirement already satisfied: py-spy>=0.2.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (0.3.8) Requirement already satisfied: click>=7.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (8.0.1) Requirement already satisfied: protobuf>=3.8.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (3.17.3) Requirement already satisfied: pyyaml in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (5.4.1) Requirement already satisfied: redis<3.5.0,>=3.3.2 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (3.4.1) Requirement already satisfied: colorama in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (0.4.4) Requirement already satisfied: jsonschema in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (3.2.0) Requirement already satisfied: google in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (3.0.0) Requirement already satisfied: tabulate in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (0.8.9) Requirement already satisfied: tensorboardX in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (2.4) Requirement already satisfied: certifi>=2017.4.17 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from requests==2.26.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 2)) (2021.5.30) Requirement already satisfied: urllib3<1.27,>=1.21.1 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from requests==2.26.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 2)) (1.26.6) Requirement already satisfied: charset-normalizer~=2.0.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from requests==2.26.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 2)) (2.0.4) Requirement already satisfied: idna<4,>=2.5 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from requests==2.26.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 2)) (3.2) Requirement already satisfied: threadpoolctl>=2.0.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from scikit_learn==0.23.2->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 3)) (2.2.0) Requirement already satisfied: future in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from torch==1.6.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 6)) (0.18.2) Requirement already satisfied: importlib-metadata in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from click>=7.0->ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (4.7.1) Requirement already satisfied: wrapt in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from formulaic<0.3,>=0.2.2->lifelines==0.26.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 9)) (1.12.1) Requirement already satisfied: interface-meta>=1.2 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from formulaic<0.3,>=0.2.2->lifelines==0.26.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 9)) (1.2.3) Requirement already satisfied: astor in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from formulaic<0.3,>=0.2.2->lifelines==0.26.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 9)) (0.8.1) Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from requests==2.26.0->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 2)) (1.7.1) Requirement already satisfied: chardet<5.0,>=2.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from aiohttp->ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (4.0.0) Requirement already satisfied: attrs>=17.3.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from aiohttp->ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (21.2.0) Requirement already satisfied: typing-extensions>=3.6.5 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from aiohttp->ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (3.10.0.0) Requirement already satisfied: async-timeout<4.0,>=3.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from aiohttp->ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (3.0.1) Requirement already satisfied: yarl<2.0,>=1.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from aiohttp->ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (1.6.3) Requirement already satisfied: multidict<7.0,>=4.5 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from aiohttp->ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (5.1.0) Requirement already satisfied: beautifulsoup4 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from google->ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (4.9.3) Requirement already satisfied: soupsieve>1.2 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from beautifulsoup4->google->ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (2.2.1) Requirement already satisfied: zipp>=0.5 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from importlib-metadata->click>=7.0->ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (3.5.0) Requirement already satisfied: pyrsistent>=0.14.0 in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from jsonschema->ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (0.18.0) Requirement already satisfied: setuptools in /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages (from jsonschema->ray[tune]==0.8.6->-r /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/requirements.txt (line 1)) (52.0.0.post20210125) Import Packages ~~~~~~~~~~~~~~~ .. code:: ipython3 import os import pickle import random import matplotlib.pyplot as plt import numpy as np import pandas as pd from sklearn import metrics import constants from features.generate_features import features_wrapper import models.LGBM.eval_LGBM as eval_lgbm from models.LGBM import train_LGBM Task Definition: ---------------- Given a patient’s measurement variables obtained up to time :math:`t`, we seek to predict whether the patient will develop sepsis within the next :math:`T` hours. In other words, using data observed at or before time :math:`t`, we consider a binary prediction task where the target variable relates to the window :math:`[t, t+T]`:, |Prediction schematic| More formally, our task is to predict the label :math:`y_t^i \in \{0, 1\}` for the :math:`i`\ th patient at time :math:`t`, using the *stream* of data :math:`(x_1^i, x_2^i, \ldots, x_t^i)` available up to time :math:`t`, where :math:`x_t^i \in \mathbb{R}^d` denotes the measurements taken for the :math:`i`\ th patient at time :math:`t`. In our training data, we assign :math:`y_t^i:=1` if the patient develops sepsis within the window :math:`[t, t+T]`, otherwise we assign :math:`y_t^i:=0`. For each patient, we perform one prediction at each hour. In addition to this *real-time prediction* task, we consider a *patient-level prediction* task, where we seek to predict whether the patient will subsequently develop sepsis, based on data available up to time :math:`t`. To obtain labels :math:`y_t`, it is necessary that we have information about the sepsis onset time :math:`t_{\text{sepsis}}`. In the literature, there are multiple possible ways to define :math:`t_{\text{sepsis}}`. This notebook evaluates 3 variants of sepsis onset definition, each which in turn relies on determining the time of suspected infection :math:`t_{\text{suspicion}}` and the sequential organ failure assessment (SOFA) score deterioration time :math:`t_{\text{sofa}}`. Given :math:`t_{\text{suspicion}}` and :math:`t_{\text{sofa}}`, the sepsis onset time :math:`t_{\text{sepsis}}` is alternatively defined as \* H1: :math:`t_{\text{sepsis}} := t_{\text{sofa}}` \* H2: :math:`t_{\text{sepsis}} := t_{\text{suspicion}}` \* H3: :math:`t_{\text{sepsis}} := min \{ t_{\text{sofa}}, t_{\text{sofa}} \}.` We refer to the above definitions H1, H2, H3 as :math:`t_{\text{sofa}}`, :math:`t_{\text{suspicion}}`, :math:`t_{\text{sepsis min}}`, respectively. In addition, we require that .. math:: t_{\text{suspicion}} - x < t_{\text{sofa}} < t_{\text{suspicion}} + y where :math:`x` and :math:`y` are experimental parameters which we refer to as the SOFA window. That is, we only deem that an onset of sepsis has occurred if :math:`t_{\text{suspicion}}` occurs less than than :math:`x` hours after :math:`t_{\text{sofa}}` and :math:`t_{\text{suspicion}}` occurs less than than :math:`y` hours before :math:`t_{\text{sofa}}`. For the case where multiple candidate values of :math:`t_{\text{suspicion}}` and :math:`t_{\text{sofa}}` are available, we select the earliest pair of :math:`t_{\text{suspicion}}` and :math:`t_{\text{sofa}}` which satisfies the aforementioned SOFA window requirement. .. |Prediction schematic| image:: sepsis_detection_prediction_schematic.png Data ---- The MIMIC-III dataset comprises electronic health records for 40000 patients in intensive care at the at the Beth Israel Deaconess Medical Center, Boston, Massachusetts, between 2001 and 2012. The data are split into training and testing sets. In addition, we apply exclusion criteria to the data, including excluding those patients with very few asssociated vital sign data, a length of stay less than 4 hours, and those patients who develop depsis within 4 hours of entering intensive care. The measurement variables reported for each patient include: - Vital signs (e.g. heart rate, pulse oximetry, temperature, blood pressure systolic, respiratory rate) - Laboratory values (e.g. base excess, bicarbonate, fraction of inspired oxygen, calcium, chloride, hemoglobin) - Demographics (age, sex) - Timestamps (admission time to hospital, admission time to ICU, chart time) Note that measurement variables comprise static data (in the form of demographics, the admission times), in addition to data streams (in the form of timestamped measurements). Features -------- As a preprocessing step, we round timestamps to hours, where we use the 0th hour to represent a patient’s first hour in intensive care. In addition we impute missing data using forward-filling. We denote with :math:`\mathbf{z}^i` static measurements associated with the :math:`i`\ th patient. As previously introduced, we use :math:`x_t^i` to denote measurement variables recorded for the :math:`i`\ th patient at time :math:`t`. We use :math:`f_t^i` to denote all features that we extract using both :math:`\mathbf{z}^i` and :math:`(x_1^i, x_2^i, \ldots, x_t^i)`; we may conceptualise the operation of feature extraction using the function :math:`F`, .. math:: f_t^i := F(\mathbf{z}^i, x_1^i, \ldots, x_t^i). As features, we use a combination of raw measurement variables and additional measurement variables constructed from aforementioned raw measurement variables. Furthermore, we use summary statistics such rolling counts, maxima, minima and moments. Moreover, we incorporate *path signatures* as features that we compute from streams of measurement variables. N-Dimensional Paths ~~~~~~~~~~~~~~~~~~~ An :math:`N`-dimensional path is a mapping :math:`X:[a, b]\rightarrow \mathbb{R}^N`. We may represent :math:`X` in terms of its real-valued coordinates :math:`X(t)=(X_t^1, \ldots, X_t^N)` parametrised by :math:`t \in [a, b]`. In our case, we will construct :math:`2`-dimensional paths from individual measurement variables contained in :math:`(x_1^i, \ldots, x_t^i)`, by interpolating linearly between successive variable measurements and including timestamps as an additional coordinate. Subsequently, we compute the signature of each path. Note that incorporating time information as a coordinate is an example of a *stream transformation*. By incorporating time as an additional coordinate, the resulting path signatures encode information about parametrisation. Path Signatures ~~~~~~~~~~~~~~~ We seek to represent our measurements using the **signature** of the path :math:`X:[a,b]\rightarrow \mathbb{R}^N`. For an introduction to path signatures, we refer to the following works: I. Chevyrev and A. Kormilitzin, “A Primer on the Signature Method in Machine Learning”, arXiv preprint arXiv:1603.03788, 2016, https://arxiv.org/pdf/1603.03788.pdf. .. T. Lyons, “Rough paths, Signatures and the modelling of functions on streams”, In Proceedings of the International Congress of Mathematicians: Seoul, pp. 163‐184, 2014, https://arxiv.org/pdf/1405.4537.pdf. T. Lyons, M. J. Caruana and T. Lévy, “Differential Equations Driven by Rough Paths: Ecole d’Eté de Probabilités de Saint-Flour XXXIV-2004”, Lecture Notes in Mathematics École d’Été de Probabilités de Saint-Flour, Springer 2007, DOI https://doi.org/10.1007/978-3-540-71285-5. .. Gyurkó, Lajos Gergely, Terry Lyons, Mark Kontkowski, and Jonathan Field. “Extracting information from the signature of a financial data stream.” arXiv:1307.7244 (2013). From an informal perspective, the signature :math:`S(X)` is the infinite ordered set of real-valued terms .. math:: \begin{align*} S(X) &= (1, S^1, S^2, \ldots, S^N,\\ &\quad \quad S^{1, 1}, S^{1, 2}, \ldots, S^{N, N},\\ &\quad \quad S^{1, 1, 1}, S^{1, 1, 2}, \ldots, S^{N, N, N},\\ &\quad \quad \ldots) \end{align*} with term :math:`S^{(i_1,...,i_k)}` at index :math:`(i_1,...,i_k)` defined as the :math:`k`-fold iterated path integral .. math:: S^{(i_1,...,i_k)} = \int_{a < r_k < b} \ldots \int_{a < r_1 < r_2} \,dX^{i_1}_{r_1} \ldots \,dX^{i_k}_{r_k}. Due to computational constraints, we cannot compute the entire path signature. Therefore, in practice we truncate the signature to order :math:`K \geq k`, thus obtaining :math:`\sum_{k=0}^{k=K} N^{k}` terms. For example, if we truncate to order :math:`K=2`, the signature of a 2-dimensional path consists of the terms .. math:: S(X) =\big( 1 , S^{(1)}(X) , S^{(2)}(X) , S^{(1,1)}(X), S^{(1,2)}(X), S^{(2,1)}(X), S^{(2,2)}(X) \big). From now on, when we refer to path signatures we will mean the path signatures truncated to level :math:`K=3`. Note that if we set :math:`K` too small, we may discard important information about the target variable. Conversely, if we set :math:`K` too large, we may end up including information which is redundant for predicting the target variable. The Lead-Lag Transformation ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Instead of operating on the described 2-dimensional path :math:`X` directly, based on the 2-dimensional stream :math:`\hat{x}_j` that we observe at time :math:`1, \ldots, t` we may construct a path :math:`X` of dimensionality :math:`N=4` as follows: First, we define the lead-transformed stream :math:`\hat{x}_j^{\text{lead}}` observed at times :math:`1, \ldots, 2t` as .. math:: \hat{x}_j^{\text{lead}} = \begin{cases} \hat{x}_i \quad \text{if j = 2i}\\ \hat{x}_i \quad \text{if j = 2i - 1}. \end{cases} Analogously, we define the lag-transformed stream :math:`\hat{x}_j^{\text{lag}}` observed at times :math:`1, \ldots, 2M` as .. math:: \hat{x}_j^{\text{lag}} = \begin{cases} \hat{x}_i \quad \text{if j = 2i}\\ \hat{x}_i \quad \text{if j = 2i + 1}. \end{cases} The lead-lag transformation :math:`\hat{x}^{\text{lead-lag}}` of :math:`\hat{x}` is the 4-dimensional stream that we obtain by stacking streams :math:`\hat{x}^{\text{lead}}` and :math:`\hat{x}^{\text{lag}}`, .. math:: \hat{x}_j^{\text{lead-lag}} = (\hat{x}_j^{\text{lead}}, \hat{x}_j^{\text{lag}}). The motivation for using the lead-lag transformation is that it facilitates representing the cross-variation between the original path and its delayed version (Gyurkó et al., 2013). Extract Features ---------------- We now extract features, setting SOFA window parameters :math:`(x, y)` alternatively to :math:`(24h, 12h)` and :math:`(12h, 6h)`: .. code:: ipython3 constants.MIMIC_DATA_DIRS['blood_only'] = {'train': str(MIMIC_ANALYSIS_PATH) + '/data/raw/train/blood_only', 'test': str(MIMIC_ANALYSIS_PATH) + '/data/raw/train/blood_only'} .. code:: ipython3 features_wrapper(data_list=['blood_only'], x_y_list=constants.xy_pairs[1:3], purpose='train') .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/ already exists Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/ already exists Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/results/blood_only/LGBM/ already exists generate train features for sensitity 24_12 definition Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/data/processed/blood_only/train/ already exists definition = t_sofa generate features on data set Initial size: 1696261 .. parsed-literal:: /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/frame.py:4315: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy errors=errors, /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/frame.py:4449: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy errors=errors, .. parsed-literal:: Size of instances after discarding patients developing sepsis within 4 hour in ICU: 937872 Size after averaging hourly measurement and resampling: 1043082 Size of instances after getting censored data: 840628 Size of instances after discarding patients staying less than 4 hour or longer than 20 days: 840628 After triming the data to icu instances: 355589 Final size: 355521 save septic ratio for data set ICUStay id number: 7715 Sepsis ICUStay number and Sepsis ICU ratio: 1117 0.14478289047310433 save ICU Ids for data set save ICU lengths for data set save processed dataframe for lstm model generate and save input features Finally getting james feature: .. parsed-literal:: /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/window/rolling.py:2016: FutureWarning: min_periods=None will default to the size of window consistent with other methods in a future version. Specify min_periods=0 instead. FutureWarning, .. parsed-literal:: Size of james feature for definition (355521, 113) generate and save timeseries dataset for LSTM model input gengerate and save labels T= 12 Labeling: length of label 355521 T= 8 Labeling: length of label 355521 T= 6 Labeling: length of label 355521 T= 4 Labeling: length of label 355521 definition = t_suspicion generate features on data set Initial size: 1696261 .. parsed-literal:: /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/frame.py:4315: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy errors=errors, /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/frame.py:4449: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy errors=errors, .. parsed-literal:: Size of instances after discarding patients developing sepsis within 4 hour in ICU: 1106570 Size after averaging hourly measurement and resampling: 1179916 Size of instances after getting censored data: 872429 Size of instances after discarding patients staying less than 4 hour or longer than 20 days: 872429 After triming the data to icu instances: 366271 Final size: 366203 save septic ratio for data set ICUStay id number: 8330 Sepsis ICUStay number and Sepsis ICU ratio: 1732 0.20792316926770707 save ICU Ids for data set save ICU lengths for data set save processed dataframe for lstm model generate and save input features Finally getting james feature: .. parsed-literal:: /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/window/rolling.py:2016: FutureWarning: min_periods=None will default to the size of window consistent with other methods in a future version. Specify min_periods=0 instead. FutureWarning, .. parsed-literal:: Size of james feature for definition (366203, 113) generate and save timeseries dataset for LSTM model input gengerate and save labels T= 12 Labeling: length of label 366203 T= 8 Labeling: length of label 366203 T= 6 Labeling: length of label 366203 T= 4 Labeling: length of label 366203 definition = t_sepsis_min generate features on data set Initial size: 1696261 .. parsed-literal:: /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/frame.py:4315: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy errors=errors, /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/frame.py:4449: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy errors=errors, .. parsed-literal:: Size of instances after discarding patients developing sepsis within 4 hour in ICU: 885662 Size after averaging hourly measurement and resampling: 986622 Size of instances after getting censored data: 834414 Size of instances after discarding patients staying less than 4 hour or longer than 20 days: 834414 After triming the data to icu instances: 352205 Final size: 352137 save septic ratio for data set ICUStay id number: 7413 Sepsis ICUStay number and Sepsis ICU ratio: 815 0.10994199379468501 save ICU Ids for data set save ICU lengths for data set save processed dataframe for lstm model generate and save input features Finally getting james feature: .. parsed-literal:: /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/window/rolling.py:2016: FutureWarning: min_periods=None will default to the size of window consistent with other methods in a future version. Specify min_periods=0 instead. FutureWarning, .. parsed-literal:: Size of james feature for definition (352137, 113) generate and save timeseries dataset for LSTM model input gengerate and save labels T= 12 Labeling: length of label 352137 T= 8 Labeling: length of label 352137 T= 6 Labeling: length of label 352137 T= 4 Labeling: length of label 352137 save icu spetic ratio to csv generate train features for sensitity 12_6 definition Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/data/processed/blood_only/train/ already exists definition = t_sofa generate features on data set Initial size: 1696261 .. parsed-literal:: /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/frame.py:4315: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy errors=errors, /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/frame.py:4449: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy errors=errors, .. parsed-literal:: Size of instances after discarding patients developing sepsis within 4 hour in ICU: 1014020 Size after averaging hourly measurement and resampling: 1127394 Size of instances after getting censored data: 946231 Size of instances after discarding patients staying less than 4 hour or longer than 20 days: 946231 After triming the data to icu instances: 408334 Final size: 408266 save septic ratio for data set ICUStay id number: 8097 Sepsis ICUStay number and Sepsis ICU ratio: 941 0.11621588242558972 save ICU Ids for data set save ICU lengths for data set save processed dataframe for lstm model generate and save input features Finally getting james feature: .. parsed-literal:: /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/window/rolling.py:2016: FutureWarning: min_periods=None will default to the size of window consistent with other methods in a future version. Specify min_periods=0 instead. FutureWarning, .. parsed-literal:: Size of james feature for definition (408266, 113) generate and save timeseries dataset for LSTM model input gengerate and save labels T= 12 Labeling: length of label 408266 T= 8 Labeling: length of label 408266 T= 6 Labeling: length of label 408266 T= 4 Labeling: length of label 408266 definition = t_suspicion generate features on data set Initial size: 1696261 .. parsed-literal:: /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/frame.py:4315: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy errors=errors, /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/frame.py:4449: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy errors=errors, .. parsed-literal:: Size of instances after discarding patients developing sepsis within 4 hour in ICU: 1160161 Size after averaging hourly measurement and resampling: 1244174 Size of instances after getting censored data: 971246 Size of instances after discarding patients staying less than 4 hour or longer than 20 days: 971246 After triming the data to icu instances: 415401 Final size: 415333 save septic ratio for data set ICUStay id number: 8669 Sepsis ICUStay number and Sepsis ICU ratio: 1513 0.17452993424847157 save ICU Ids for data set save ICU lengths for data set save processed dataframe for lstm model generate and save input features Finally getting james feature: .. parsed-literal:: /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/window/rolling.py:2016: FutureWarning: min_periods=None will default to the size of window consistent with other methods in a future version. Specify min_periods=0 instead. FutureWarning, .. parsed-literal:: Size of james feature for definition (415333, 113) generate and save timeseries dataset for LSTM model input gengerate and save labels T= 12 Labeling: length of label 415333 T= 8 Labeling: length of label 415333 T= 6 Labeling: length of label 415333 T= 4 Labeling: length of label 415333 definition = t_sepsis_min generate features on data set Initial size: 1696261 .. parsed-literal:: /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/frame.py:4315: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy errors=errors, /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/frame.py:4449: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy errors=errors, .. parsed-literal:: Size of instances after discarding patients developing sepsis within 4 hour in ICU: 992585 Size after averaging hourly measurement and resampling: 1102871 Size of instances after getting censored data: 943472 Size of instances after discarding patients staying less than 4 hour or longer than 20 days: 943472 After triming the data to icu instances: 407018 Final size: 406950 save septic ratio for data set ICUStay id number: 7979 Sepsis ICUStay number and Sepsis ICU ratio: 823 0.10314575761373605 save ICU Ids for data set save ICU lengths for data set save processed dataframe for lstm model generate and save input features Finally getting james feature: .. parsed-literal:: /home/fosterp/miniconda3/envs/mimiciii_sepsis_notebook/lib/python3.7/site-packages/pandas/core/window/rolling.py:2016: FutureWarning: min_periods=None will default to the size of window consistent with other methods in a future version. Specify min_periods=0 instead. FutureWarning, .. parsed-literal:: Size of james feature for definition (406950, 113) generate and save timeseries dataset for LSTM model input gengerate and save labels T= 12 Labeling: length of label 406950 T= 8 Labeling: length of label 406950 T= 6 Labeling: length of label 406950 T= 4 Labeling: length of label 406950 save icu spetic ratio to csv For exploratory purposes, based on a random random of patients plot some of the raw measurement variables used to generate features: .. code:: ipython3 with open(Path(MIMIC_ANALYSIS_PATH, 'data/processed/blood_only/train/24_12_sepsis_min_dataframe.pkl'), 'rb') as f: df = pickle.load(f) .. code:: ipython3 FEATURES_TO_PLOT = ['heart_rate', 'nbp_sys', 'nbp_mean', 'o2sat', 'resp_rate', 'sofa_total'] def plot_features(n_ids_to_plot=5, n_features_to_plot=(3, 2), figsize=(8*1.3, 8*1.3)): np.random.seed(1) ids_to_plot = np.random.choice(df['icustay_id'].unique(), size=n_ids_to_plot, replace=False) fig, axs = plt.subplots(n_features_to_plot[0], n_features_to_plot[1], sharex=True, figsize=figsize) for ax, feat in zip(axs.flatten(), FEATURES_TO_PLOT): for i, patient_id in enumerate(ids_to_plot): ax.set_title('Feature: {}'.format(feat)) df[df['icustay_id'].isin([patient_id])][feat].reset_index(drop=True).plot(ax=ax, label='Patient {}'.format(i)) ax.set_ylabel('Measurement value') plt.xlabel('Measurement index') plt.legend(loc='lower left', bbox_to_anchor=(1.02, 1.4), ncol=1, borderaxespad=0, frameon=False) plot_features() .. image:: sepsis_detection_18_0.png Train Model ----------- As our classifier, we train a gradient boosted tree, using `LightGBM `__. For illustrative purposes, we train using a fixed set of hyperparameters. These hyperparameters are based on optimising with respect to the training data, using 5-fold cross validation. We train models across combinations of the SOFA window size :math:`(x, y)`, sepsis onset time definitions and the prediction horizon :math:`T`. In addition, we train separate models for the real-time and patient-level prediction tasks. .. code:: ipython3 train_LGBM.train_LGBM(constants.T_list, constants.xy_pairs[1:3], constants.FEATURES, constants.exclusion_rules[0]) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/ already exists Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/ already exists Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/results/blood_only/LGBM/ already exists Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/data/processed/blood_only/train/ already exists Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/ already exists Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/ already exists Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/results/blood_only/LGBM/ already exists 24 12 12 t_sofa Model fitting: 0.85006993006993 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 24 12 12 t_suspicion Model fitting: 0.8500454752160073 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 24 12 12 t_sepsis_min Model fitting: 0.850061804697157 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 24 12 8 t_sofa Model fitting: 0.8500981637602495 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 24 12 8 t_suspicion Model fitting: 0.8500638026371756 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 24 12 8 t_sepsis_min Model fitting: 0.8500392156862745 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 24 12 6 t_sofa Model fitting: 0.8500341763499658 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 24 12 6 t_suspicion Model fitting: 0.850068422853233 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 24 12 6 t_sepsis_min Model fitting: 0.8501118568232662 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 24 12 4 t_sofa Model fitting: 0.8500448430493274 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 24 12 4 t_suspicion Model fitting: 0.8500173591019557 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 24 12 4 t_sepsis_min Model fitting: 0.8501228501228502 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 12 6 12 t_sofa Model fitting: 0.85 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 12 6 12 t_suspicion Model fitting: 0.8500339904826648 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 12 6 12 t_sepsis_min Model fitting: 0.8500429500552215 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 12 6 8 t_sofa Model fitting: 0.8500477554918816 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 12 6 8 t_suspicion Model fitting: 0.8500123752165663 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 12 6 8 t_sepsis_min Model fitting: 0.8500077555452148 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 12 6 6 t_sofa Model fitting: 0.8500647668393783 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 12 6 6 t_suspicion Model fitting: 0.8500246184145741 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 12 6 6 t_sepsis_min Model fitting: 0.8500092131932928 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 12 6 4 t_sofa Model fitting: 0.85 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 12 6 4 t_suspicion Model fitting: 0.8500860813137333 .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists 12 6 4 t_sepsis_min Model fitting: 0.8501216545012166 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train/ already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) Evaluate Model -------------- For each prediction task and for each combination of SOFA window size, sepsis onset time definition and prediction horizon, we evaluate the model’s performance using receiver operating characteristic area under the curve (ROCAUC). For illustrative purposes, we compute in-sample performance. .. code:: ipython3 eval_lgbm.eval_LGBM(constants.T_list, constants.xy_pairs[1:3], constants.FEATURES, constants.exclusion_rules[0], train_test='train', fake_test=False) .. parsed-literal:: Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/ already exists Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/ already exists Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/results/blood_only/LGBM/ already exists /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/data/processed/blood_only/train/ 24 12 12 t_sofa Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/24_12_12_sofa.pkl Model fitting: auc,sepcificity,sensitivity 0.8499751988750701 0.6650657200199538 0.85006993006993 accuracy 0.670646740980139 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 24 12 12 t_suspicion Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/24_12_12_suspicion.pkl Model fitting: auc,sepcificity,sensitivity 0.9287377052563499 0.8390555662328498 0.8500454752160073 accuracy 0.8395835096927114 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 24 12 12 t_sepsis_min Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/24_12_12_sepsis_min.pkl Model fitting: auc,sepcificity,sensitivity 0.9352466618858162 0.8597139344333768 0.850061804697157 accuracy 0.8594921862797718 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 24 12 8 t_sofa Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/24_12_8_sofa.pkl Model fitting: auc,sepcificity,sensitivity 0.8584451093732611 0.676162277793474 0.8500981637602495 accuracy 0.6803986262414878 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 24 12 8 t_suspicion Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/24_12_8_suspicion.pkl Model fitting: auc,sepcificity,sensitivity 0.924721731866855 0.8336878757842299 0.8500638026371756 accuracy 0.834318670245738 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 24 12 8 t_sepsis_min Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/24_12_8_sepsis_min.pkl Model fitting: auc,sepcificity,sensitivity 0.9057155207407203 0.7854159797779976 0.8500392156862745 accuracy 0.7865859026458453 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 24 12 6 t_sofa Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/24_12_6_sofa.pkl Model fitting: auc,sepcificity,sensitivity 0.8636103857393612 0.6867256738827017 0.8500341763499658 accuracy 0.6900858177154092 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 24 12 6 t_suspicion Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/24_12_6_suspicion.pkl Model fitting: auc,sepcificity,sensitivity 0.9191861942719703 0.8260195029209249 0.850068422853233 accuracy 0.826787328339746 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 24 12 6 t_sepsis_min Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/24_12_6_sepsis_min.pkl Model fitting: auc,sepcificity,sensitivity 0.8964516835314279 0.76007070908058 0.8501118568232662 accuracy 0.7614422795673275 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 24 12 4 t_sofa Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/24_12_4_sofa.pkl Model fitting: auc,sepcificity,sensitivity 0.86608994100025 0.6896721208415013 0.8500448430493274 accuracy 0.6921869594201187 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 24 12 4 t_suspicion Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/24_12_4_suspicion.pkl Model fitting: auc,sepcificity,sensitivity 0.9043130758156993 0.7883779596265822 0.8500173591019557 accuracy 0.7898324153543254 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 24 12 4 t_sepsis_min Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/24_12_4_sepsis_min.pkl Model fitting: auc,sepcificity,sensitivity 0.88379120984424 0.7316694774281963 0.8501228501228502 accuracy 0.733038561696158 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 12 6 12 t_sofa Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/12_6_12_sofa.pkl Model fitting: auc,sepcificity,sensitivity 0.858482382387737 0.6836980651756677 0.85 accuracy 0.6874292740517212 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 12 6 12 t_suspicion Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/12_6_12_suspicion.pkl Model fitting: auc,sepcificity,sensitivity 0.9377764562523236 0.8670945003157582 0.8500339904826648 accuracy 0.8664902620307079 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 12 6 12 t_sepsis_min Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/12_6_12_sepsis_min.pkl Model fitting: auc,sepcificity,sensitivity 0.9363530464873034 0.8571141998139423 0.8500429500552215 accuracy 0.8569726010566409 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 12 6 8 t_sofa Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/12_6_8_sofa.pkl Model fitting: auc,sepcificity,sensitivity 0.8671818273812029 0.6990150572284424 0.8500477554918816 accuracy 0.7017263254838757 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 12 6 8 t_suspicion Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/12_6_8_suspicion.pkl Model fitting: auc,sepcificity,sensitivity 0.9363195990204106 0.8654950745513527 0.8500123752165663 accuracy 0.865043230371774 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 12 6 8 t_sepsis_min Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/12_6_8_sepsis_min.pkl Model fitting: auc,sepcificity,sensitivity 0.9281940984649989 0.8371647653076256 0.8500077555452148 accuracy 0.8373682270549208 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 12 6 6 t_sepsis_min Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/12_6_6_sepsis_min.pkl Model fitting: auc,sepcificity,sensitivity 0.9117952880312027 0.7942907380150078 0.8500092131932928 accuracy 0.7950337879346357 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 12 6 4 t_sofa Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/12_6_4_sofa.pkl Model fitting: auc,sepcificity,sensitivity 0.8785864093415711 0.7215374932476968 0.85 accuracy 0.7230163667804813 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 12 6 4 t_suspicion Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/12_6_4_suspicion.pkl Model fitting: auc,sepcificity,sensitivity 0.9197993299918358 0.8300317326414604 0.8500860813137333 accuracy 0.8303963325813263 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. parsed-literal:: 12 6 4 t_sepsis_min Trained model from dic: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/models/blood_only/LGBM/12_6_4_sepsis_min.pkl Model fitting: auc,sepcificity,sensitivity 0.8876975490441225 0.7276263528944494 0.8501216545012166 accuracy 0.7288634967440718 Directory /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/outputs/predictions/blood_only/LGBM/train already exists .. parsed-literal:: /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:449: RuntimeWarning: invalid value encountered in long_scalars NPV = TN / (TN + FN) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:447: RuntimeWarning: invalid value encountered in long_scalars PPV = TP / (TP + FP) /scratch/fosterp/Mimiciii_Sepsis_Label_Extraction/src/visualization/patientlevel_function.py:455: RuntimeWarning: invalid value encountered in long_scalars FDR = FP / (TP + FP) .. code:: ipython3 result_df = pd.read_csv(str(Path(MIMIC_ANALYSIS_PATH, 'outputs/predictions/blood_only/LGBM/train/train_results.csv').resolve())) results_patient_level_df = pd.read_csv(str(Path(MIMIC_ANALYSIS_PATH, 'outputs/results/blood_only/LGBM/train_patient_level_results.csv').resolve())) Plot Results ------------ Plot results across combinations of SOFA window size, sepsis onset time definition and prediction horizon, for the real-time and patient-level prediction tasks: .. code:: ipython3 def plot_results(dfs=(result_df, results_patient_level_df), titles=('Real-time prediction model', 'Patient level model'), auc_range=(0.75, 0.95), figsize=(11, 14)): n_definitions = len(result_df['definition'].unique()) n_dfs = len(dfs) fig, axs = plt.subplots(n_definitions, n_dfs, figsize=figsize) def plot_df(df, axs): for (group_name, df), ax in zip(df.groupby('definition'), axs): df.set_index('T', inplace=True) df.groupby('x,y')['auc'].plot(ax=ax, legend=True) ax.set_ylim(auc_range) ax.set_ylabel('AUC') ax.set_title(group_name) for text in ax.legend().get_texts(): text.set_text('x,y: {}'.format(text.get_text())) for df, axs, title in zip(dfs, axs.T, titles): axs[0].annotate(title, xy=(0.5, 1.12), xytext=(0, 0), xycoords='axes fraction', textcoords='offset points', size=15, ha='center', va='baseline') plot_df(df, axs) fig.tight_layout() fig.subplots_adjust(left=0.15, top=0.95) plt.show() plot_results() .. image:: sepsis_detection_25_0.png