From 280b4427a5c271dd56955fd3ce565f9c9175c5c9 Mon Sep 17 00:00:00 2001 From: Florence Townend Date: Wed, 10 Jan 2024 17:33:59 +0000 Subject: [PATCH 1/4] Added option for users to choose their own metrics in the fusilli.utils.metric_utils file and input into the train_and_save_models function. Also added tests --- fusilli/eval.py | 162 ++++++------ fusilli/fusionmodels/base_model.py | 147 ++++++----- fusilli/train.py | 24 +- fusilli/utils/metrics_utils.py | 329 ++++++++++++++++++++++++ fusilli/utils/training_utils.py | 22 +- tests/test_eval/test_ModelComparison.py | 2 +- tests/test_models/test_BaseModel.py | 6 +- tests/test_pipeline/test_kfold.py | 5 +- tests/test_pipeline/test_traintest.py | 3 + tests/test_utils/__init__.py | 0 tests/test_utils/test_metrics.py | 187 ++++++++++++++ 11 files changed, 714 insertions(+), 173 deletions(-) create mode 100644 fusilli/utils/metrics_utils.py create mode 100644 tests/test_utils/__init__.py create mode 100644 tests/test_utils/test_metrics.py diff --git a/fusilli/eval.py b/fusilli/eval.py index 322ba387..5bb9c13b 100644 --- a/fusilli/eval.py +++ b/fusilli/eval.py @@ -76,13 +76,11 @@ def get_kfold_data_from_model(cls, model_list): val_preds = [] val_logits = [] - metric_names = [ - model_list[0].metrics[model_list[0].model.prediction_task][i]["name"] - for i in range(2) - ] + metric_names = list(model_list[0].metrics.keys()) - # dictionary to store the metrics for each fold - metrics_per_fold = {metric_names[0]: [], metric_names[1]: []} + metrics_per_fold = {} + for metric_name in metric_names: + metrics_per_fold[metric_name.lower()] = [] # loop through the folds for fold in model_list: # 0 is the model, 1 is the ckpt path @@ -94,8 +92,8 @@ def get_kfold_data_from_model(cls, model_list): val_logits.append(fold.val_logits.cpu()) # get the metrics - metrics_per_fold[metric_names[0]].append(fold.metric1) - metrics_per_fold[metric_names[1]].append(fold.metric2) + for i, metric in enumerate(fold.final_val_metrics): + metrics_per_fold[metric_names[i].lower()].append(metric) # concatenate the validation data points for the overall kfold performance all_val_reals = torch.cat(val_reals, dim=-1) @@ -105,20 +103,14 @@ def get_kfold_data_from_model(cls, model_list): # get the overall kfold metrics overall_kfold_metrics = {} - for metric in model_list[0].metrics[ - model_list[0].model.prediction_task - ]: # loop through the metrics - if "auroc" in metric["name"]: - predicted = all_val_logits # AUROC needs logits - else: - predicted = all_val_preds - - val_step_acc = metric["metric"]( - model_list[0].safe_squeeze(predicted), - model_list[0].safe_squeeze(all_val_reals), + for metric_name, metric_func in model_list[0].metrics.items(): + val_metric = metric_func( + preds=model_list[0].safe_squeeze(all_val_preds), + labels=model_list[0].safe_squeeze(all_val_reals), + logits=model_list[0].safe_squeeze(all_val_logits), ) - overall_kfold_metrics[metric["name"]] = val_step_acc.cpu().detach().item() + overall_kfold_metrics[metric_name.lower()] = val_metric.cpu().detach().item() return ( train_reals, @@ -172,10 +164,9 @@ def get_tt_data_from_model(cls, model_list): val_preds = model.val_preds.cpu() # metrics - metric_values = { - model.metrics[model.model.prediction_task][0]["name"]: model.metric1, - model.metrics[model.model.prediction_task][1]["name"]: model.metric2, - } + metric_values = {} + for i, metric in enumerate(model.metrics): + metric_values[metric] = model.final_val_metrics[i] return train_reals, train_preds, val_reals, val_preds, metric_values @@ -237,13 +228,12 @@ def get_new_kfold_data( val_preds = [] val_logits = [] - metric_names = [ - model_list[0].metrics[model_list[0].model.prediction_task][i]["name"] - for i in range(2) - ] + metric_names = list(model_list[0].metrics.keys()) # dictionary to store the metrics for each fold - metrics_per_fold = {metric_names[0]: [], metric_names[1]: []} + metrics_per_fold = {} + for metric_name in metric_names: + metrics_per_fold[metric_name.lower()] = [] output_paths_copy = output_paths.copy() @@ -317,6 +307,7 @@ def get_new_kfold_data( data_dims=dm.data_dims, # data_dims is a list of tuples multiclass_dimensions=dm.multiclass_dimensions, ), + metrics_list=model.metrics_list, ) # modify layers if needed @@ -350,21 +341,19 @@ def get_new_kfold_data( val_reals.append(fold_val_reals) val_preds.append(fold_val_preds) val_logits.append(fold_val_logits) + + # training data points from the old trained BaseModel train_reals.append(model.train_reals.cpu().detach()) train_preds.append(model.train_preds.cpu().detach()) - for metric in model.metrics[model.model.prediction_task]: # loop - if "auroc" in metric["name"]: - predicted = fold_val_logits - else: - predicted = fold_val_preds - - val_step_acc = metric["metric"]( - model.safe_squeeze(predicted), - model.safe_squeeze(fold_val_reals), + for metric_name, metric_func in new_model.metrics.items(): + val_step_metric = metric_func( + preds=model_list[0].safe_squeeze(fold_val_preds), + labels=model_list[0].safe_squeeze(fold_val_reals), + logits=model_list[0].safe_squeeze(fold_val_logits), ) - metrics_per_fold[metric["name"]].append(val_step_acc) + metrics_per_fold[metric_name.lower()].append(val_step_metric) # concatenate the validation data points for the overall kfold performance all_val_reals = torch.cat(val_reals, dim=-1) @@ -374,20 +363,14 @@ def get_new_kfold_data( # get the overall kfold metrics overall_kfold_metrics = {} - for metric in model_list[0].metrics[ - model_list[0].model.prediction_task - ]: # loop through the metrics - if "auroc" in metric["name"]: - predicted = all_val_logits - else: - predicted = all_val_preds - - val_step_acc = metric["metric"]( - model_list[0].safe_squeeze(predicted), - model_list[0].safe_squeeze(all_val_reals), + for metric_name, metric_func in new_model.metrics.items(): + val_metric = metric_func( + preds=model_list[0].safe_squeeze(all_val_preds), + labels=model_list[0].safe_squeeze(all_val_reals), + logits=model_list[0].safe_squeeze(all_val_logits), ) - overall_kfold_metrics[metric["name"]] = val_step_acc.cpu().detach().item() + overall_kfold_metrics[metric_name.lower()] = val_metric.cpu().detach().item() return ( train_reals, @@ -502,6 +485,7 @@ def get_new_tt_data( data_dims=dm.data_dims, # data_dims is a list of tuples multiclass_dimensions=dm.multiclass_dimensions, ), + metrics_list=model.metrics_list, ) # modify layers if needed @@ -535,23 +519,18 @@ def get_new_tt_data( val_reals = torch.cat(reals_list, dim=-1) val_logits = torch.cat(logits_list, dim=0) - # metrics + # get the metrics metric_values = {} - for metric in new_model.metrics[ - new_model.model.prediction_task - ]: # loop through the metrics - if "auroc" in metric["name"]: - predicted = val_logits # AUROC needs logits - else: - predicted = val_preds - - metric_val = metric["metric"]( - new_model.safe_squeeze(predicted), - new_model.safe_squeeze(val_reals), + for metric_name, metric_func in new_model.metrics.items(): + print("metric_name", metric_name) + print("metric_func", metric_func) + val_step_metric = metric_func( + preds=new_model.safe_squeeze(val_preds), + labels=new_model.safe_squeeze(val_reals), + logits=new_model.safe_squeeze(val_logits), ) - - metric_values[metric["name"]] = metric_val + metric_values[metric_name.lower()] = val_step_metric return train_reals, train_preds, val_reals, val_preds, metric_values @@ -834,7 +813,7 @@ def reals_vs_preds_kfold( # set title of plot to the metric for the current fold ax1.set_title( - f"Fold {n + 1}: {metric_names[0]}={float(metrics_per_fold[metric_names[0]][n]):.3f}" + f"Fold {n + 1}: {metric_names[0]}={float(metrics_per_fold[metric_names[0].lower()][n]):.3f}" ) # set x and y labels @@ -1251,7 +1230,7 @@ def confusion_matrix_kfold( ax1.set_ylabel("Actuals", fontsize=10) ax1.set_title( - f"Fold {n + 1}:\n{metric_names[0]}={float(metrics_per_fold[metric_names[0]][n]):.3f}" + f"Fold {n + 1}:\n{metric_names[0]}={float(metrics_per_fold[metric_names[0].lower()][n]):.3f}" ) # gs.tight_layout(fig) @@ -1617,6 +1596,7 @@ def kfold_comparison_plot(cls, comparing_models_metrics): metric_1_values = np.array(metric_1_values)[sorted_indices].transpose() metric_2_values = np.array(metric_2_values)[sorted_indices].transpose() + # create figure 1x2 subplots # create figure 1x2 subplots fig, ax = plt.subplots(1, 2) ax[0].grid() @@ -1775,8 +1755,9 @@ def get_performance_dataframe( method_names = list( comparing_models_metrics.keys() ) # [method1name, method2name,...] - metric1name = list(comparing_models_metrics[method_names[0]].keys())[0] - metric2name = list(comparing_models_metrics[method_names[0]].keys())[1] + metric_names = list(comparing_models_metrics[method_names[0]].keys()) + # metric1name = list(comparing_models_metrics[method_names[0]].keys())[0] + # metric2name = list(comparing_models_metrics[method_names[0]].keys())[1] if kfold_flag: overall_kfold_metrics_copy = overall_kfold_metrics_dict.copy() @@ -1787,23 +1768,34 @@ def get_performance_dataframe( folds_df = pd.DataFrame(comparing_models_metrics).T.reset_index() folds_df.rename(columns={"index": "Method"}, inplace=True) - num_folds = len(folds_df[metric1name][0]) - fold_columns_metric1 = [ - f"fold{i + 1}_{metric1name}" for i in range(num_folds) - ] - fold_columns_metric2 = [ - f"fold{i + 1}_{metric2name}" for i in range(num_folds) - ] - - for i, col in enumerate(fold_columns_metric1): - folds_df[fold_columns_metric1[i]] = folds_df[metric1name].apply( - lambda x: x[i] if len(x) > i else None - ) - folds_df[fold_columns_metric2[i]] = folds_df[metric2name].apply( - lambda x: x[i] if len(x) > i else None - ) + num_folds = len(folds_df[metric_names[0]][0]) + + for metric_name in metric_names: + fold_columns = [ + f"fold{i + 1}_{metric_name}" for i in range(num_folds) + ] + + for i, col in enumerate(fold_columns): + folds_df[fold_columns[i]] = folds_df[metric_name].apply( + lambda x: x[i] if len(x) > i else None + ) - folds_df.drop(columns=[metric1name, metric2name], inplace=True) + # fold_columns_metric1 = [ + # f"fold{i + 1}_{metric1name}" for i in range(num_folds) + # ] + # fold_columns_metric2 = [ + # f"fold{i + 1}_{metric2name}" for i in range(num_folds) + # ] + + # for i, col in enumerate(fold_columns_metric1): + # folds_df[fold_columns_metric1[i]] = folds_df[metric1name].apply( + # lambda x: x[i] if len(x) > i else None + # ) + # folds_df[fold_columns_metric2[i]] = folds_df[metric2name].apply( + # lambda x: x[i] if len(x) > i else None + # ) + + folds_df.drop(columns=metric_names, inplace=True) folds_df.set_index("Method", inplace=True) final_df = pd.concat([df, folds_df], axis=1) diff --git a/fusilli/fusionmodels/base_model.py b/fusilli/fusionmodels/base_model.py index 019cb2d1..b355be2b 100644 --- a/fusilli/fusionmodels/base_model.py +++ b/fusilli/fusionmodels/base_model.py @@ -5,10 +5,11 @@ from typing import Any import lightning.pytorch as pl import torch -import torchmetrics as tm from torch import nn from torch.nn import functional as F +from fusilli.utils.metrics_utils import MetricsCalculator + class BaseModel(pl.LightningModule): """Base pytorch lightning model for all fusion models. @@ -25,6 +26,8 @@ class BaseModel(pl.LightningModule): Fusion model class. multiclass_dimensions : int Number of classes for multiclass prediction. Default is 3 for making the metrics dictionary. + self.metrics : dict + Dictionary of metrics, at least two. Key is the name and value is the function from MetricsCalculator. train_mask : tensor Mask for training data, used for the graph fusion methods instead of train/val split. Indicates which nodes are training nodes. @@ -64,12 +67,18 @@ class BaseModel(pl.LightningModule): Concatenated training preds for all batches. Accessed by Plotter class for plotting. """ - def __init__(self, model): + def __init__(self, model, metrics_list=None): """ Parameters ---------- model : class Fusion model class. + metrics_list : list or None + List of metrics to use for model evaluation. Default None. + If None, the metrics will be automatically selected based on the prediction task + (AUROC, accuracy for binary/multiclass, R2 and MAE for regression). + The first metric in the list will be used in the comparison evaluation figures to rank the models' performances. + Length must be 2 or more. Returns ------- @@ -77,7 +86,11 @@ def __init__(self, model): """ super().__init__() self.model = model - # self.prediction_task = model.prediction_task + + self.MetricsCalculator = MetricsCalculator(self) + self.metrics_list = metrics_list + self.set_metrics(metrics_list=metrics_list) + if self.model.prediction_task == "multiclass": self.multiclass_dimensions = model.multiclass_dimensions else: @@ -106,45 +119,10 @@ def __init__(self, model): "regression": lambda x: x, } - # metrics - self.metrics = { - "binary": [ - { - "metric": tm.AUROC(task="binary"), - "name": "binary_auroc", - }, # needs logits - {"metric": tm.Accuracy(task="binary"), "name": "binary_accuracy"}, - ], - "multiclass": [ - { - "metric": tm.AUROC( - task="multiclass", num_classes=self.multiclass_dimensions - ), - "name": "multiclass_auroc", # needs logits - }, - { - "metric": tm.Accuracy( - task="multiclass", num_classes=self.multiclass_dimensions, top_k=1 - ), - "name": "multiclass_accuracy" - # Add additional metrics for multiclass classification if needed - }, - ], - "regression": [ - { - "metric": tm.R2Score(), - "name": "R2" - # Add additional metrics for regression if needed - }, - {"metric": tm.MeanAbsoluteError(), "name": "MAE"}, - ], - } - if self.model.prediction_task not in self.metrics: + if self.model.prediction_task not in ["binary", "multiclass", "regression"]: raise ValueError(f"Unsupported prediction_task: {self.model.prediction_task}") - self.metric_names_list = [ - metric["name"] for metric in self.metrics[self.model.prediction_task] - ] + self.metric_names_list = list(self.metrics.keys()) # storing the final validation reals and preds self.batch_val_reals = [] @@ -183,6 +161,50 @@ def safe_squeeze(tensor): else: return tensor.squeeze(dim=0) + def set_metrics(self, metrics_list): + """ + Set what metrics will be used to log and plot. + If no metrics are passed, then the default metrics for the prediction task will be used. + + Parameters + ---------- + metrics_list : list or None + List of metrics to use for model evaluation. Default None. + If None, the metrics will be automatically selected based on the prediction task + (AUROC, accuracy for binary/multiclass, R2 and MAE for regression). + The first metric in the list will be used in the comparison evaluation figures to rank the models' performances. + Length must be 2 or more. + """ + + # If the list is None, use the default metrics + if metrics_list is None: + if self.model.prediction_task == "binary": + self.metrics = {"AUROC": self.MetricsCalculator.auroc, + "Accuracy": self.MetricsCalculator.accuracy} + elif self.model.prediction_task == "multiclass": + self.metrics = {"AUROC": self.MetricsCalculator.auroc, + "Accuracy": self.MetricsCalculator.accuracy} + elif self.model.prediction_task == "regression": + self.metrics = {"R2": self.MetricsCalculator.r2, + "MAE": self.MetricsCalculator.mae} + + # Error if list length is less than 2 + else: + if len(metrics_list) < 2: + raise ValueError("Length of metrics list must be 2 or more.") + + self.metrics = {} + + # Error if any of the metrics are not supported + for metric_string in metrics_list: + supported_metrics = [func for func in dir(self.MetricsCalculator) if + callable(getattr(self.MetricsCalculator, func)) and not func.startswith("__")] + if metric_string.lower() not in supported_metrics: # change this to be accurate + raise ValueError(f"Unsupported metric: {metric_string}") + + # Set the new metrics + self.metrics[metric_string] = getattr(self.MetricsCalculator, metric_string.lower()) + def get_data_from_batch(self, batch): """ Get data from batch. @@ -324,35 +346,30 @@ def training_step(self, batch, batch_idx): batch_size=x[0].shape[0], ) - for metric in self.metrics[self.model.prediction_task]: - if "auroc" in metric["name"]: - predicted = logits - else: - predicted = end_output - - if self.safe_squeeze(predicted).shape[0] == 1: + for metric_name, metric_func in self.metrics.items(): + if (self.safe_squeeze(end_output).shape[0] == 1) or (self.safe_squeeze(logits).shape[0] == 1): # if it's a single value, we can't calculate a metric pass + else: - train_step_acc = metric["metric"].to(self.device)( - self.safe_squeeze(predicted), - self.safe_squeeze(y[self.train_mask]) - # .squeeze(), # we can do self.train_mask even if it's None bc y is a tensor + train_step_metric = metric_func( + preds=self.safe_squeeze(end_output), + labels=self.safe_squeeze(y[self.train_mask]), + logits=self.safe_squeeze(logits), ) self.log( - metric["name"] + "_train", - train_step_acc, + metric_name + "_train", + train_step_metric, logger=True, on_epoch=True, on_step=False, batch_size=x[0].shape[0], ) - # Store real and predicted values for training self.batch_train_reals.append(self.safe_squeeze(y[self.train_mask]).detach()) - self.batch_train_preds.append(predicted.detach()) + self.batch_train_preds.append(end_output.detach()) self.batch_train_logits.append(logits.detach()) return loss @@ -419,20 +436,16 @@ def on_validation_epoch_end(self): except RuntimeError: # if we're doing graph-based fusion and train/test doesn't work the same as normal pass - for i, metric in enumerate(self.metrics[self.model.prediction_task]): - if "auroc" in metric["name"]: - predicted = self.val_logits - else: - predicted = self.val_preds - - val_step_acc = metric["metric"].to(self.device)( - self.safe_squeeze(predicted), - self.safe_squeeze(self.val_reals), - ) + for metric_name, metric_func in self.metrics.items(): + val_step_metric = metric_func( + preds=self.safe_squeeze(self.val_preds), + labels=self.safe_squeeze(self.val_reals), + logits=self.safe_squeeze(self.val_logits), + ).to(self.device) self.log( - metric["name"] + "_val", - val_step_acc, + metric_name + "_val", + val_step_metric, logger=True, on_epoch=True, batch_size=self.val_reals.shape[0], diff --git a/fusilli/train.py b/fusilli/train.py index 05a3a84b..1ac9f0dd 100644 --- a/fusilli/train.py +++ b/fusilli/train.py @@ -28,6 +28,7 @@ def train_and_test( wandb_logging=False, project_name=None, training_modifications=None, + metrics_list=None, ): """ Trains and tests a model and, if k_fold trained, a fold. @@ -69,6 +70,12 @@ def train_and_test( If None, the project name will be called "fusilli". training_modifications : dict Dictionary of training modifications. Used to modify the training process. Keys could be "accelerator", "devices" + metrics_list : list + List of metrics to use for model evaluation. Default None. + If None, the metrics will be automatically selected based on the prediction task + (AUROC, accuracy for binary/multiclass, R2 and MAE for regression). + The first metric in the list will be used in the comparison evaluation figures to rank the models' performances. + Length must be 2 or more. Returns ------- @@ -144,7 +151,8 @@ def train_and_test( prediction_task=data_module.prediction_task, data_dims=data_module.data_dims, # data_dims is a list of tuples multiclass_dimensions=data_module.multiclass_dimensions, - ) + ), + metrics_list=metrics_list, ) # modify model architecture if layer_mods is not None @@ -169,9 +177,8 @@ def train_and_test( trainer.validate(pl_model, val_dataloader) # get final validation metrics - metric_1, metric_2 = get_final_val_metrics(trainer) - pl_model.metric1 = metric_1 - pl_model.metric2 = metric_2 + final_val_metrics = get_final_val_metrics(trainer) + pl_model.final_val_metrics = final_val_metrics # if logger is CSVLogger, plot loss curve if isinstance(logger, CSVLogger): @@ -234,6 +241,7 @@ def train_and_save_models( enable_checkpointing=True, show_loss_plot=False, project_name=None, + metrics_list=None, ): """ Trains/tests the model and saves the trained model to a dictionary for further analysis. @@ -268,6 +276,12 @@ def train_and_save_models( project_name : str or None Name of the project to log to in Weights and Biases. Default None. If None, the project name will be called "fusilli". + metrics_list : list + List of metrics to use for model evaluation. Default None. + If None, the metrics will be automatically selected based on the prediction task + (AUROC, accuracy for binary/multiclass, R2 and MAE for regression). + The first metric in the list will be used in the comparison evaluation figures to rank the models' performances. + Length must be 2 or more. Returns ------- @@ -307,6 +321,7 @@ def train_and_save_models( show_loss_plot=show_loss_plot, wandb_logging=wandb_logging, project_name=project_name, + metrics_list=metrics_list, ) trained_models_list.append(trained_model) @@ -327,6 +342,7 @@ def train_and_save_models( show_loss_plot=show_loss_plot, wandb_logging=wandb_logging, project_name=project_name, + metrics_list=metrics_list, ) trained_models_list.append(trained_model) diff --git a/fusilli/utils/metrics_utils.py b/fusilli/utils/metrics_utils.py new file mode 100644 index 00000000..58093454 --- /dev/null +++ b/fusilli/utils/metrics_utils.py @@ -0,0 +1,329 @@ +""" +Calculates metrics of the models and houses list of the available metrics to use. +""" +import torch +import torchmetrics as tm + + +class MetricsCalculator: + """ + Calculates metrics of the models and houses list of the available metrics to use. + """ + + def __init__(self, base_model_instance): + """ + + Parameters + ---------- + base_model_instance : fusilli.fusionmodels.base_model.BaseModel + Instance of the base model. Has information on the prediction task and multiclass dimensions if applicable. + """ + self.model = base_model_instance + self.prediction_task = base_model_instance.model.prediction_task + + def auroc(self, preds, labels, logits): + """ + Area under the receiver operating characteristic curve. + + Parameters + ---------- + preds : torch.Tensor + Predicted values from the model. + labels : torch.Tensor + True labels. + logits : torch.Tensor + Probability values from the model. + + Returns + ------- + float + AUROC value. + """ + + if self.prediction_task == "binary": + auroc_equation = tm.AUROC(task="binary") + elif self.prediction_task == "multiclass": + auroc_equation = tm.AUROC(num_classes=self.model.multiclass_dimensions, task="multiclass") + else: + raise ValueError("Invalid prediction task for AUROC.") + + return auroc_equation(logits, labels) + + def accuracy(self, preds, labels, logits): + """ + Calculates accuracy. + + Parameters + ---------- + preds : torch.Tensor + Predicted values from the model. + labels : torch.Tensor + True labels. + logits : torch.Tensor + Probability values from the model. + + Returns + ------- + float + Accuracy value. + + """ + + if self.prediction_task == "binary": + # do binary accuracy + accuracy_equation = tm.Accuracy(task="binary") + + elif self.prediction_task == "multiclass": + # do multiclass accuracy + accuracy_equation = tm.Accuracy(num_classes=self.model.multiclass_dimensions, task="multiclass", top_k=1) + else: + raise ValueError("Invalid prediction task for accuracy.") + + return accuracy_equation(preds, labels) + + def r2(self, preds, labels, logits): + """ + Calculates R2 score. + + Parameters + ---------- + preds : torch.Tensor + Predicted values from the model. + labels : torch.Tensor + True labels. + logits : torch.Tensor + Probability values from the model. + + Returns + ------- + float + R2 score value. + + """ + + if self.prediction_task != "regression": + raise ValueError("Invalid prediction task for R2.") + + return tm.R2Score()(preds, labels) + + def mse(self, preds, labels, logits): + """ + Calculates mean squared error. + + Parameters + ---------- + preds : torch.Tensor + Predicted values from the model. + labels : torch.Tensor + True labels. + logits : torch.Tensor + Probability values from the model. + + Returns + ------- + float + MSE value. + + """ + if self.prediction_task != "regression": + raise ValueError("Invalid prediction task for mse.") + + return tm.MeanSquaredError()(preds, labels) + + def mae(self, preds, labels, logits): + """ + Calculates mean absolute error. + + Parameters + ---------- + preds : torch.Tensor + Predicted values from the model. + labels : torch.Tensor + True labels. + logits : torch.Tensor + Probability values from the model. + + Returns + ------- + float + MAE value. + + """ + + if self.prediction_task != "regression": + raise ValueError("Invalid prediction task for mae.") + + return tm.MeanAbsoluteError()(preds, labels) + + def recall(self, preds, labels, logits): + """ + Calculates recall. This is equivalent to sensitivity. + + Parameters + ---------- + preds : torch.Tensor + Predicted values from the model. + labels : torch.Tensor + True labels. + logits : torch.Tensor + Probability values from the model. + + Returns + ------- + float + Recall value. + + """ + + if self.prediction_task == "binary": + recall_equation = tm.Recall(task="binary") + elif self.prediction_task == "multiclass": + recall_equation = tm.Recall(num_classes=self.model.multiclass_dimensions, task="multiclass") + else: + raise ValueError("Invalid prediction task for recall.") + + return recall_equation(preds, labels) + + def specificity(self, preds, labels, logits): + """ + Calculates specificity. + + Parameters + ---------- + preds : torch.Tensor + Predicted values from the model. + labels : torch.Tensor + True labels. + logits : torch.Tensor + Probability values from the model. + + Returns + ------- + float + Specificity value. + + """ + + if self.prediction_task == "binary": + specificity_equation = tm.Specificity(task="binary") + elif self.prediction_task == "multiclass": + specificity_equation = tm.Specificity(num_classes=self.model.multiclass_dimensions, task="multiclass") + else: + raise ValueError("Invalid prediction task for specificity.") + + return specificity_equation(preds, labels) + + def precision(self, preds, labels, logits): + """ + Calculates precision. + + Parameters + ---------- + preds : torch.Tensor + Predicted values from the model. + labels : torch.Tensor + True labels. + logits : torch.Tensor + Probability values from the model. + + Returns + ------- + float + Precision value. + + """ + + if self.prediction_task == "binary": + precision_equation = tm.Precision(task="binary") + elif self.prediction_task == "multiclass": + precision_equation = tm.Precision(num_classes=self.model.multiclass_dimensions, task="multiclass") + else: + raise ValueError("Invalid prediction task for precision.") + + return precision_equation(preds, labels) + + def f1(self, preds, labels, logits): + """ + Calculates F1 score. This is equivalent to the Dice coefficient. + + Parameters + ---------- + preds : torch.Tensor + Predicted values from the model. + labels : torch.Tensor + True labels. + logits : torch.Tensor + Probability values from the model. + + Returns + ------- + float + F1 score value. + + """ + + if self.prediction_task == "binary": + f1_equation = tm.F1Score(task="binary") + elif self.prediction_task == "multiclass": + f1_equation = tm.F1Score(num_classes=self.model.multiclass_dimensions, task="multiclass") + else: + raise ValueError("Invalid prediction task for F1.") + + return f1_equation(preds, labels) + + def auprc(self, preds, labels, logits): + """ + Calculates area under the precision-recall curve. + + Parameters + ---------- + preds : torch.Tensor + Predicted values from the model. + labels : torch.Tensor + True labels. + logits : torch.Tensor + Probability values from the model. + + Returns + ------- + float + AUPRC value. + """ + + if self.prediction_task == "binary": + auprc_equation = tm.AveragePrecision(task="binary") + elif self.prediction_task == "multiclass": + auprc_equation = tm.AveragePrecision(num_classes=self.model.multiclass_dimensions, task="multiclass") + else: + raise ValueError("Invalid prediction task for AUPRC.") + + return auprc_equation(logits, labels) + + def balanced_accuracy(self, preds, labels, logits): + """ + Calculates balanced accuracy. + + Parameters + ---------- + preds : torch.Tensor + Predicted values from the model. + labels : torch.Tensor + True labels. + logits : torch.Tensor + Probability values from the model. + + Returns + ------- + float + Balanced accuracy value. + """ + + if self.prediction_task == "binary": + balanced_accuracy_equation = tm.Accuracy(task='multiclass', num_classes=2, average='macro') + elif self.prediction_task == "multiclass": + balanced_accuracy_equation = tm.Accuracy(task='multiclass', num_classes=self.model.multiclass_dimensions, + average='macro') + else: + raise ValueError("Invalid prediction task for balanced accuracy.") + + return balanced_accuracy_equation(preds, labels) diff --git a/fusilli/utils/training_utils.py b/fusilli/utils/training_utils.py index 730ace93..132a430c 100644 --- a/fusilli/utils/training_utils.py +++ b/fusilli/utils/training_utils.py @@ -436,17 +436,15 @@ def get_final_val_metrics(trainer): if len(trainer.callback_metrics) == 0: raise ValueError("trainer.callback_metrics is empty.") - # raise error if metric_names[0]_val or metric_names[1]_val is not in trainer.callback_metrics - if f"{metric_names[0]}_val" not in trainer.callback_metrics.keys(): - raise ValueError( - f"{metric_names[0]}_val not in trainer.callback_metrics.keys()." - ) - if f"{metric_names[1]}_val" not in trainer.callback_metrics.keys(): - raise ValueError( - f"{metric_names[1]}_val not in trainer.callback_metrics.keys()." - ) + metrics = [] + + # raise error if any of the metric_names are not in trainer.callback_metrics + for metric_name in metric_names: + if f"{metric_name}_val" not in trainer.callback_metrics.keys(): + raise ValueError( + f"{metric_name}_val not in trainer.callback_metrics.keys()." + ) - metric1 = trainer.callback_metrics[f"{metric_names[0]}_val"].item() - metric2 = trainer.callback_metrics[f"{metric_names[1]}_val"].item() + metrics.append(trainer.callback_metrics[f"{metric_name}_val"].item()) - return metric1, metric2 + return metrics diff --git a/tests/test_eval/test_ModelComparison.py b/tests/test_eval/test_ModelComparison.py index 357fb0a2..66766955 100644 --- a/tests/test_eval/test_ModelComparison.py +++ b/tests/test_eval/test_ModelComparison.py @@ -162,7 +162,7 @@ def test_get_performance_dataframe_train_test(): # Check that the resulting DataFrame has the expected structure assert isinstance(df, pd.DataFrame) assert "Method" in df.index.name - assert "Metric1" in df.columns + assert "Metric1" in df.columns # because of the .lower()s assert "Metric2" in df.columns # Check that the values in the DataFrame match the input data diff --git a/tests/test_models/test_BaseModel.py b/tests/test_models/test_BaseModel.py index 63bec1c4..d4d28a51 100644 --- a/tests/test_models/test_BaseModel.py +++ b/tests/test_models/test_BaseModel.py @@ -240,9 +240,9 @@ def test_get_model_outputs_and_loss_graph(sample_graph_model): def test_metrics_exist(sample_model): model = sample_model - for metric in model.metrics["binary"]: - assert "metric" in metric - assert "name" in metric + + assert isinstance(model.metrics, dict) + assert len(model.metrics) >= 2 @pytest.mark.filterwarnings("ignore:.*You are trying to `self.log()`*.", diff --git a/tests/test_pipeline/test_kfold.py b/tests/test_pipeline/test_kfold.py index ed5f19f6..88aed8f0 100644 --- a/tests/test_pipeline/test_kfold.py +++ b/tests/test_pipeline/test_kfold.py @@ -12,7 +12,7 @@ @pytest.mark.filterwarnings("ignore:.*No positive samples in targets,*.") @pytest.mark.filterwarnings("ignore:.*No negative samples in targets,*.") @pytest.mark.filterwarnings("ignore:.*exists and is not empty*.") -def test_train_and_test(create_test_files, tmp_path): +def test_5fold_cv(create_test_files, tmp_path): model_conditions = {"modality_type": "all", } tabular1_csv = create_test_files["tabular1_csv"] @@ -58,6 +58,8 @@ def test_train_and_test(create_test_files, tmp_path): "losses": str(loss_log_dir), } + new_metrics = ["accuracy", "precision", "recall", "f1", "auroc", "auprc", "balanced_accuracy"] + fusion_models = import_chosen_fusion_models(model_conditions, skip_models=["MCVAE_tab"]) for model in fusion_models: @@ -76,6 +78,7 @@ def test_train_and_test(create_test_files, tmp_path): enable_checkpointing=False, layer_mods=modifications, wandb_logging=False, + metrics_list=new_metrics, ) assert single_model_list is not None diff --git a/tests/test_pipeline/test_traintest.py b/tests/test_pipeline/test_traintest.py index b2addcac..32cb9dab 100644 --- a/tests/test_pipeline/test_traintest.py +++ b/tests/test_pipeline/test_traintest.py @@ -62,6 +62,8 @@ def test_train_and_test(create_test_files, tmp_path): "AttentionAndSelfActivation": {"attention_reduction_ratio": 2} } + new_metrics = ["accuracy", "precision", "recall", "f1", "auroc", "auprc", "balanced_accuracy"] + for model in fusion_models: dm = prepare_fusion_data(fusion_model=model, data_paths=data_paths, @@ -79,6 +81,7 @@ def test_train_and_test(create_test_files, tmp_path): enable_checkpointing=False, wandb_logging=False, layer_mods=modifications, + metrics_list=new_metrics, ) trained_model = single_model_list[0] diff --git a/tests/test_utils/__init__.py b/tests/test_utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_utils/test_metrics.py b/tests/test_utils/test_metrics.py new file mode 100644 index 00000000..ea8a2221 --- /dev/null +++ b/tests/test_utils/test_metrics.py @@ -0,0 +1,187 @@ +""" +Testing modifying metrics +""" +import pytest +from fusilli.data import prepare_fusion_data +from fusilli.train import train_and_save_models +from fusilli.utils.model_chooser import import_chosen_fusion_models +from fusilli.eval import ConfusionMatrix, RealsVsPreds +from ..test_data.test_TrainTestDataModule import create_test_files +from datetime import datetime + +binary_metrics = ["auroc", "accuracy", "recall", "specificity", "precision", "f1", "auprc", "balanced_accuracy"] + +regression_metrics = ["r2", "mae", "mse"] + + +@pytest.mark.filterwarnings("ignore:.*does not have many workers*.", ) +@pytest.mark.filterwarnings("ignore:.*The number of training batches*.") +@pytest.mark.filterwarnings("ignore:.*No positive samples in targets,*.") +@pytest.mark.filterwarnings("ignore:.*No negative samples in targets,*.") +@pytest.mark.filterwarnings("ignore:.*exists and is not empty*.") +@pytest.mark.parametrize("metric", binary_metrics) +def test_regression_metrics_for_classification(metric, create_test_files, tmp_path): + model_conditions = {"class_name": "ConcatTabularData"} + fusion_models = import_chosen_fusion_models(model_conditions, skip_models=["MCVAE_tab"]) + + tabular1_csv = create_test_files["tabular1_csv"] + tabular2_csv = create_test_files["tabular2_csv"] + image_torch_file_2d = create_test_files["image_torch_file_2d"] + + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + + loss_log_dir = tmp_path / f"loss_log_dir_{timestamp}" + loss_log_dir.mkdir() + + local_fig_path = tmp_path / f"local_fig_path_{timestamp}" + local_fig_path.mkdir() + loss_fig_path = local_fig_path / "losses" + loss_fig_path.mkdir() + + checkpoint_dir = tmp_path / f"checkpoint_dir_{timestamp}" + checkpoint_dir.mkdir() + + data_paths = { + "tabular1": tabular1_csv, + "tabular2": tabular2_csv, + "image": image_torch_file_2d, + } + + output_paths = { + "checkpoints": str(checkpoint_dir), + "figures": str(local_fig_path), + "losses": str(loss_log_dir), + } + + new_metrics = ["r2", metric] + + dm = prepare_fusion_data(prediction_task="regression", + fusion_model=fusion_models[0], + data_paths=data_paths, + output_paths=output_paths, + ) + + # raises error + with pytest.raises(ValueError, match=r"Invalid prediction task for."): + single_model_list = train_and_save_models( + data_module=dm, + fusion_model=fusion_models[0], + max_epochs=2, + enable_checkpointing=False, + wandb_logging=False, + metrics_list=new_metrics, + ) + + +# error when trying to use classification metrics for regression +@pytest.mark.filterwarnings("ignore:.*does not have many workers*.", ) +@pytest.mark.filterwarnings("ignore:.*The number of training batches*.") +@pytest.mark.filterwarnings("ignore:.*No positive samples in targets,*.") +@pytest.mark.filterwarnings("ignore:.*No negative samples in targets,*.") +@pytest.mark.filterwarnings("ignore:.*exists and is not empty*.") +@pytest.mark.parametrize("metric", regression_metrics) +def test_binary_metrics_for_regression(metric, create_test_files, tmp_path): + model_conditions = {"class_name": "ConcatTabularData"} + fusion_models = import_chosen_fusion_models(model_conditions, skip_models=["MCVAE_tab"]) + + tabular1_csv = create_test_files["tabular1_csv"] + tabular2_csv = create_test_files["tabular2_csv"] + image_torch_file_2d = create_test_files["image_torch_file_2d"] + + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + + loss_log_dir = tmp_path / f"loss_log_dir_{timestamp}" + loss_log_dir.mkdir() + + local_fig_path = tmp_path / f"local_fig_path_{timestamp}" + local_fig_path.mkdir() + loss_fig_path = local_fig_path / "losses" + loss_fig_path.mkdir() + + checkpoint_dir = tmp_path / f"checkpoint_dir_{timestamp}" + checkpoint_dir.mkdir() + + data_paths = { + "tabular1": tabular1_csv, + "tabular2": tabular2_csv, + "image": image_torch_file_2d, + } + + output_paths = { + "checkpoints": str(checkpoint_dir), + "figures": str(local_fig_path), + "losses": str(loss_log_dir), + } + + new_metrics = ["auroc", metric] + + dm = prepare_fusion_data(prediction_task="binary", + fusion_model=fusion_models[0], + data_paths=data_paths, + output_paths=output_paths, + ) + + # raises error + with pytest.raises(ValueError, match=r"Invalid prediction task for."): + single_model_list = train_and_save_models( + data_module=dm, + fusion_model=fusion_models[0], + max_epochs=2, + enable_checkpointing=False, + wandb_logging=False, + metrics_list=new_metrics, + ) + + +# error when only providing one metric +def test_only_one_metric(create_test_files, tmp_path): + model_conditions = {"class_name": "ConcatTabularData"} + fusion_models = import_chosen_fusion_models(model_conditions, skip_models=["MCVAE_tab"]) + + tabular1_csv = create_test_files["tabular1_csv"] + tabular2_csv = create_test_files["tabular2_csv"] + image_torch_file_2d = create_test_files["image_torch_file_2d"] + + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + + loss_log_dir = tmp_path / f"loss_log_dir_{timestamp}" + loss_log_dir.mkdir() + + local_fig_path = tmp_path / f"local_fig_path_{timestamp}" + local_fig_path.mkdir() + loss_fig_path = local_fig_path / "losses" + loss_fig_path.mkdir() + + checkpoint_dir = tmp_path / f"checkpoint_dir_{timestamp}" + checkpoint_dir.mkdir() + + data_paths = { + "tabular1": tabular1_csv, + "tabular2": tabular2_csv, + "image": image_torch_file_2d, + } + + output_paths = { + "checkpoints": str(checkpoint_dir), + "figures": str(local_fig_path), + "losses": str(loss_log_dir), + } + + new_metrics = ["auroc"] + + dm = prepare_fusion_data(prediction_task="binary", + fusion_model=fusion_models[0], + data_paths=data_paths, + output_paths=output_paths, + ) + + # raises error + with pytest.raises(ValueError, match=r"Length of metrics list must be 2 or more."): + single_model_list = train_and_save_models( + data_module=dm, + fusion_model=fusion_models[0], + max_epochs=2, + enable_checkpointing=False, + wandb_logging=False, + metrics_list=new_metrics, + ) From 007a89b3fd12f933675aae28e72a1fae3ab670e0 Mon Sep 17 00:00:00 2001 From: Florence Townend Date: Thu, 11 Jan 2024 11:18:33 +0000 Subject: [PATCH 2/4] added metric choices to docs, separated some of the sphinx gallery examples out --- docs/__init__.py | 0 docs/computergif.gif | Bin 214383 -> 0 bytes docs/conf.py | 1 + ...parameters.py => customising_training.rst} | 75 ++++++++++++++++-- .../examples/customising_behaviour/README.rst | 6 +- docs/examples/model_comparison/README.rst | 4 + .../plot_model_comparison_loop_kfold.py | 0 .../plot_two_models_traintest.py | 0 docs/examples/training_and_testing/README.rst | 6 +- docs/index.rst | 1 + docs/quick_start.rst | 6 +- fusilli/eval.py | 17 ---- fusilli/fusionmodels/base_model.py | 2 +- tests/test_utils/test_metrics.py | 54 +++++++++++++ 14 files changed, 141 insertions(+), 31 deletions(-) create mode 100644 docs/__init__.py delete mode 100644 docs/computergif.gif rename docs/{examples/customising_behaviour/customising_training_parameters.py => customising_training.rst} (55%) create mode 100644 docs/examples/model_comparison/README.rst rename docs/examples/{training_and_testing => model_comparison}/plot_model_comparison_loop_kfold.py (100%) rename docs/examples/{training_and_testing => model_comparison}/plot_two_models_traintest.py (100%) diff --git a/docs/__init__.py b/docs/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/docs/computergif.gif b/docs/computergif.gif deleted file mode 100644 index 7a4a111807f7978b04f479b9061f08846643d3db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214383 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�un33B-yl{_(Ln$!powChND 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%0A!+eB<&`UMhd7eK8Q+vd_&U1wc40EhJa$8(LE6RF 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

RvIfg0UU7*}D-&Ey}Kn*RwvX(F= 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 QNR#oow|jOzfPer1JKx%bQ~&?~ diff --git a/docs/conf.py b/docs/conf.py index e0bdbf69..4c4845a3 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -112,6 +112,7 @@ [ "examples/customising_behaviour", "examples/training_and_testing", + "examples/model_comparison", ], ), "within_subsection_order": FileNameSortKey, diff --git a/docs/examples/customising_behaviour/customising_training_parameters.py b/docs/customising_training.rst similarity index 55% rename from docs/examples/customising_behaviour/customising_training_parameters.py rename to docs/customising_training.rst index 31dacf66..b41c72c1 100644 --- a/docs/examples/customising_behaviour/customising_training_parameters.py +++ b/docs/customising_training.rst @@ -1,12 +1,12 @@ -""" -How to customise the training in Fusilli -######################################### +Customising training and evaluation +========================================= -This tutorial will show you how to customise the training of your fusion model. +This page will show you how to customise the training and evaluation of your fusion models. We will cover the following topics: * Early stopping +* Valildation metrics * Batch size * Number of epochs * Checkpoint suffix modification @@ -53,6 +53,68 @@ ----- +Choosing metrics +----------------- + +By default, Fusilli uses the following metrics for each prediction task: + +* Binary classification: `Area under the ROC curve`_ and `accuracy`_ +* Multiclass classification: `Area under the ROC curve`_ and `accuracy`_ +* Regression: `R2 score`_ and `mean absolute error`_ + +You can change the metrics used by passing a list of metrics to the ``metrics_list`` argument in the :func:`~.fusilli.train.train_and_save_models` function. +For example, if you wanted to change the metrics used for a binary classification task to precision, recall, and area under the precision-recall curve, you could do the following: + +.. code-block:: python + + new_metrics_list = ["precision", "recall", "auprc"] + + trained_model = train_and_save_models( + data_module=datamodule, + fusion_model=example_model, + metrics_list=new_metrics_list, + ) + +Here are the supported metrics as of Fusilli v1.2.0: + +**Regression**: + +* `R2 score`_: ``r2`` +* `Mean absolute error`_: ``mae`` +* `Mean squared error`_: ``mse`` + +**Binary or multiclass classification**: + +* `Area under the ROC curve`_: ``auroc`` +* `Accuracy`_: ``accuracy`` +* `Recall`_: ``recall`` +* `Specificity`_: ``specificity`` +* `Precision`_: ``precision`` +* `F1 score`_: ``f1`` +* `Area under the precision-recall curve`_: ``auprc`` +* `Balanced accuracy`_: ``balanced_accuracy`` + +If you'd like to add more metrics to fusilli, then please open an issue on the `Fusilli GitHub repository issues page `_ or submit a pull request. +The metrics are calculated in :class:`~.fusilli.utils.metrics_utils.MetricsCalculator`, with a separate method for each metric. + +**Using your own custom metric:** + +You can access the validation labels and validation predictions/probabilities from the trained model that is returned by the :func:`~.fusilli.train.train_and_save_models` function. +If you'd like to use your own custom metric without adding it to fusilli, then you can calculate it using the validation labels and predictions/probabilities. + +.. note:: + + The first metric in the metrics list is used to rank the models in the model comparison evaluation figures. + Only the first two metrics will be shown in the model comparison figures. + The rest of the metrics will be shown in the model evaluation dataframe and printed out to the console during training. + +.. warning:: + + There must be at least two metrics in the metrics list. + +----- + + Batch size ---------- @@ -112,7 +174,7 @@ ----- -Checkpoint suffix modification +Checkpoint file names ------------------------------ By default, Fusilli saves the model checkpoints in the following format: @@ -156,5 +218,4 @@ .. note:: The ``extra_log_string_dict`` argument is also used to modify the logging behaviour of the model. For more information, see :ref:`wandb`. -""" -# sphinx_gallery_thumbnail_path = '_static/pink_pasta_logo.png' + diff --git a/docs/examples/customising_behaviour/README.rst b/docs/examples/customising_behaviour/README.rst index c8c98efc..f562c4b5 100644 --- a/docs/examples/customising_behaviour/README.rst +++ b/docs/examples/customising_behaviour/README.rst @@ -6,5 +6,7 @@ Customising Fusilli These are examples showing how to get more in depth with Fusilli and customise its behaviour. * Modify the fusion model structures -* Change the training behaviour: early stopping, batch size, test set size, etc. -* Use Fusilli for hyperparameter tuning by adding suffixes to training outputs \ No newline at end of file + +.. note:: + + More examples to come throughout 2024. \ No newline at end of file diff --git a/docs/examples/model_comparison/README.rst b/docs/examples/model_comparison/README.rst new file mode 100644 index 00000000..7a707cdd --- /dev/null +++ b/docs/examples/model_comparison/README.rst @@ -0,0 +1,4 @@ +.. _advanced-examples: + +Comparing Models +======================================================= diff --git a/docs/examples/training_and_testing/plot_model_comparison_loop_kfold.py b/docs/examples/model_comparison/plot_model_comparison_loop_kfold.py similarity index 100% rename from docs/examples/training_and_testing/plot_model_comparison_loop_kfold.py rename to docs/examples/model_comparison/plot_model_comparison_loop_kfold.py diff --git a/docs/examples/training_and_testing/plot_two_models_traintest.py b/docs/examples/model_comparison/plot_two_models_traintest.py similarity index 100% rename from docs/examples/training_and_testing/plot_two_models_traintest.py rename to docs/examples/model_comparison/plot_two_models_traintest.py diff --git a/docs/examples/training_and_testing/README.rst b/docs/examples/training_and_testing/README.rst index 0170c6ed..12405c34 100644 --- a/docs/examples/training_and_testing/README.rst +++ b/docs/examples/training_and_testing/README.rst @@ -1,8 +1,12 @@ .. _train_test_examples: -Running Fusilli on your own data +Training and Testing Examples ========================================== These are examples of how to train and validate fusion models with Fusilli. +.. contents:: **Contents** + :local: + :depth: 1 + diff --git a/docs/index.rst b/docs/index.rst index 5cb112d1..999c11b1 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -53,6 +53,7 @@ Why would you want to use fusilli? choosing_model modifying_models + customising_training logging_with_wandb glossary diff --git a/docs/quick_start.rst b/docs/quick_start.rst index 49b0e08d..58968a10 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -22,7 +22,7 @@ Usage Example import matplotlib.pyplot as plt # Import the example fusion model - from fusilli.fusionmodels.tabularfusion.example_model import ExampleModel + from fusilli.fusionmodels.tabularfusion.concat_data import ConcatTabularData data_paths = { "tabular1": "path/to/tabular_1.csv", # Path to tabular dataset 1 @@ -38,13 +38,13 @@ Usage Example # Get the data module (PyTorch Lightning-compatible data structure) data_module = prepare_fusion_data(prediction_task="regression", - fusion_model=ExampleModel, + fusion_model=ConcatTabularData, data_paths=data_paths, output_paths=output_paths) # Train the model and receive a list with the trained model trained_model = train_and_save_models(data_module=data_module, - fusion_model=ExampleModel) + fusion_model=ConcatTabularData) # Evaluate the model by plotting the real values vs. predicted values RealsVsPreds_figure = RealsVsPreds.from_final_val_data(trained_model) diff --git a/fusilli/eval.py b/fusilli/eval.py index 5bb9c13b..8f562138 100644 --- a/fusilli/eval.py +++ b/fusilli/eval.py @@ -1756,8 +1756,6 @@ def get_performance_dataframe( comparing_models_metrics.keys() ) # [method1name, method2name,...] metric_names = list(comparing_models_metrics[method_names[0]].keys()) - # metric1name = list(comparing_models_metrics[method_names[0]].keys())[0] - # metric2name = list(comparing_models_metrics[method_names[0]].keys())[1] if kfold_flag: overall_kfold_metrics_copy = overall_kfold_metrics_dict.copy() @@ -1780,21 +1778,6 @@ def get_performance_dataframe( lambda x: x[i] if len(x) > i else None ) - # fold_columns_metric1 = [ - # f"fold{i + 1}_{metric1name}" for i in range(num_folds) - # ] - # fold_columns_metric2 = [ - # f"fold{i + 1}_{metric2name}" for i in range(num_folds) - # ] - - # for i, col in enumerate(fold_columns_metric1): - # folds_df[fold_columns_metric1[i]] = folds_df[metric1name].apply( - # lambda x: x[i] if len(x) > i else None - # ) - # folds_df[fold_columns_metric2[i]] = folds_df[metric2name].apply( - # lambda x: x[i] if len(x) > i else None - # ) - folds_df.drop(columns=metric_names, inplace=True) folds_df.set_index("Method", inplace=True) diff --git a/fusilli/fusionmodels/base_model.py b/fusilli/fusionmodels/base_model.py index b355be2b..62de4d16 100644 --- a/fusilli/fusionmodels/base_model.py +++ b/fusilli/fusionmodels/base_model.py @@ -200,7 +200,7 @@ def set_metrics(self, metrics_list): supported_metrics = [func for func in dir(self.MetricsCalculator) if callable(getattr(self.MetricsCalculator, func)) and not func.startswith("__")] if metric_string.lower() not in supported_metrics: # change this to be accurate - raise ValueError(f"Unsupported metric: {metric_string}") + raise ValueError(f"Unsupported metric: {metric_string}. Please choose from: {supported_metrics}") # Set the new metrics self.metrics[metric_string] = getattr(self.MetricsCalculator, metric_string.lower()) diff --git a/tests/test_utils/test_metrics.py b/tests/test_utils/test_metrics.py index ea8a2221..8d5d23ac 100644 --- a/tests/test_utils/test_metrics.py +++ b/tests/test_utils/test_metrics.py @@ -185,3 +185,57 @@ def test_only_one_metric(create_test_files, tmp_path): wandb_logging=False, metrics_list=new_metrics, ) + + +# error when only providing one metric +def test_unsupported_metric(create_test_files, tmp_path): + model_conditions = {"class_name": "ConcatTabularData"} + fusion_models = import_chosen_fusion_models(model_conditions, skip_models=["MCVAE_tab"]) + + tabular1_csv = create_test_files["tabular1_csv"] + tabular2_csv = create_test_files["tabular2_csv"] + image_torch_file_2d = create_test_files["image_torch_file_2d"] + + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + + loss_log_dir = tmp_path / f"loss_log_dir_{timestamp}" + loss_log_dir.mkdir() + + local_fig_path = tmp_path / f"local_fig_path_{timestamp}" + local_fig_path.mkdir() + loss_fig_path = local_fig_path / "losses" + loss_fig_path.mkdir() + + checkpoint_dir = tmp_path / f"checkpoint_dir_{timestamp}" + checkpoint_dir.mkdir() + + data_paths = { + "tabular1": tabular1_csv, + "tabular2": tabular2_csv, + "image": image_torch_file_2d, + } + + output_paths = { + "checkpoints": str(checkpoint_dir), + "figures": str(local_fig_path), + "losses": str(loss_log_dir), + } + + new_metrics = ["auroc", "unsupported_metric"] + + dm = prepare_fusion_data(prediction_task="binary", + fusion_model=fusion_models[0], + data_paths=data_paths, + output_paths=output_paths, + ) + + # raises error + with pytest.raises(ValueError, match=r"Unsupported metric: unsupported_metric."): + single_model_list = train_and_save_models( + data_module=dm, + fusion_model=fusion_models[0], + max_epochs=2, + enable_checkpointing=False, + wandb_logging=False, + metrics_list=new_metrics, + ) From 64b9e37bb14f656bde29d60540a4ee278272c4fc Mon Sep 17 00:00:00 2001 From: Florence Townend Date: Thu, 11 Jan 2024 11:46:55 +0000 Subject: [PATCH 3/4] debugging docs rearranging --- docs/customising_training.rst | 34 ++++++++++++++++-------------- docs/index.rst | 1 + fusilli/fusionmodels/base_model.py | 8 ++++--- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/docs/customising_training.rst b/docs/customising_training.rst index b41c72c1..ea47c558 100644 --- a/docs/customising_training.rst +++ b/docs/customising_training.rst @@ -1,4 +1,4 @@ -Customising training and evaluation +Customising Training ========================================= This page will show you how to customise the training and evaluation of your fusion models. @@ -58,9 +58,9 @@ Choosing metrics By default, Fusilli uses the following metrics for each prediction task: -* Binary classification: `Area under the ROC curve`_ and `accuracy`_ -* Multiclass classification: `Area under the ROC curve`_ and `accuracy`_ -* Regression: `R2 score`_ and `mean absolute error`_ +* Binary classification: `Area under the ROC curve `_ and `accuracy `_ +* Multiclass classification: `Area under the ROC curve `_ and `accuracy `_ +* Regression: `R2 score `_ and `mean absolute error `_ You can change the metrics used by passing a list of metrics to the ``metrics_list`` argument in the :func:`~.fusilli.train.train_and_save_models` function. For example, if you wanted to change the metrics used for a binary classification task to precision, recall, and area under the precision-recall curve, you could do the following: @@ -79,28 +79,30 @@ Here are the supported metrics as of Fusilli v1.2.0: **Regression**: -* `R2 score`_: ``r2`` -* `Mean absolute error`_: ``mae`` -* `Mean squared error`_: ``mse`` +* `R2 score `_: ``r2`` +* `Mean absolute error `_: ``mae`` +* `Mean squared error `_: ``mse`` **Binary or multiclass classification**: -* `Area under the ROC curve`_: ``auroc`` -* `Accuracy`_: ``accuracy`` -* `Recall`_: ``recall`` -* `Specificity`_: ``specificity`` -* `Precision`_: ``precision`` -* `F1 score`_: ``f1`` -* `Area under the precision-recall curve`_: ``auprc`` -* `Balanced accuracy`_: ``balanced_accuracy`` +* `Area under the ROC curve `_: ``auroc`` +* `Accuracy `_: ``accuracy`` +* `Recall `_: ``recall`` +* `Specificity `_: ``specificity`` +* `Precision `_: ``precision`` +* `F1 score `_: ``f1`` +* `Area under the precision-recall curve `_: ``auprc`` +* `Balanced accuracy `_: ``balanced_accuracy`` If you'd like to add more metrics to fusilli, then please open an issue on the `Fusilli GitHub repository issues page `_ or submit a pull request. The metrics are calculated in :class:`~.fusilli.utils.metrics_utils.MetricsCalculator`, with a separate method for each metric. **Using your own custom metric:** -You can access the validation labels and validation predictions/probabilities from the trained model that is returned by the :func:`~.fusilli.train.train_and_save_models` function. If you'd like to use your own custom metric without adding it to fusilli, then you can calculate it using the validation labels and predictions/probabilities. +You can access the validation labels and validation predictions/probabilities from the trained model that is returned by the :func:`~.fusilli.train.train_and_save_models` function. +Look at :class:`~.fusilli.fusionmodels.base_model.BaseModel` for a list of attributes that are available to you to access. + .. note:: diff --git a/docs/index.rst b/docs/index.rst index 999c11b1..a285693d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -64,6 +64,7 @@ Why would you want to use fusilli? :caption: ๐ŸŒธ Tutorials ๐ŸŒธ auto_examples/training_and_testing/index + auto_examples/model_comparison/index auto_examples/customising_behaviour/index ----- diff --git a/fusilli/fusionmodels/base_model.py b/fusilli/fusionmodels/base_model.py index 62de4d16..3457b6b7 100644 --- a/fusilli/fusionmodels/base_model.py +++ b/fusilli/fusionmodels/base_model.py @@ -26,8 +26,12 @@ class BaseModel(pl.LightningModule): Fusion model class. multiclass_dimensions : int Number of classes for multiclass prediction. Default is 3 for making the metrics dictionary. - self.metrics : dict + metrics : dict Dictionary of metrics, at least two. Key is the name and value is the function from MetricsCalculator. + metrics_list : list + List of strings of names of metrics to use for model evaluation. Default None. If None, the metrics will be + automatically selected based on the prediction task (AUROC, accuracy for binary/multiclass, R2 and MAE for + regression). train_mask : tensor Mask for training data, used for the graph fusion methods instead of train/val split. Indicates which nodes are training nodes. @@ -38,8 +42,6 @@ class BaseModel(pl.LightningModule): Dictionary of loss functions, one for each prediction type. output_activation_functions : dict Dictionary of output activation functions, one for each prediction type. - metrics : dict - Dictionary of metrics, two for each prediction type. batch_val_reals : list List of validation reals for each batch. Stored for later concatenation with rest of batches and access by Plotter class for plotting. From 0efbe2ea5cc3d37739ea35d02eab3619077066ae Mon Sep 17 00:00:00 2001 From: Florence Townend Date: Thu, 11 Jan 2024 12:15:19 +0000 Subject: [PATCH 4/4] added one more example on train test regression --- .../plot_model_comparison_loop_kfold.py | 4 +- docs/examples/training_and_testing/README.rst | 2 +- .../plot_one_model_binary_kfold.py | 2 +- .../plot_one_model_regression_traintest.py | 148 ++++++++++++++++++ docs/installation.rst | 3 + docs/quick_start.rst | 6 + 6 files changed, 161 insertions(+), 4 deletions(-) create mode 100644 docs/examples/training_and_testing/plot_one_model_regression_traintest.py diff --git a/docs/examples/model_comparison/plot_model_comparison_loop_kfold.py b/docs/examples/model_comparison/plot_model_comparison_loop_kfold.py index 640b9fb2..a82c8ce2 100644 --- a/docs/examples/model_comparison/plot_model_comparison_loop_kfold.py +++ b/docs/examples/model_comparison/plot_model_comparison_loop_kfold.py @@ -1,8 +1,8 @@ """ -Training multiple models in a loop: k-fold regression +Comparing All Fusion Models ==================================================================== -Welcome to the "Comparing Multiple K-Fold Trained Fusion Models" tutorial! In this tutorial, we'll explore how to train and compare multiple fusion models for a regression task using k-fold cross-validation with multimodal tabular data. This tutorial is designed to help you understand and implement key features, including: +Welcome to the "Comparing All Fusion Models" tutorial! In this tutorial, we'll explore how to train and compare multiple fusion models for a regression task using k-fold cross-validation with multimodal tabular data. This tutorial is designed to help you understand and implement key features, including: - ๐Ÿ“ฅ Importing fusion models based on modality types. - ๐Ÿšฒ Setting training parameters for your models diff --git a/docs/examples/training_and_testing/README.rst b/docs/examples/training_and_testing/README.rst index 12405c34..c756dcfa 100644 --- a/docs/examples/training_and_testing/README.rst +++ b/docs/examples/training_and_testing/README.rst @@ -1,6 +1,6 @@ .. _train_test_examples: -Training and Testing Examples +Training and Testing ========================================== These are examples of how to train and validate fusion models with Fusilli. diff --git a/docs/examples/training_and_testing/plot_one_model_binary_kfold.py b/docs/examples/training_and_testing/plot_one_model_binary_kfold.py index 9fb92d73..75d81456 100644 --- a/docs/examples/training_and_testing/plot_one_model_binary_kfold.py +++ b/docs/examples/training_and_testing/plot_one_model_binary_kfold.py @@ -1,5 +1,5 @@ """ -Binary Classification: Training a K-Fold Model +K-Fold Cross-Validation: Binary Classification ====================================================== ๐Ÿš€ In this tutorial, we'll explore binary classification using K-fold cross validation. diff --git a/docs/examples/training_and_testing/plot_one_model_regression_traintest.py b/docs/examples/training_and_testing/plot_one_model_regression_traintest.py new file mode 100644 index 00000000..08ab889d --- /dev/null +++ b/docs/examples/training_and_testing/plot_one_model_regression_traintest.py @@ -0,0 +1,148 @@ +""" +Train/Test split: Regression +====================================================== + +๐Ÿš€ In this tutorial, we'll explore regression using a train/test split. +Specifically, we're using the :class:`~.TabularCrossmodalMultiheadAttention` model. + + +Key Features: + +- ๐Ÿ“ฅ Importing a model based on its path. +- ๐Ÿงช Training and testing a model with train/test split. +- ๐Ÿ“ˆ Plotting the loss curves of each fold. +- ๐Ÿ“Š Visualising the results of a single train/test model using the :class:`~.RealsVsPreds` class. +""" + +import matplotlib.pyplot as plt +from tqdm.auto import tqdm +import os + +from docs.examples import generate_sklearn_simulated_data +from fusilli.data import prepare_fusion_data +from fusilli.eval import RealsVsPreds +from fusilli.train import train_and_save_models + +# sphinx_gallery_thumbnail_number = -1 + +# %% +# 1. Import the fusion model ๐Ÿ” +# -------------------------------- +# We're importing only one model for this example, the :class:`~.TabularCrossmodalMultiheadAttention` model. +# Instead of using the :func:`~fusilli.utils.model_chooser.import_chosen_fusion_models` function, we're importing the model directly like with any other library method. + + +from fusilli.fusionmodels.tabularfusion.crossmodal_att import ( + TabularCrossmodalMultiheadAttention, +) + +# %% +# 2. Set the training parameters ๐ŸŽฏ +# ----------------------------------- +# Now we're configuring our training parameters. +# +# For training and testing, the necessary parameters are: +# - Paths to the input data files. +# - Paths to the output directories. +# - ``prediction_task``: the type of prediction to be performed. This is either ``regression``, ``binary``, or ``classification``. +# +# Some optional parameters are: +# +# - ``kfold``: a boolean of whether to use k-fold cross-validation (True) or not (False). By default, this is set to False. +# - ``num_folds``: the number of folds to use. It can't be ``k=1``. +# - ``wandb_logging``: a boolean of whether to log the results using Weights and Biases (True) or not (False). Default is False. +# - ``test_size``: the proportion of the dataset to include in the test split. Default is 0.2. +# - ``batch_size``: the batch size to use for training. Default is 8. +# - ``multiclass_dimensions``: the number of classes to use for multiclass classification. Default is None unless ``prediction_task`` is ``multiclass``. +# - ``max_epochs``: the maximum number of epochs to train for. Default is 1000. + +# Regression task +prediction_task = "regression" + +# Set the batch size +batch_size = 32 + +# Setting output directories +output_paths = { + "losses": "loss_logs/one_model_regression_traintest", + "checkpoints": "checkpoints/one_model_regression_traintest", + "figures": "figures/one_model_regression_traintest", +} + +# Create the output directories if they don't exist +for path in output_paths.values(): + os.makedirs(path, exist_ok=True) + +# Clearing the loss logs directory (only for the example notebooks) +for dir in os.listdir(output_paths["losses"]): + # remove files + for file in os.listdir(os.path.join(output_paths["losses"], dir)): + os.remove(os.path.join(output_paths["losses"], dir, file)) + # remove dir + os.rmdir(os.path.join(output_paths["losses"], dir)) + +# %% +# 3. Generating simulated data ๐Ÿ”ฎ +# -------------------------------- +# Time to create some simulated data for our models to work their wonders on. +# This function also simulated image data which we aren't using here. + +tabular1_path, tabular2_path = generate_sklearn_simulated_data(prediction_task, + num_samples=500, + num_tab1_features=10, + num_tab2_features=20) + +data_paths = { + "tabular1": tabular1_path, + "tabular2": tabular2_path, + "image": "", +} + +# %% +# 4. Training the fusion model ๐Ÿ +# -------------------------------------- +# Now we're ready to train our model. We're using the :func:`~fusilli.train.train_and_save_models` function to train our model. +# +# First we need to create a data module using the :func:`~fusilli.data.prepare_fusion_data` function. +# This function takes the following parameters: +# +# - ``prediction_task``: the type of prediction to be performed. +# - ``fusion_model``: the fusion model to be trained. +# - ``data_paths``: the paths to the input data files. +# - ``output_paths``: the paths to the output directories. +# +# Then we pass the data module and the fusion model to the :func:`~fusilli.train.train_and_save_models` function. +# We're not using checkpointing for this example, so we set ``enable_checkpointing=False``. We're also setting ``show_loss_plot=True`` to plot the loss curve. + + +fusion_model = TabularCrossmodalMultiheadAttention + +print("method_name:", fusion_model.method_name) +print("modality_type:", fusion_model.modality_type) +print("fusion_type:", fusion_model.fusion_type) + +dm = prepare_fusion_data(prediction_task=prediction_task, + fusion_model=fusion_model, + data_paths=data_paths, + output_paths=output_paths, + batch_size=batch_size) + +# train and test +single_model_list = train_and_save_models( + data_module=dm, + fusion_model=fusion_model, + enable_checkpointing=False, # False for the example notebooks + show_loss_plot=True, + metrics_list=["r2", "mae", "mse"] +) + +# %% +# 6. Plotting the results ๐Ÿ“Š +# ---------------------------- +# Now we're ready to plot the results of our model. +# We're using the :class:`~.RealsVsPreds` class to plot the confusion matrix. + +reals_preds_fig = RealsVsPreds.from_final_val_data( + single_model_list +) +plt.show() diff --git a/docs/installation.rst b/docs/installation.rst index ae57913c..91b403a6 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -1,3 +1,6 @@ +.. _install_instructions: + + How to Install ============== diff --git a/docs/quick_start.rst b/docs/quick_start.rst index 58968a10..1ca57459 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -9,6 +9,12 @@ This script provides a simple setup to train a model using ``fusilli`` on a sing This code showcases the necessary steps to execute Fusilli on a single dataset. +**Before you run this, you need to:** + +1. Install ``fusilli`` (see :ref:`install_instructions`). +2. Prepare your data and specify the paths to your data (see :ref:`data-loading`). +3. Specify output file paths (see :ref:`experiment-set-up`). + Usage Example -------------