MIMIC-IV Example
This is an example of how to extract a MEDS dataset from MIMIC-IV. To see a faster demo on smaller public medical datasets with meds-torch and other meds community models, please go to this MEDS-DEV demo page.
All scripts in this README are assumed to be run not from this directory but from the root directory of this entire repository (e.g., one directory up from this one).
Extract MIMIC-IV MEDS Data
Take the raw MIMIC-IV data and perform the following extraction yourself. Follow the MEDS-Transforms tutorial here.
Install MEDS-Torch
Either install the package from PyPI:
or clone the repository and install the package from source:
Pre-Processing for Sequence Modeling
We support two tensorization scripts corresponding to triplet and eic tokenization.
Run the following end to end script to generate triplet tensors
export MIMICIV_MEDS_DIR=??? # set to the directory in which you want to store the MIMIC-IV MEDS data
export MIMICIV_TRIPLET_TENSOR_DIR=??? # set to the directory in which you want to output the tensorized MIMIC-IV data
export N_PARALLEL_WORKERS=8 # set to the number of parallel workers you want to use
export PIPELINE_CONFIG_PATH="$(pwd)/MIMICIV_INDUCTIVE_EXPERIMENTS/configs/triplet_config.yaml" # set to the directory in which the config file is stored, must be an absolute path.
export JOBLIB_RUNNER_CONFIG_PATH="$(pwd)/MIMICIV_INDUCTIVE_EXPERIMENTS/configs/joblib_runner.yaml" # set to the directory in which the config file is stored, must be an absolute path.
bash MIMICIV_INDUCTIVE_EXPERIMENTS/tokenize.sh $MIMICIV_MEDS_DIR $MIMICIV_TRIPLET_TENSOR_DIR $N_PARALLEL_WORKERS $PIPELINE_CONFIG_PATH stage_runner_fp=$JOBLIB_RUNNER_CONFIG_PATH
Run the following end to end script to generate eic tensors
export MIMICIV_MEDS_DIR=??? # set to the directory in which you want to store the raw MIMIC-IV data
export MIMICIV_EIC_DIR=??? # set to the directory in which you want to output the tensorized MIMIC-IV data
export N_PARALLEL_WORKERS=8 # set to the number of parallel workers you want to use
export PIPELINE_CONFIG_PATH="$(pwd)/MIMICIV_INDUCTIVE_EXPERIMENTS/configs/eic_config.yaml" # set to the directory in which the config file is stored, must be an absolute path.
export JOBLIB_RUNNER_CONFIG_PATH="$(pwd)/MIMICIV_INDUCTIVE_EXPERIMENTS/configs/joblib_runner.yaml" # set to the directory in which the config file is stored, must be an absolute path.
bash MIMICIV_INDUCTIVE_EXPERIMENTS/tokenize.sh $MIMICIV_MEDS_DIR $MIMICIV_EIC_DIR $N_PARALLEL_WORKERS $PIPELINE_CONFIG_PATH stage_runner_fp=$JOBLIB_RUNNER_CONFIG_PATH
Task Extraction
Next we need to get some labels for our tasks. We will use the long_los task as an example.
There are two options:
Use ACES to extract labels using a task config definition:
We can manually extract the supervised task labels from our meds dataset using aces. First install aces:
conda create -n aces python=3.12
conda activate aces
pip install es-aces==0.5.0
pip install hydra-joblib-launcher
Second, run the following command to extract the supervised task labels:
TASKS=(
"mortality/in_hospital/first_24h"
"mortality/in_icu/first_24h"
"mortality/post_hospital_discharge/1y"
"readmission/30d"
)
for TASK_NAME in "${TASKS[@]}"; do
SINGLE_TASK_DIR="${MIMICIV_MEDS_DIR}/tasks/${TASK_NAME}"
mkdir -p $SINGLE_TASK_DIR # create a directory for the task
cp MIMICIV_INDUCTIVE_EXPERIMENTS/configs/tasks/${TASK_NAME}.yaml "${SINGLE_TASK_DIR}.yaml"
aces-cli --multirun hydra/launcher=joblib data=sharded data.standard=meds data.root="$MIMICIV_MEDS_DIR/data" "data.shard=$(expand_shards $MIMICIV_MEDS_DIR/data)" cohort_dir="${MIMICIV_MEDS_DIR}/tasks/" cohort_name="$TASK_NAME"
done
Running a Single Task with MEDS-Torch
Training a model is simple with MEDS-Torch. Here’s an example of how to train a supervised model for the mortality/in_hospital/first_24h task using the triplet tokenization method. All a user must do is input the paths to the tensorized data (cached patient time series data), the cohort directory (directory of the raw MEDS data), and the output directory (where results are stored). The evaluation is automatically performed at the end of the training process.
First, let’s set up our environment variables:
ROOT_DIR="/path/to/your/root/directory" # Replace with your actual root directory
TENSOR_DIR="${ROOT_DIR}/triplet_tensors/"
MEDS_DIR="${ROOT_DIR}/meds/"
TASKS_DIR="${MEDS_DIR}/tasks/"
OUTPUT_DIR="${ROOT_DIR}/results/triplet_mtr/mortality/in_hospital/first_24h/"
TRAIN_DIR="${OUTPUT_DIR}/supervised/train/"
These variables define the key directories for our MEDS-Torch workflow:
ROOT_DIR: The base directory for your MEDS-Torch projectTENSOR_DIR: Where the tensorized (preprocessed) patient data is storedMEDS_DIR: Location of the raw MEDS dataTASKS_DIR: Directory containing task parquet files following the MEDS label_schema.OUTPUT_DIR: Where the results will be storedTRAIN_DIR: Specific directory for training output
Next, activate your conda environment:
Now you’re ready to train your model. The meds-torch-train command takes care of the entire training process, including evaluation:
meds-torch-train \
experiment=triplet_mtr \
paths.data_dir=${TENSOR_DIR} \
paths.meds_cohort_dir=${MEDS_DIR} \
paths.output_dir=${TRAIN_DIR} \
data.task_name=mortality/in_hospital/first_24h \
data.task_root_dir=${TASKS_DIR} \
hydra.searchpath=[pkg://meds_torch.configs,./MIMICIV_INDUCTIVE_EXPERIMENTS/configs/meds-torch-configs]
This command specifies:
- The experiment type (
triplet_mtr): This loads thetriplet_mtr.yamlconfiguration file, which overrides default arguments (in thetrain.yaml) with settings specific to the triplet model training recipe. - Paths to the tensorized data, MEDS cohort, and output directory
- The specific task name and its root directory
- The search path for configuration files
The meds-torch-train command will train the model and automatically evaluate it at the end of the training process. The results, including evaluation metrics, will be saved in the specified output directory.
With these steps, you can easily train a MEDS-Torch model for a single task, with evaluation included as part of the process.
Launching Tokenization Inductive Experiments
Run Supervised Learning Experiments:
export MIMICIV_ROOT_DIR=??? # set to the parent directory of the meds folder
export CONDA_ENV_NAME=meds-torch # set to the name of the conda environment you want to use
bash MIMICIV_INDUCTIVE_EXPERIMENTS/launch_supervised.sh $MIMICIV_ROOT_DIR meds-torch $CONDA_ENV_NAME
Or run Transfer Learning Experiments:
TRANSFER_LEARNING_METHOD=??? # set to the transfer learning method you want to use, choose one from "ebcl" "ocp" "value_forecasting"
bash MIMICIV_INDUCTIVE_EXPERIMENTS/launch_multi_window_pretrain.sh $MIMICIV_ROOT_DIR $CONDA_ENV_NAME $TRANSFER_LEARNING_METHOD
bash MIMICIV_INDUCTIVE_EXPERIMENTS/launch_finetune.sh $MIMICIV_ROOT_DIR $CONDA_ENV_NAME $TRANSFER_LEARNING_METHOD
TRANSFER_LEARNING_METHOD=??? # set to the transfer learning method you want to use, choose one from "eic_forecasting" "triplet_forecasting"
bash MIMICIV_INDUCTIVE_EXPERIMENTS/launch_ar_pretrain.sh $MIMICIV_ROOT_DIR $CONDA_ENV_NAME $TRANSFER_LEARNING_METHOD
bash MIMICIV_INDUCTIVE_EXPERIMENTS/launch_ar_finetune.sh $MIMICIV_ROOT_DIR $CONDA_ENV_NAME $TRANSFER_LEARNING_METHOD
To run all experiments in one go:
The following script will train a supervised model for all three tokenization methods (Triplet, EIC, and Text Code) on all four tasks.
mortality/in_hospital/first_24hmortality/in_icu/first_24hmortality/post_hospital_discharge/1yreadmission/30d
Note this will be 12 experiments in total.
# Launch Supervised experiments
bash MIMICIV_INDUCTIVE_EXPERIMENTS/launch_supervised.sh $MIMICIV_ROOT_DIR meds-torch
We then pretrain all transfer learning models (EBCL, OCP, Value Forecasting, and Autoregressive Forecasting) for all three tokenization methods (Triplet, EIC, and Text Code) on the full dataset. Note that this will be 12 experiments in total.
# Launch pretraining
bash MIMICIV_INDUCTIVE_EXPERIMENTS/launch_multi_window_pretrain.sh $MIMICIV_ROOT_DIR meds-torch ocp
bash MIMICIV_INDUCTIVE_EXPERIMENTS/launch_multi_window_pretrain.sh $MIMICIV_ROOT_DIR meds-torch ebcl
bash MIMICIV_INDUCTIVE_EXPERIMENTS/launch_multi_window_pretrain.sh $MIMICIV_ROOT_DIR meds-torch value_forecasting
bash MIMICIV_INDUCTIVE_EXPERIMENTS/launch_ar_pretrain.sh $MIMICIV_ROOT_DIR meds-torch
Finally we finetune all transfer learning models (EBCL, OCP, Value Forecasting, and Autoregressive Forecasting) on the four tasks. Note that this will be 16 experiments in total.
#Launch Finetuning
bash MIMICIV_INDUCTIVE_EXPERIMENTS/launch_finetune.sh $MIMICIV_ROOT_DIR meds-torch ocp
bash MIMICIV_INDUCTIVE_EXPERIMENTS/launch_finetune.sh $MIMICIV_ROOT_DIR meds-torch ebcl
bash MIMICIV_INDUCTIVE_EXPERIMENTS/launch_finetune.sh $MIMICIV_ROOT_DIR meds-torch value_forecasting
bash MIMICIV_INDUCTIVE_EXPERIMENTS/launch_ar_finetune.sh $MIMICIV_ROOT_DIR meds-torch meds-torch
Results will be stored in the ${MIMICIV_ROOT_DIR}/results directory. You can view the latest results using the following python code snippet:
import os
import pandas as pd
import polars as pl
from datetime import datetime
# Specify the directory to search
search_dir = ??? # set to the ${MIMICIV_ROOT_DIR}/results directory
def find_files(directory, filename):
found_files = []
for root, dirs, files in os.walk(directory):
if filename in files:
found_files.append(os.path.join(root, filename))
return found_files
def extract_info_from_path(file_path):
parts = file_path.split('/')
task_name = "/".join(parts[8:-4])
method = parts[6]
# Extract the full timestamp
timestamp_str = parts[-2]
date = datetime.strptime(timestamp_str, '%Y-%m-%d_%H-%M-%S_%f')
print(file_path)
match file_path:
case _ if "eic_mtr" in file_path:
tokenization_strategy = "eic"
case _ if "triplet_mtr" in file_path:
tokenization_strategy = "triplet"
case _ if "triplet_forecast_mtr" in file_path:
tokenization_strategy = "triplet"
case _ if "eic_forecast_mtr" in file_path:
tokenization_strategy = "eic"
case _:
tokenization_strategy = "unknown"
return task_name, method, date, tokenization_strategy
def process_files(search_dir, target_file):
results = find_files(search_dir, target_file)
data = []
for file_path in results:
df = pl.read_parquet(file_path)
if 'test/auc' in df.columns and "multiseed" in file_path:
task_name, method, date, tokenization_strategy = extract_info_from_path(file_path)
auc_mean, auc_std = df['test/auc'].mean()*100, df['test/auc'].std()*100
result = f"{auc_mean:.1f} ± {auc_std:.1f}"
data.append({
'task_name': task_name,
'method': method,
'date': date,
'tokenization_strategy': tokenization_strategy,
'result': result
})
return pd.DataFrame(data)
# Specify the filename to search for
target_file = 'sweep_results_summary.parquet'
# Process the files and create the DataFrame
results_df = process_files(search_dir, target_file)
# filter to tasks of interest
tasks_of_interest = [
"mortality/in_hospital/first_24h",
"mortality/in_icu/first_24h",
"mortality/post_hospital_discharge/1y",
"readmission/30d",
]
results_df = results_df[results_df['task_name'].isin(tasks_of_interest)]
# Rename the methods
method_mapping = {
'eic_forecasting': 'AR forecasting',
'triplet_forecasting': 'AR forecasting'
}
results_df['method'] = results_df['method'].replace(method_mapping)
# Display the results
results_df.sort_values(["task_name", "date"]).groupby(['task_name', "method", "tokenization_strategy"]).last()
This table presents the results of various tokenization methods across different tasks for the MIMIC-IV dataset. The results are reported as Mean ± Standard Deviation of the Area Under the Curve (AUC) over five trials. The table compares different methods (Contrastive, Forecasting, and Supervised) with various types and tokenization strategies (EIC, Text Code, and Triplet) across four key tasks in medical risk prediction.
- hosp-Mortality (
mortality/in_hospital/first_24h): Prediction of in-hospital mortality given data up to the end of the first 24 hours of hospital observations. - ICU-Mortality (
mortality/in_icu/first_24h): Prediction of in-ICU mortality given data up to the end of the first 24 hours of ICU observations. - Discharge-Mortality (
mortality/post_hospital_discharge/1y): Prediction of whether a subject will survive 1 year after hospital discharge. - Readmission (
readmission/30d): Prediction of whether a subject is readmitted within 30 days after hospital discharge.
| Method | Type | Tokenization | hosp-Mortality | ICU-Mortality | Discharge-Mortality | Readmission |
|---|---|---|---|---|---|---|
| Contrastive | OCP | EIC | 86.1 ± 0.3 | 77.2 ± 0.4 | 84.1 ± 0.1 | 70.3 ± 0.3 |
| Text Code | 80.0 ± 0.5 | 69.3 ± 1.6 | 81.6 ± 0.1 | 68.3 ± 0.3 | ||
| Triplet | 87.3 ± 0.4 | 75.8 ± 0.4 | 85.6 ± 0.1 | 71.5 ± 0.2 | ||
| LCL | EIC | 86.1 ± 0.7 | 76.6 ± 0.6 | 84.0 ± 0.0 | 70.6 ± 0.2 | |
| Text Code | 85.2 ± 0.3 | 74.9 ± 0.9 | 83.9 ± 0.3 | 70.1 ± 0.3 | ||
| Triplet | 86.5 ± 0.2 | 77.4 ± 0.7 | 85.6 ± 0.1 | 71.8 ± 0.1 | ||
| Forecasting | Autoregressive | EIC | 84.8 ± 0.1 | 76.9 ± 0.5 | 83.6 ± 0.3 | 69.9 ± 0.2 |
| Text Code | 81.9 ± 0.4 | 71.6 ± 1.3 | 81.9 ± 0.4 | 69.1 ± 0.3 | ||
| Triplet | 74.0 ± 0.6 | 65.1 ± 2.2 | 76.0 ± 1.8 | 64.4 ± 0.5 | ||
| Value | EIC | 86.1 ± 0.6 | 77.8 ± 1.0 | 84.0 ± 0.2 | 70.2 ± 0.6 | |
| Text Code | 85.2 ± 0.2 | 75.8 ± 0.6 | 85.8 ± 0.1 | 72.1 ± 0.1 | ||
| Triplet | 88.2 ± 0.1 | 77.3 ± 0.8 | 86.2 ± 0.1 | 72.1 ± 0.1 | ||
| Supervised | - | EIC | 86.4 ± 0.2 | 77.9 ± 0.4 | 84.0 ± 0.1 | 70.0 ± 0.1 |
| Text Code | 85.3 ± 0.3 | 75.5 ± 0.7 | 85.0 ± 0.3 | 70.8 ± 0.3 | ||
| Triplet | 87.1 ± 0.9 | 77.4 ± 1.1 | 85.4 ± 0.2 | 71.5 ± 0.2 |
We analyze the performance of different tokenization strategies across all four tasks and all methods:

This bar plot illustrates the overall win rates for each tokenization strategy, aggregated across all tasks and methods. The Triplet tokenization demonstrates superior performance, consistently outperforming both EIC and Text Code. This suggests that Triplet tokenization may be more effective in capturing and representing the underlying structure of the data across a wide range of scenarios.
To gain deeper insights, we also examine the performance of each tokenization strategy across different methods:

This grouped bar plot breaks down the win rates by method, aggregated across tasks and normalized for each method. We observe that triplet is more effective for contrastive and supervised learning methods, but EIC performs better for forecasting methods. This suggests that the choice of tokenization strategy should be tailored to the specific learning method and task at hand.