From fcbcbbc0d93a6ed83d96a6e2ce60a90526f6b0cf Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Wed, 29 Jan 2025 15:53:25 +0100 Subject: [PATCH 01/25] add parameter to config and gui to set the minimum number of precursors required to activate logreg clf --- alphadia/constants/default.yaml | 3 ++- alphadia/workflow/peptidecentric.py | 11 ++++++++++- gui/workflows/PeptideCentric.v1.json | 7 +++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/alphadia/constants/default.yaml b/alphadia/constants/default.yaml index 543e13ac..4991c9ed 100644 --- a/alphadia/constants/default.yaml +++ b/alphadia/constants/default.yaml @@ -239,9 +239,10 @@ fdr: channel_wise_fdr: false inference_strategy: "heuristic" # (Experimental) - # uses a two-step classifier consisting of a logistic regression and a neural network, with a default maximum of 5 iterations per fitting call + # uses a two-step classifier consisting of a logistic regression and a neural network, with a default maximum of 5 iterations per fitting call. The logistic regression is activated only when a minimum number of precursors (default 5,000) has been detected. enable_two_step_classifier: false two_step_classifier_max_iterations: 5 + two_step_classifier_min_precursors_for_update: 5000 # (Experimental) # Optimizes the batch size and learning rate of the neural network enable_nn_hyperparameter_tuning: false diff --git a/alphadia/workflow/peptidecentric.py b/alphadia/workflow/peptidecentric.py index 71747ec3..7a10b686 100644 --- a/alphadia/workflow/peptidecentric.py +++ b/alphadia/workflow/peptidecentric.py @@ -100,6 +100,7 @@ def get_classifier_base( enable_two_step_classifier: bool = False, two_step_classifier_max_iterations: int = 5, + two_step_classifier_min_precursors_for_update: int = 5000, enable_nn_hyperparameter_tuning: bool = False, fdr_cutoff: float = 0.01, ): @@ -111,9 +112,13 @@ def get_classifier_base( If True, uses logistic regression + neural network. If False (default), uses only neural network. - two_step_classifier_max_iterations : int + two_step_classifier_max_iterations : int, optional Maximum number of iterations withtin .fit_predict() of the two-step classifier. + two_step_classifier_min_precursors_for_update : int, optional + The minimum number of precursors required to update the logistic regression model + in the two-step classifier. Default is 5000. + enable_nn_hyperparameter_tuning: bool, optional If True, uses hyperparameter tuning for the neural network. If False (default), uses default hyperparameters for the neural network. @@ -141,6 +146,7 @@ def get_classifier_base( second_classifier=nn_classifier, second_fdr_cutoff=fdr_cutoff, max_iterations=two_step_classifier_max_iterations, + min_precursors_for_update=two_step_classifier_min_precursors_for_update, ) else: return nn_classifier @@ -187,6 +193,9 @@ def init_fdr_manager(self): two_step_classifier_max_iterations=self.config["fdr"][ "two_step_classifier_max_iterations" ], + two_step_classifier_min_precursors_for_update=self.config["fdr"][ + "two_step_classifier_min_precursors_for_update" + ], enable_nn_hyperparameter_tuning=self.config["fdr"][ "enable_nn_hyperparameter_tuning" ], diff --git a/gui/workflows/PeptideCentric.v1.json b/gui/workflows/PeptideCentric.v1.json index 7cd08eba..632e8e49 100644 --- a/gui/workflows/PeptideCentric.v1.json +++ b/gui/workflows/PeptideCentric.v1.json @@ -433,6 +433,13 @@ "description": "If two step classifier is enabled, this sets the maximum number of iterations for training the classifier.", "type": "integer" }, + { + "id": "two_step_classifier_min_precursors_for_update", + "name": "Two-Step Classifier Minimum Precursors for Update (Experimental)", + "value": 5000, + "description": "If two step classifier is enabled, this sets the minimum number of precursors required to update the first classifier (the Logistic Regression model).", + "type": "integer" + }, { "id": "enable_nn_hyperparameter_tuning", "name": "Hyperparameter Tuning (Experimental)", From f67756ecfbc672fd7fac241a965b93be88cc15ba Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Wed, 5 Feb 2025 17:03:33 +0100 Subject: [PATCH 02/25] remove i greater 0 statement from two-step-classifier --- alphadia/fdrx/models/two_step_classifier.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index 8d4882c3..236d33e5 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -102,7 +102,7 @@ def fit_predict( logger.info(f"Starting iteration {i + 1} / {self._max_iterations}.") # extract preselction using first classifier if it is fitted - if self.first_classifier.fitted and i > 0: + if self.first_classifier.fitted: df_train = self._apply_filtering_with_first_classifier( df, x_cols, group_columns ) From e621da2727c801f2ee3a6264d9fc5b9401f15168 Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Thu, 6 Feb 2025 16:06:13 +0100 Subject: [PATCH 03/25] add pretrained TwoStepClassifier model --- .../two_step_classifier/715e351002075dbf.pth | Bin 0 -> 61325 bytes alphadia/workflow/manager.py | 35 +++++++++++------- 2 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 alphadia/constants/classifier/two_step_classifier/715e351002075dbf.pth diff --git a/alphadia/constants/classifier/two_step_classifier/715e351002075dbf.pth b/alphadia/constants/classifier/two_step_classifier/715e351002075dbf.pth new file mode 100644 index 0000000000000000000000000000000000000000..3a03466f9adf39872818b0eda65fa7bda0b124be GIT binary patch literal 61325 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 o(|wA??@!cII-6*|7ufyW+w7LZF{26#wy Date: Mon, 10 Feb 2025 09:45:02 +0100 Subject: [PATCH 04/25] add check if n_samples > 10 in BinaryClassifierLegacyNewBatch --- alphadia/fdrexperimental.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/alphadia/fdrexperimental.py b/alphadia/fdrexperimental.py index da0e25b0..52682954 100644 --- a/alphadia/fdrexperimental.py +++ b/alphadia/fdrexperimental.py @@ -1146,9 +1146,16 @@ def fit(self, x: np.ndarray, y: np.ndarray): if y.ndim == 1: y = np.stack([1 - y, y], axis=1) - x_train, x_test, y_train, y_test = model_selection.train_test_split( - x, y, test_size=self.test_size - ) + if len(x) > 10: + x_train, x_test, y_train, y_test = model_selection.train_test_split( + x, y, test_size=self.test_size + ) + else: + x_train, x_test = x, y + y_train, y_test = x, y + + x_train = torch.Tensor(x_train) + y_train = torch.Tensor(y_train) x_test = torch.Tensor(x_test) y_test = torch.Tensor(y_test) @@ -1161,9 +1168,6 @@ def fit(self, x: np.ndarray, y: np.ndarray): loss = nn.BCELoss() - x_train = torch.Tensor(x_train) - y_train = torch.Tensor(y_train) - num_batches = (x_train.shape[0] // self.batch_size) - 1 batch_start_list = np.arange(num_batches) * self.batch_size batch_stop_list = np.arange(num_batches) * self.batch_size + self.batch_size From 716be7855381f7d4badde53c102665b62d499b7d Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Tue, 11 Feb 2025 09:54:37 +0100 Subject: [PATCH 05/25] 2-step-clsf: add i > 0 --- alphadia/fdrx/models/two_step_classifier.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index 236d33e5..715ca675 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -21,8 +21,8 @@ def __init__( # noqa: PLR0913 Too many arguments in function definition (> 5) second_classifier: Classifier, first_fdr_cutoff: float = 0.6, second_fdr_cutoff: float = 0.01, - min_precursors_for_update: int = 5000, - max_iterations: int = 5, + min_precursors_for_update: int = 200, + max_iterations: int = 2, train_on_top_n: int = 1, ): """Initializing a two-step classifier. @@ -102,7 +102,7 @@ def fit_predict( logger.info(f"Starting iteration {i + 1} / {self._max_iterations}.") # extract preselction using first classifier if it is fitted - if self.first_classifier.fitted: + if self.first_classifier.fitted and i > 0: df_train = self._apply_filtering_with_first_classifier( df, x_cols, group_columns ) From c8b946382cec3db546d8ca535363a3efc4adcd67 Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Tue, 11 Feb 2025 10:07:44 +0100 Subject: [PATCH 06/25] remove pretrained model --- .../two_step_classifier/715e351002075dbf.pth | Bin 61325 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 alphadia/constants/classifier/two_step_classifier/715e351002075dbf.pth diff --git a/alphadia/constants/classifier/two_step_classifier/715e351002075dbf.pth b/alphadia/constants/classifier/two_step_classifier/715e351002075dbf.pth deleted file mode 100644 index 3a03466f9adf39872818b0eda65fa7bda0b124be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61325 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 o(|wA??@!cII-6*|7ufyW+w7LZF{26#wy Date: Tue, 11 Feb 2025 10:27:58 +0100 Subject: [PATCH 07/25] 2-step-clsf version: i >= 0, not pretrained --- alphadia/fdrx/models/two_step_classifier.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index 715ca675..08f2a0d6 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -102,7 +102,7 @@ def fit_predict( logger.info(f"Starting iteration {i + 1} / {self._max_iterations}.") # extract preselction using first classifier if it is fitted - if self.first_classifier.fitted and i > 0: + if self.first_classifier.fitted: df_train = self._apply_filtering_with_first_classifier( df, x_cols, group_columns ) From 0abc25539bd702190162b24f2dd96755235d6e2f Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Tue, 11 Feb 2025 10:44:09 +0100 Subject: [PATCH 08/25] 2-step-clsf version: i >= 0, pretrained --- .../two_step_classifier/715e351002075dbf.pth | Bin 0 -> 61325 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 alphadia/constants/classifier/two_step_classifier/715e351002075dbf.pth diff --git a/alphadia/constants/classifier/two_step_classifier/715e351002075dbf.pth b/alphadia/constants/classifier/two_step_classifier/715e351002075dbf.pth new file mode 100644 index 0000000000000000000000000000000000000000..3a03466f9adf39872818b0eda65fa7bda0b124be GIT binary patch literal 61325 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 o(|wA??@!cII-6*|7ufyW+w7LZF{26#wy Date: Tue, 11 Feb 2025 13:00:49 +0100 Subject: [PATCH 09/25] 2-step-clsf version: i >= 0, not pretrained --- .../constants/classifier/fa9945ae23db872d.pth | Bin 51796 -> 0 bytes .../classifier/two_step_classifier/.gitkeep | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 alphadia/constants/classifier/fa9945ae23db872d.pth create mode 100644 alphadia/constants/classifier/two_step_classifier/.gitkeep diff --git a/alphadia/constants/classifier/fa9945ae23db872d.pth b/alphadia/constants/classifier/fa9945ae23db872d.pth deleted file mode 100644 index ed8139ac4d4439b46df6a6903f65c67c2ed57d84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51796 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 diff --git a/alphadia/constants/classifier/two_step_classifier/.gitkeep b/alphadia/constants/classifier/two_step_classifier/.gitkeep new file mode 100644 index 00000000..e69de29b From d93fae3be31f2b0cdb01cf945b84663259fb82e6 Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Tue, 11 Feb 2025 13:02:56 +0100 Subject: [PATCH 10/25] 2-step-clsf version: i > 0, not pretrained --- alphadia/fdrx/models/two_step_classifier.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index 08f2a0d6..715ca675 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -102,7 +102,7 @@ def fit_predict( logger.info(f"Starting iteration {i + 1} / {self._max_iterations}.") # extract preselction using first classifier if it is fitted - if self.first_classifier.fitted: + if self.first_classifier.fitted and i > 0: df_train = self._apply_filtering_with_first_classifier( df, x_cols, group_columns ) From 8df18ea336ec981bb5340ca1c263fb58de9e489b Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Tue, 11 Feb 2025 21:03:05 +0100 Subject: [PATCH 11/25] remove print statements --- alphadia/workflow/manager.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/alphadia/workflow/manager.py b/alphadia/workflow/manager.py index f4f45b2b..d4b2dc8f 100644 --- a/alphadia/workflow/manager.py +++ b/alphadia/workflow/manager.py @@ -847,12 +847,10 @@ def get_classifier(self, available_columns: list, version: int = -1): """ classifier_hash = column_hash(available_columns) - print(f"\nclassifier_hash = {classifier_hash}\n") if classifier_hash in self.classifier_store: classifier = self.classifier_store[classifier_hash][version] else: classifier = self.classifier_base - print(f"\nclassifier._max_iterations = {classifier._max_iterations}\n") return deepcopy(classifier) @property From a6ee75d4bb0fb3c9b8052963b92869c6e96c4d1d Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Sun, 23 Feb 2025 10:07:57 +0100 Subject: [PATCH 12/25] add scaling of qval --- alphadia/fdrx/models/two_step_classifier.py | 37 ++++++++++++++------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index 715ca675..134e2d63 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -37,7 +37,7 @@ def __init__( # noqa: PLR0913 Too many arguments in function definition (> 5) The fdr threshold for the first classifier, determining how selective the first classification step is. second_fdr_cutoff : float, default=0.01 The fdr threshold for the second classifier, typically set stricter to ensure high confidence in the final classification results. - min_precursors_for_update : int, default=5000 + min_precursors_for_update : int, default=200 The minimum number of precursors required to update the first classifier. max_iterations : int Maximum number of refinement iterations during training. @@ -136,14 +136,14 @@ def fit_predict( best_result = df_after_second_clf logger.info( - f"{current_target_count:,} precursors found after second classifier, " + f"{current_target_count:,} targets found after second classifier, " f"at fdr={self.second_fdr_cutoff}" ) # update first classifier if enough confident predictions if current_target_count > self._min_precursors_for_update: logger.info( - f"Sufficient precursors detected ({current_target_count:,} > {self._min_precursors_for_update:,}) " + f"Sufficient targets detected ({current_target_count:,} > {self._min_precursors_for_update:,}) " f"to proceed with update of first classifier" ) target_count_after_first_clf, new_classifier = ( @@ -152,7 +152,7 @@ def fit_predict( ) ) logger.info( - f"{target_count_after_first_clf:,} precursors found after first classifier, " + f"{target_count_after_first_clf:,} targets found after first classifier, " f"at fdr={self.first_fdr_cutoff}" ) @@ -193,7 +193,7 @@ def _apply_filtering_with_first_classifier( """Apply first classifier to filter data for the training of the second classifier.""" n_precursors = get_target_count(df) logger.info( - f"Applying first classifier to {len(df):,} samples ({n_precursors:,} precursors)" + f"Applying first classifier to {len(df):,} samples ({n_precursors:,} targets)" ) df["proba"] = self.first_classifier.predict_proba(df[x_cols].to_numpy())[:, 1] @@ -203,7 +203,7 @@ def _apply_filtering_with_first_classifier( ) logger.info( f"Preselection of first classifier at fdr={self.first_fdr_cutoff} results in " - f"{len(filtered_df):,} samples ({get_target_count(filtered_df):,} precursors)" + f"{len(filtered_df):,} precursors ({get_target_count(filtered_df):,} targets)" ) return filtered_df @@ -218,8 +218,8 @@ def _train_and_apply_second_classifier( ) -> pd.DataFrame: """Train second_classifier and apply it to get predictions.""" logger.info( - f"Training second classifier on {len(train_df):,} samples " - f"({get_target_count(train_df):,} precursors, top_n={self._train_on_top_n})" + f"Training second classifier on {len(train_df):,} precursors " + f"({get_target_count(train_df):,} targets, top_n={self._train_on_top_n})" ) self.second_classifier.fit( @@ -228,8 +228,8 @@ def _train_and_apply_second_classifier( ) logger.info( - f"Applying second classifier on {len(predict_df):,} samples " - f"({get_target_count(train_df):,} precursors, top_n={max(predict_df['rank']) + 1})" + f"Applying second classifier on {len(predict_df):,} precursors " + f"({get_target_count(train_df):,} targets, top_n={max(predict_df['rank']) + 1})" ) x = predict_df[x_cols].to_numpy().astype(np.float32) @@ -313,12 +313,25 @@ def get_target_count(df: pd.DataFrame) -> int: def compute_q_values( - df: pd.DataFrame, group_columns: list[str] | None = None + df: pd.DataFrame, + qval_col: str = "qval", + group_columns: list[str] | None = None, + scale_by_target_decoy_ratio: bool = True, # noqa: FBT001, FBT002 ) -> pd.DataFrame: """Compute q-values for each entry after keeping only best entries per group.""" df.sort_values("proba", ascending=True, inplace=True) df = keep_best(df, group_columns=group_columns) - return get_q_values(df, "proba", "decoy") + df = get_q_values(df, "proba", "decoy", qval_col) + + if scale_by_target_decoy_ratio: + n_targets = (df["decoy"] == 0).sum() + n_decoys = (df["decoy"] == 1).sum() + logger.info( + f"Normalizing q-values using {n_targets:,} targets and {n_decoys:,} decoys (scaling factor = {n_targets / n_decoys})" + ) + df[qval_col] = df[qval_col] * n_targets / n_decoys + + return df def filter_by_qval(df: pd.DataFrame, fdr_cutoff: float) -> pd.DataFrame: From 1fee785b928028e43abd59ecd2351026b0c82e48 Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Mon, 24 Feb 2025 09:15:44 +0100 Subject: [PATCH 13/25] fix group_column param --- alphadia/fdrx/models/two_step_classifier.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index 134e2d63..72e6e340 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -314,8 +314,8 @@ def get_target_count(df: pd.DataFrame) -> int: def compute_q_values( df: pd.DataFrame, - qval_col: str = "qval", group_columns: list[str] | None = None, + qval_col: str = "qval", scale_by_target_decoy_ratio: bool = True, # noqa: FBT001, FBT002 ) -> pd.DataFrame: """Compute q-values for each entry after keeping only best entries per group.""" From 86623546dcf7f470df82e73bc07dc60723720ed9 Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Mon, 24 Feb 2025 11:10:52 +0100 Subject: [PATCH 14/25] fix scaling_factor --- alphadia/fdrx/models/two_step_classifier.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index 72e6e340..870e28a2 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -329,7 +329,10 @@ def compute_q_values( logger.info( f"Normalizing q-values using {n_targets:,} targets and {n_decoys:,} decoys (scaling factor = {n_targets / n_decoys})" ) - df[qval_col] = df[qval_col] * n_targets / n_decoys + scaling_factor = n_targets / n_decoys + if not np.isfinite(scaling_factor) or scaling_factor == 0: + scaling_factor = 1 + df[qval_col] = df[qval_col] * scaling_factor return df From 82ea90d3225c8c1bce5482f3231b1a44c85cd28d Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Mon, 24 Feb 2025 14:51:00 +0100 Subject: [PATCH 15/25] fix scaling_factor --- alphadia/fdrx/models/two_step_classifier.py | 28 +++++++++++---------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index 870e28a2..a3e12c65 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -193,7 +193,7 @@ def _apply_filtering_with_first_classifier( """Apply first classifier to filter data for the training of the second classifier.""" n_precursors = get_target_count(df) logger.info( - f"Applying first classifier to {len(df):,} samples ({n_precursors:,} targets)" + f"Applying first classifier to {len(df):,} precursors ({n_precursors:,} targets)" ) df["proba"] = self.first_classifier.predict_proba(df[x_cols].to_numpy())[:, 1] @@ -229,7 +229,7 @@ def _train_and_apply_second_classifier( logger.info( f"Applying second classifier on {len(predict_df):,} precursors " - f"({get_target_count(train_df):,} targets, top_n={max(predict_df['rank']) + 1})" + f"({get_target_count(predict_df):,} targets, top_n={max(predict_df['rank']) + 1})" ) x = predict_df[x_cols].to_numpy().astype(np.float32) @@ -256,11 +256,11 @@ def _fit_and_eval_first_classifier( x_all = full_df[x_cols].to_numpy() reduced_df = full_df[[*group_columns, "decoy"]] - logger.info(f"Fitting first classifier on {len(df_train):,} samples.") + logger.info(f"Fitting first classifier on {len(df_train):,} precursors.") new_classifier = copy.deepcopy(self.first_classifier) new_classifier.fit(x_train, y_train) - logger.info(f"Applying first classifier to {len(x_all):,} samples.") + logger.info(f"Applying first classifier to {len(x_all):,} precursors.") reduced_df["proba"] = new_classifier.predict_proba(x_all)[:, 1] df_targets = compute_and_filter_q_values( reduced_df, self.first_fdr_cutoff, group_columns @@ -319,20 +319,22 @@ def compute_q_values( scale_by_target_decoy_ratio: bool = True, # noqa: FBT001, FBT002 ) -> pd.DataFrame: """Compute q-values for each entry after keeping only best entries per group.""" - df.sort_values("proba", ascending=True, inplace=True) - df = keep_best(df, group_columns=group_columns) - df = get_q_values(df, "proba", "decoy", qval_col) - + scaling_factor = 1.0 if scale_by_target_decoy_ratio: n_targets = (df["decoy"] == 0).sum() n_decoys = (df["decoy"] == 1).sum() - logger.info( - f"Normalizing q-values using {n_targets:,} targets and {n_decoys:,} decoys (scaling factor = {n_targets / n_decoys})" - ) scaling_factor = n_targets / n_decoys if not np.isfinite(scaling_factor) or scaling_factor == 0: - scaling_factor = 1 - df[qval_col] = df[qval_col] * scaling_factor + scaling_factor = 1.0 + + df.sort_values("proba", ascending=True, inplace=True) + df = keep_best(df, group_columns=group_columns) + df = get_q_values(df, "proba", "decoy", qval_col) + + logger.info( + f"Normalizing q-values using {n_targets:,} targets and {n_decoys:,} decoys (scaling factor = {scaling_factor})" + ) + df[qval_col] = df[qval_col] * scaling_factor return df From d969206ad12b5686f02eb4f77e72417f458f0d88 Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Thu, 27 Feb 2025 18:51:19 +0100 Subject: [PATCH 16/25] reorganize TwoStepClassifier.fit_predict() --- alphadia/fdrx/models/two_step_classifier.py | 143 ++++++++------------ 1 file changed, 60 insertions(+), 83 deletions(-) diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index a3e12c65..079b68b1 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -67,11 +67,11 @@ def fit_predict( y_col: str = "decoy", group_columns: list[str] | None = None, ) -> pd.DataFrame: - """Train the two-step classifier and predict precursors using an iterative approach. + """Train the two-step classifier and predict precursors using the following approach. - 1. First iteration: Train neural network on top-n candidates. - 2. Subsequent iterations: Use linear classifier to filter data, then refine with neural network. - 3. Update linear classifier if enough high-confidence predictions are found, else break. + 1. Train neural network on top-n candidates. + 2. Update linear classifier if enough high-confidence predictions are found, else break. + 3. Use linear classifier to filter data, then refine with neural network. Parameters ---------- @@ -93,92 +93,59 @@ def fit_predict( logger.info("=== Starting training of TwoStepClassifier ===") df = self._preprocess_data(df, x_cols) - best_result = None + df_train = df[df["rank"] < self._train_on_top_n] + df_predict = df - previous_target_count_after_first_clf = -1 - previous_target_count_after_second_clf = -1 + # train and apply NN classifier + self.second_classifier.epochs = 50 + df_after_second_clf = self._train_and_apply_second_classifier( + df_train, df_predict, x_cols, y_col, group_columns + ) + best_result = df_after_second_clf - for i in range(self._max_iterations): - logger.info(f"Starting iteration {i + 1} / {self._max_iterations}.") + df_filtered = filter_by_qval(df_after_second_clf, self.second_fdr_cutoff) + previous_target_count_after_second_clf = get_target_count(df_filtered) + logger.info( + f"{previous_target_count_after_second_clf:,} targets found " + f"after second classifier, at fdr={self.second_fdr_cutoff}" + ) - # extract preselction using first classifier if it is fitted - if self.first_classifier.fitted and i > 0: - df_train = self._apply_filtering_with_first_classifier( - df, x_cols, group_columns - ) - df_predict = df_train # using the same df for training and predicting, unlike in the following else block. + # stop if not enough targets found after NN classifier + if previous_target_count_after_second_clf < self._min_precursors_for_update: + return best_result - previous_target_count_after_first_clf = get_target_count(df_train) - self.second_classifier.epochs = 50 - else: - logger.info("First classifier not fitted yet. Proceeding without it.") - df_train = df[df["rank"] < self._train_on_top_n] - df_predict = df + # update the linear classifier + self._update_first_classifier(df_filtered, df, x_cols, y_col, group_columns) + if self.first_classifier.fitted: + # filter data using the fitted first classifier + df_train = self._apply_filtering_with_first_classifier( + df, x_cols, group_columns + ) + df_predict = df_train # using the same df for training and predicting, unlike in the following else block. - self.second_classifier.epochs = 10 + previous_target_count_after_first_clf = get_target_count(df_train) # train and apply second classifier + self.second_classifier.epochs = 50 df_after_second_clf = self._train_and_apply_second_classifier( df_train, df_predict, x_cols, y_col, group_columns ) - df_filtered = filter_by_qval(df_after_second_clf, self.second_fdr_cutoff) current_target_count = get_target_count(df_filtered) - if current_target_count < previous_target_count_after_second_clf: - logger.info( - f"Training stopped on iteration {i + 1}. Decrease in target count from " - f"{previous_target_count_after_second_clf:,} to {current_target_count:,}." - ) - return best_result - - previous_target_count_after_second_clf = current_target_count - best_result = df_after_second_clf - - logger.info( - f"{current_target_count:,} targets found after second classifier, " - f"at fdr={self.second_fdr_cutoff}" - ) - - # update first classifier if enough confident predictions - if current_target_count > self._min_precursors_for_update: - logger.info( - f"Sufficient targets detected ({current_target_count:,} > {self._min_precursors_for_update:,}) " - f"to proceed with update of first classifier" - ) - target_count_after_first_clf, new_classifier = ( - self._fit_and_eval_first_classifier( - df_filtered, df, x_cols, y_col, group_columns - ) - ) - logger.info( - f"{target_count_after_first_clf:,} targets found after first classifier, " - f"at fdr={self.first_fdr_cutoff}" - ) - - if target_count_after_first_clf > previous_target_count_after_first_clf: - logger.info( - f"Updating the first classifier as new target count increased: " - f"{target_count_after_first_clf:,} > {previous_target_count_after_first_clf:,}" + if current_target_count > previous_target_count_after_second_clf: + previous_target_count_after_second_clf = current_target_count + best_result = df_after_second_clf + + if current_target_count > self._min_precursors_for_update: + self._update_first_classifier( + df_filtered, + df, + x_cols, + y_col, + group_columns, + previous_target_count_after_first_clf, ) - self.first_classifier = new_classifier - previous_target_count_after_first_clf = target_count_after_first_clf - - else: - logger.info( - f"Not updating the first classifier as new target count decreased: " - f"{target_count_after_first_clf:,} < {previous_target_count_after_first_clf:,}" - ) - else: - logger.info( - f"=== Insufficient precursors detected; ending after {i + 1} iterations ===" - ) - break - else: - logger.info( - f"=== Stopping fitting after reaching the maximum number of iterations: " - f"{self._max_iterations} / {self._max_iterations} ===" - ) return best_result @@ -228,7 +195,7 @@ def _train_and_apply_second_classifier( ) logger.info( - f"Applying second classifier on {len(predict_df):,} precursors " + f"Applying second classifier to {len(predict_df):,} precursors " f"({get_target_count(predict_df):,} targets, top_n={max(predict_df['rank']) + 1})" ) @@ -237,14 +204,15 @@ def _train_and_apply_second_classifier( return compute_q_values(predict_df, group_columns) - def _fit_and_eval_first_classifier( + def _update_first_classifier( # noqa: PLR0913 self, subset_df: pd.DataFrame, full_df: pd.DataFrame, x_cols: list[str], y_col: str, group_columns: list[str], - ) -> tuple[int, Classifier]: + previous_count: int = -1, + ) -> None: """Fits a copy of the first classifier on a given subset and applies it to the full dataset. Returns the number of targets found and the trained classifier. @@ -256,18 +224,27 @@ def _fit_and_eval_first_classifier( x_all = full_df[x_cols].to_numpy() reduced_df = full_df[[*group_columns, "decoy"]] - logger.info(f"Fitting first classifier on {len(df_train):,} precursors.") + logger.info( + f"Fitting first classifier on {len(df_train):,} precursors, applying it to {len(x_all):,} precursors." + ) new_classifier = copy.deepcopy(self.first_classifier) new_classifier.fit(x_train, y_train) - logger.info(f"Applying first classifier to {len(x_all):,} precursors.") reduced_df["proba"] = new_classifier.predict_proba(x_all)[:, 1] df_targets = compute_and_filter_q_values( reduced_df, self.first_fdr_cutoff, group_columns ) n_targets = get_target_count(df_targets) - return n_targets, new_classifier + # update first classifier if imrpovement + if n_targets > previous_count: + logger.info( + f"Updating the first classifier as new target count increased: {n_targets:,} > {previous_count:,}" + ) + self.first_classifier = new_classifier + previous_count = n_targets + + # return previous_count @property def fitted(self) -> bool: @@ -323,7 +300,7 @@ def compute_q_values( if scale_by_target_decoy_ratio: n_targets = (df["decoy"] == 0).sum() n_decoys = (df["decoy"] == 1).sum() - scaling_factor = n_targets / n_decoys + scaling_factor = round(n_targets / n_decoys, 3) if not np.isfinite(scaling_factor) or scaling_factor == 0: scaling_factor = 1.0 From 6a168a3253def44c8cb5f94d4c25ed95a88379d2 Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Thu, 27 Feb 2025 18:53:35 +0100 Subject: [PATCH 17/25] add pretrained model file --- .../constants/classifier/fa9945ae23db872d.pth | Bin 0 -> 51796 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 alphadia/constants/classifier/fa9945ae23db872d.pth diff --git a/alphadia/constants/classifier/fa9945ae23db872d.pth b/alphadia/constants/classifier/fa9945ae23db872d.pth new file mode 100644 index 0000000000000000000000000000000000000000..ed8139ac4d4439b46df6a6903f65c67c2ed57d84 GIT binary patch literal 51796 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 literal 0 HcmV?d00001 From 25e2aca8fb9d85c306d83d0d71b9193eb91531c7 Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Thu, 27 Feb 2025 19:22:28 +0100 Subject: [PATCH 18/25] remove redundant parameters --- .../classifier/two_step_classifier/.gitkeep | 0 alphadia/constants/default.yaml | 4 +--- alphadia/workflow/manager.py | 16 ++++++---------- alphadia/workflow/peptidecentric.py | 17 ----------------- gui/workflows/PeptideCentric.v1.json | 14 -------------- 5 files changed, 7 insertions(+), 44 deletions(-) delete mode 100644 alphadia/constants/classifier/two_step_classifier/.gitkeep diff --git a/alphadia/constants/classifier/two_step_classifier/.gitkeep b/alphadia/constants/classifier/two_step_classifier/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/alphadia/constants/default.yaml b/alphadia/constants/default.yaml index 4991c9ed..fcd297bc 100644 --- a/alphadia/constants/default.yaml +++ b/alphadia/constants/default.yaml @@ -239,10 +239,8 @@ fdr: channel_wise_fdr: false inference_strategy: "heuristic" # (Experimental) - # uses a two-step classifier consisting of a logistic regression and a neural network, with a default maximum of 5 iterations per fitting call. The logistic regression is activated only when a minimum number of precursors (default 5,000) has been detected. + # uses a two-step classifier consisting of a logistic regression and a neural network. enable_two_step_classifier: false - two_step_classifier_max_iterations: 5 - two_step_classifier_min_precursors_for_update: 5000 # (Experimental) # Optimizes the batch size and learning rate of the neural network enable_nn_hyperparameter_tuning: false diff --git a/alphadia/workflow/manager.py b/alphadia/workflow/manager.py index d4b2dc8f..315e7e42 100644 --- a/alphadia/workflow/manager.py +++ b/alphadia/workflow/manager.py @@ -786,6 +786,8 @@ def save_classifier_store(self, path: None | str = None, version: int = -1): path = os.path.join( os.path.dirname(alphadia.__file__), "constants", "classifier" ) + if self.is_two_step_classifier: + path = os.path.join(path, "two_step_classifier") logger.info(f"Saving classifier store to {path}") @@ -805,17 +807,11 @@ def load_classifier_store(self, path: None | str = None): """ if path is None: + path = os.path.join( + os.path.dirname(alphadia.__file__), "constants", "classifier" + ) if self.is_two_step_classifier: - path = os.path.join( - os.path.dirname(alphadia.__file__), - "constants", - "classifier", - "two_step_classifier", - ) - else: - path = os.path.join( - os.path.dirname(alphadia.__file__), "constants", "classifier" - ) + path = os.path.join(path, "two_step_classifier") logger.info(f"Loading classifier store from {path}") diff --git a/alphadia/workflow/peptidecentric.py b/alphadia/workflow/peptidecentric.py index 7a10b686..9c9eafd1 100644 --- a/alphadia/workflow/peptidecentric.py +++ b/alphadia/workflow/peptidecentric.py @@ -99,8 +99,6 @@ def get_classifier_base( enable_two_step_classifier: bool = False, - two_step_classifier_max_iterations: int = 5, - two_step_classifier_min_precursors_for_update: int = 5000, enable_nn_hyperparameter_tuning: bool = False, fdr_cutoff: float = 0.01, ): @@ -112,13 +110,6 @@ def get_classifier_base( If True, uses logistic regression + neural network. If False (default), uses only neural network. - two_step_classifier_max_iterations : int, optional - Maximum number of iterations withtin .fit_predict() of the two-step classifier. - - two_step_classifier_min_precursors_for_update : int, optional - The minimum number of precursors required to update the logistic regression model - in the two-step classifier. Default is 5000. - enable_nn_hyperparameter_tuning: bool, optional If True, uses hyperparameter tuning for the neural network. If False (default), uses default hyperparameters for the neural network. @@ -145,8 +136,6 @@ def get_classifier_base( first_classifier=LogisticRegressionClassifier(), second_classifier=nn_classifier, second_fdr_cutoff=fdr_cutoff, - max_iterations=two_step_classifier_max_iterations, - min_precursors_for_update=two_step_classifier_min_precursors_for_update, ) else: return nn_classifier @@ -190,12 +179,6 @@ def init_fdr_manager(self): enable_two_step_classifier=self.config["fdr"][ "enable_two_step_classifier" ], - two_step_classifier_max_iterations=self.config["fdr"][ - "two_step_classifier_max_iterations" - ], - two_step_classifier_min_precursors_for_update=self.config["fdr"][ - "two_step_classifier_min_precursors_for_update" - ], enable_nn_hyperparameter_tuning=self.config["fdr"][ "enable_nn_hyperparameter_tuning" ], diff --git a/gui/workflows/PeptideCentric.v1.json b/gui/workflows/PeptideCentric.v1.json index 632e8e49..62234afd 100644 --- a/gui/workflows/PeptideCentric.v1.json +++ b/gui/workflows/PeptideCentric.v1.json @@ -426,20 +426,6 @@ "description": "If enabled, a two step classifier consisting of a linear filter and a neural network will be used.", "type": "boolean" }, - { - "id": "two_step_classifier_max_iterations", - "name": "Two Step Classifier Max Iterations (Experimental)", - "value": 5, - "description": "If two step classifier is enabled, this sets the maximum number of iterations for training the classifier.", - "type": "integer" - }, - { - "id": "two_step_classifier_min_precursors_for_update", - "name": "Two-Step Classifier Minimum Precursors for Update (Experimental)", - "value": 5000, - "description": "If two step classifier is enabled, this sets the minimum number of precursors required to update the first classifier (the Logistic Regression model).", - "type": "integer" - }, { "id": "enable_nn_hyperparameter_tuning", "name": "Hyperparameter Tuning (Experimental)", From 76aff18ca81a92b51f8750fc1fc72d55b0bdc052 Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Thu, 27 Feb 2025 20:18:01 +0100 Subject: [PATCH 19/25] move chek for enough samples --- alphadia/fdrexperimental.py | 10 +++------- alphadia/fdrx/models/two_step_classifier.py | 8 ++++---- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/alphadia/fdrexperimental.py b/alphadia/fdrexperimental.py index 52682954..1baba232 100644 --- a/alphadia/fdrexperimental.py +++ b/alphadia/fdrexperimental.py @@ -1146,13 +1146,9 @@ def fit(self, x: np.ndarray, y: np.ndarray): if y.ndim == 1: y = np.stack([1 - y, y], axis=1) - if len(x) > 10: - x_train, x_test, y_train, y_test = model_selection.train_test_split( - x, y, test_size=self.test_size - ) - else: - x_train, x_test = x, y - y_train, y_test = x, y + x_train, x_test, y_train, y_test = model_selection.train_test_split( + x, y, test_size=self.test_size + ) x_train = torch.Tensor(x_train) y_train = torch.Tensor(y_train) diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index 079b68b1..8959e36d 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -22,7 +22,6 @@ def __init__( # noqa: PLR0913 Too many arguments in function definition (> 5) first_fdr_cutoff: float = 0.6, second_fdr_cutoff: float = 0.01, min_precursors_for_update: int = 200, - max_iterations: int = 2, train_on_top_n: int = 1, ): """Initializing a two-step classifier. @@ -39,8 +38,6 @@ def __init__( # noqa: PLR0913 Too many arguments in function definition (> 5) The fdr threshold for the second classifier, typically set stricter to ensure high confidence in the final classification results. min_precursors_for_update : int, default=200 The minimum number of precursors required to update the first classifier. - max_iterations : int - Maximum number of refinement iterations during training. train_on_top_n : int Use candidates up to this rank for training. During inference, all ranks are used. @@ -51,7 +48,6 @@ def __init__( # noqa: PLR0913 Too many arguments in function definition (> 5) self.second_fdr_cutoff = second_fdr_cutoff self._min_precursors_for_update = min_precursors_for_update - self._max_iterations = max_iterations self._train_on_top_n = train_on_top_n logger.info( @@ -90,6 +86,7 @@ def fit_predict( DataFrame containing predictions and q-values """ + min_train_size = 10 logger.info("=== Starting training of TwoStepClassifier ===") df = self._preprocess_data(df, x_cols) @@ -121,6 +118,9 @@ def fit_predict( df_train = self._apply_filtering_with_first_classifier( df, x_cols, group_columns ) + if len(df_train) < min_train_size: + return best_result + df_predict = df_train # using the same df for training and predicting, unlike in the following else block. previous_target_count_after_first_clf = get_target_count(df_train) From 033918d4dd8e48125b5749ad737fd7fffaa2f9e1 Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Thu, 27 Feb 2025 22:00:35 +0100 Subject: [PATCH 20/25] clean up --- alphadia/fdrx/models/two_step_classifier.py | 71 ++++++++++----------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index 8959e36d..b4a60c8b 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -86,7 +86,7 @@ def fit_predict( DataFrame containing predictions and q-values """ - min_train_size = 10 + min_train_size = 1 logger.info("=== Starting training of TwoStepClassifier ===") df = self._preprocess_data(df, x_cols) @@ -94,58 +94,55 @@ def fit_predict( df_predict = df # train and apply NN classifier - self.second_classifier.epochs = 50 + self.second_classifier.epochs = 10 df_after_second_clf = self._train_and_apply_second_classifier( df_train, df_predict, x_cols, y_col, group_columns ) best_result = df_after_second_clf df_filtered = filter_by_qval(df_after_second_clf, self.second_fdr_cutoff) - previous_target_count_after_second_clf = get_target_count(df_filtered) + target_count_after_second_clf = get_target_count(df_filtered) logger.info( - f"{previous_target_count_after_second_clf:,} targets found " + f"{target_count_after_second_clf:,} targets found " f"after second classifier, at fdr={self.second_fdr_cutoff}" ) # stop if not enough targets found after NN classifier - if previous_target_count_after_second_clf < self._min_precursors_for_update: + if target_count_after_second_clf < self._min_precursors_for_update: return best_result - # update the linear classifier + # update and use the linear classifier self._update_first_classifier(df_filtered, df, x_cols, y_col, group_columns) - if self.first_classifier.fitted: - # filter data using the fitted first classifier - df_train = self._apply_filtering_with_first_classifier( - df, x_cols, group_columns - ) - if len(df_train) < min_train_size: - return best_result - - df_predict = df_train # using the same df for training and predicting, unlike in the following else block. + df_train = self._apply_filtering_with_first_classifier( + df, x_cols, group_columns + ) + if len(df_train) < min_train_size: + return best_result - previous_target_count_after_first_clf = get_target_count(df_train) + df_predict = df_train # using the same df for training and predicting, unlike in the following else block. + previous_target_count_after_first_clf = get_target_count(df_train) - # train and apply second classifier - self.second_classifier.epochs = 50 - df_after_second_clf = self._train_and_apply_second_classifier( - df_train, df_predict, x_cols, y_col, group_columns - ) - df_filtered = filter_by_qval(df_after_second_clf, self.second_fdr_cutoff) - current_target_count = get_target_count(df_filtered) - - if current_target_count > previous_target_count_after_second_clf: - previous_target_count_after_second_clf = current_target_count - best_result = df_after_second_clf - - if current_target_count > self._min_precursors_for_update: - self._update_first_classifier( - df_filtered, - df, - x_cols, - y_col, - group_columns, - previous_target_count_after_first_clf, - ) + # train and apply second classifier + self.second_classifier.epochs = 50 + df_after_second_clf = self._train_and_apply_second_classifier( + df_train, df_predict, x_cols, y_col, group_columns + ) + df_filtered = filter_by_qval(df_after_second_clf, self.second_fdr_cutoff) + current_target_count = get_target_count(df_filtered) + + if current_target_count > target_count_after_second_clf: + target_count_after_second_clf = current_target_count + best_result = df_after_second_clf + + if current_target_count > self._min_precursors_for_update: + self._update_first_classifier( + df_filtered, + df, + x_cols, + y_col, + group_columns, + previous_target_count_after_first_clf, + ) return best_result From d978ef4e2ca04d6725f86d16cbdcf38b69d7a3bc Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Thu, 27 Feb 2025 23:06:28 +0100 Subject: [PATCH 21/25] adressing pr comments --- alphadia/fdrx/models/two_step_classifier.py | 22 +++++++++++---------- alphadia/workflow/manager.py | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index b4a60c8b..2a7fc41a 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -22,7 +22,7 @@ def __init__( # noqa: PLR0913 Too many arguments in function definition (> 5) first_fdr_cutoff: float = 0.6, second_fdr_cutoff: float = 0.01, min_precursors_for_update: int = 200, - train_on_top_n: int = 1, + n_top_candidates_for_training: int = 1, ): """Initializing a two-step classifier. @@ -38,7 +38,7 @@ def __init__( # noqa: PLR0913 Too many arguments in function definition (> 5) The fdr threshold for the second classifier, typically set stricter to ensure high confidence in the final classification results. min_precursors_for_update : int, default=200 The minimum number of precursors required to update the first classifier. - train_on_top_n : int + n_top_candidates_for_training : int Use candidates up to this rank for training. During inference, all ranks are used. """ @@ -48,7 +48,7 @@ def __init__( # noqa: PLR0913 Too many arguments in function definition (> 5) self.second_fdr_cutoff = second_fdr_cutoff self._min_precursors_for_update = min_precursors_for_update - self._train_on_top_n = train_on_top_n + self._n_top_candidates_for_training = n_top_candidates_for_training logger.info( f"Initialized TwoStepClassifier with " @@ -90,7 +90,7 @@ def fit_predict( logger.info("=== Starting training of TwoStepClassifier ===") df = self._preprocess_data(df, x_cols) - df_train = df[df["rank"] < self._train_on_top_n] + df_train = df[df["rank"] < self._n_top_candidates_for_training] df_predict = df # train and apply NN classifier @@ -183,7 +183,7 @@ def _train_and_apply_second_classifier( """Train second_classifier and apply it to get predictions.""" logger.info( f"Training second classifier on {len(train_df):,} precursors " - f"({get_target_count(train_df):,} targets, top_n={self._train_on_top_n})" + f"({get_target_count(train_df):,} targets, top_n={self._n_top_candidates_for_training})" ) self.second_classifier.fit( @@ -262,7 +262,7 @@ def to_state_dict(self) -> dict: "second_classifier": self.second_classifier.to_state_dict(), "first_fdr_cutoff": self.first_fdr_cutoff, "second_fdr_cutoff": self.second_fdr_cutoff, - "train_on_top_n": self._train_on_top_n, + "n_top_candidates_for_training": self._n_top_candidates_for_training, } def from_state_dict(self, state_dict: dict) -> None: @@ -278,7 +278,9 @@ def from_state_dict(self, state_dict: dict) -> None: self.second_classifier.from_state_dict(state_dict["second_classifier"]) self.first_fdr_cutoff = state_dict["first_fdr_cutoff"] self.second_fdr_cutoff = state_dict["second_fdr_cutoff"] - self._train_on_top_n = state_dict["train_on_top_n"] + self._n_top_candidates_for_training = state_dict[ + "n_top_candidates_for_training" + ] def get_target_count(df: pd.DataFrame) -> int: @@ -293,13 +295,13 @@ def compute_q_values( scale_by_target_decoy_ratio: bool = True, # noqa: FBT001, FBT002 ) -> pd.DataFrame: """Compute q-values for each entry after keeping only best entries per group.""" - scaling_factor = 1.0 if scale_by_target_decoy_ratio: n_targets = (df["decoy"] == 0).sum() n_decoys = (df["decoy"] == 1).sum() - scaling_factor = round(n_targets / n_decoys, 3) - if not np.isfinite(scaling_factor) or scaling_factor == 0: + if n_targets == 0 or n_decoys == 0: scaling_factor = 1.0 + else: + scaling_factor = round(n_targets / n_decoys, 3) df.sort_values("proba", ascending=True, inplace=True) df = keep_best(df, group_columns=group_columns) diff --git a/alphadia/workflow/manager.py b/alphadia/workflow/manager.py index 315e7e42..51745178 100644 --- a/alphadia/workflow/manager.py +++ b/alphadia/workflow/manager.py @@ -815,7 +815,7 @@ def load_classifier_store(self, path: None | str = None): logger.info(f"Loading classifier store from {path}") - for file in os.listdir(path): + for file in os.scandir(path): if file.endswith(".pth"): classifier_hash = file.split(".")[0] From 42b1c0c85886f48f0c822ed5ea9d7810c58f7c1f Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Thu, 27 Feb 2025 23:23:42 +0100 Subject: [PATCH 22/25] fix os.scandir error --- alphadia/workflow/manager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/alphadia/workflow/manager.py b/alphadia/workflow/manager.py index 51745178..20f4338c 100644 --- a/alphadia/workflow/manager.py +++ b/alphadia/workflow/manager.py @@ -816,13 +816,13 @@ def load_classifier_store(self, path: None | str = None): logger.info(f"Loading classifier store from {path}") for file in os.scandir(path): - if file.endswith(".pth"): - classifier_hash = file.split(".")[0] + if file.name.endswith(".pth"): + classifier_hash = file.name.split(".")[0] if classifier_hash not in self.classifier_store: classifier = deepcopy(self.classifier_base) classifier.from_state_dict( - torch.load(os.path.join(path, file), weights_only=False) + torch.load(file.path, weights_only=False) ) self.classifier_store[classifier_hash].append(classifier) From 1f4841f16b19e771f435698cbe5ab0d3dbabc5ed Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Fri, 28 Feb 2025 08:27:47 +0100 Subject: [PATCH 23/25] add TODO --- alphadia/fdrx/models/two_step_classifier.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index 2a7fc41a..5037c6f0 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -123,7 +123,7 @@ def fit_predict( previous_target_count_after_first_clf = get_target_count(df_train) # train and apply second classifier - self.second_classifier.epochs = 50 + self.second_classifier.epochs = 50 # TODO: Check if needed df_after_second_clf = self._train_and_apply_second_classifier( df_train, df_predict, x_cols, y_col, group_columns ) From 927960fd2367c26532f1ed5e80a3475054536406 Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Fri, 28 Feb 2025 08:42:21 +0100 Subject: [PATCH 24/25] fix typos --- alphadia/fdrx/models/two_step_classifier.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index 5037c6f0..5cc223f8 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -210,10 +210,7 @@ def _update_first_classifier( # noqa: PLR0913 group_columns: list[str], previous_count: int = -1, ) -> None: - """Fits a copy of the first classifier on a given subset and applies it to the full dataset. - - Returns the number of targets found and the trained classifier. - """ + """Train a copy of the first classifier on a subset, evaluate it on the full dataset, and update the original if performance improves.""" df_train = get_target_decoy_partners(subset_df, full_df) x_train = df_train[x_cols].to_numpy() y_train = df_train[y_col].to_numpy() @@ -233,7 +230,7 @@ def _update_first_classifier( # noqa: PLR0913 ) n_targets = get_target_count(df_targets) - # update first classifier if imrpovement + # update first classifier if improvement if n_targets > previous_count: logger.info( f"Updating the first classifier as new target count increased: {n_targets:,} > {previous_count:,}" @@ -241,8 +238,6 @@ def _update_first_classifier( # noqa: PLR0913 self.first_classifier = new_classifier previous_count = n_targets - # return previous_count - @property def fitted(self) -> bool: """Return whether both classifiers have been fitted.""" From f1610309cd37aaac6fc5aaa6b57ca3a7466414b4 Mon Sep 17 00:00:00 2001 From: anna-charlotte Date: Fri, 28 Feb 2025 09:00:07 +0100 Subject: [PATCH 25/25] pr comments --- alphadia/constants/default.yaml | 2 +- alphadia/fdrx/models/two_step_classifier.py | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/alphadia/constants/default.yaml b/alphadia/constants/default.yaml index 971a5842..847d37de 100644 --- a/alphadia/constants/default.yaml +++ b/alphadia/constants/default.yaml @@ -280,7 +280,7 @@ fdr: channel_wise_fdr: false # (Experimental) - # uses a two-step classifier consisting of a logistic regression and a neural network. + # uses a two-step classifier consisting of a logistic regression and a neural network enable_two_step_classifier: false # (Experimental) # Optimizes the batch size and learning rate of the neural network diff --git a/alphadia/fdrx/models/two_step_classifier.py b/alphadia/fdrx/models/two_step_classifier.py index 5cc223f8..cce9f49a 100644 --- a/alphadia/fdrx/models/two_step_classifier.py +++ b/alphadia/fdrx/models/two_step_classifier.py @@ -56,12 +56,14 @@ def __init__( # noqa: PLR0913 Too many arguments in function definition (> 5) f"second_classifier: {second_classifier.__class__.__name__}" ) - def fit_predict( + def fit_predict( # noqa: PLR0913 self, df: pd.DataFrame, x_cols: list[str], y_col: str = "decoy", group_columns: list[str] | None = None, + n_epochs_initial: int = 10, + n_epochs_final: int = 50, ) -> pd.DataFrame: """Train the two-step classifier and predict precursors using the following approach. @@ -79,6 +81,10 @@ def fit_predict( Target variable column name, defaults to 'decoy' group_columns : list[str] | None, optional Columns to group by for FDR calculations + n_epochs_initial : int, optional + Number of epochs for initial training of second classifier, defaults to 10 + n_epochs_final : int, optional + Number of epochs for final training of second classifier, defaults to 50 Returns ------- @@ -86,7 +92,6 @@ def fit_predict( DataFrame containing predictions and q-values """ - min_train_size = 1 logger.info("=== Starting training of TwoStepClassifier ===") df = self._preprocess_data(df, x_cols) @@ -94,7 +99,7 @@ def fit_predict( df_predict = df # train and apply NN classifier - self.second_classifier.epochs = 10 + self.second_classifier.epochs = n_epochs_initial df_after_second_clf = self._train_and_apply_second_classifier( df_train, df_predict, x_cols, y_col, group_columns ) @@ -116,14 +121,14 @@ def fit_predict( df_train = self._apply_filtering_with_first_classifier( df, x_cols, group_columns ) - if len(df_train) < min_train_size: + if len(df_train) <= 1: return best_result df_predict = df_train # using the same df for training and predicting, unlike in the following else block. previous_target_count_after_first_clf = get_target_count(df_train) # train and apply second classifier - self.second_classifier.epochs = 50 # TODO: Check if needed + self.second_classifier.epochs = n_epochs_final df_after_second_clf = self._train_and_apply_second_classifier( df_train, df_predict, x_cols, y_col, group_columns )