From 441166186155663ce4a123945e78fa3d5647b86e Mon Sep 17 00:00:00 2001 From: Joaquin Torres Bravo Date: Wed, 22 May 2024 13:04:57 +0200 Subject: [PATCH] Testing metric generation --- model_selection/cv_metric_gen.py | 19 ++++++++++--------- model_selection/output_cv_metrics.xlsx | Bin 0 -> 15625 bytes 2 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 model_selection/output_cv_metrics.xlsx diff --git a/model_selection/cv_metric_gen.py b/model_selection/cv_metric_gen.py index 1ba32c8..cffd6f8 100644 --- a/model_selection/cv_metric_gen.py +++ b/model_selection/cv_metric_gen.py @@ -81,9 +81,9 @@ def get_tuned_models(group_str, method_str): tuned_models = {} # Iterate through each row of the DataFrame for _, row in tuned_models_df.iterrows(): - model_name = row[0] + model_name = row.iloc[0] # Read dictionary - parameters = ast.literal_eval(row['Parameters']) + parameters = ast.literal_eval(row['Best Parameters']) # Add extra parameters if model_name == 'AB': parameters['algorithm'] = 'SAMME' @@ -177,7 +177,7 @@ if __name__ == "__main__": scores_sheets = {} # To store score dfs as sheets in the same excel file for i, group in enumerate(['pre', 'post']): for j, method in enumerate(['', '', 'over_', 'under_']): - print(f"{group}-{method_names[j]}") + # print(f"{group}-{method_names[j]}") # Get train dataset based on group and method X_train = data_dic['X_train_' + method + group] y_train = data_dic['y_train_' + method + group] @@ -188,12 +188,13 @@ if __name__ == "__main__": scores_df = pd.DataFrame(columns=range(1,11), index=[f"{model_name}_{metric_name}" for model_name in models.keys() for metric_name in scorings.keys()]) # Metric generation for each model for model_name, model in models.items(): - # Retrieve cv scores for our metrics of interest - scores = cross_validate(model, X_train, y_train, scoring=scorings, cv=cv, return_train_score=True, n_jobs=10) - # Save results of each fold - scores_df.loc[model_name +'_F1']=list(np.around(np.array(scores["test_f1"]),4)) - scores_df.loc[model_name +'_PREC']=list(np.around(np.array(scores["test_precision"]),4)) - scores_df.loc[model_name +'_REC']=list(np.around(np.array(scores["test_recall"]),4)) + if model_name == 'DT': + print(f"{group}-{method_names[j]}-{model_name}") + # Retrieve cv scores for our metrics of interest + scores = cross_validate(model, X_train, y_train, scoring=scorings, cv=cv, return_train_score=True, n_jobs=10) + # Save results of each fold + for metric_name in scorings.keys(): + scores_df.loc[model_name + f'_{metric_name}']=list(np.around(np.array(scores[f"test_{metric_name}"]),4)) # Store the DataFrame in the dictionary with a unique key for each sheet sheet_name = f"{group}_{method_names[j]}" scores_sheets[sheet_name] = scores_df diff --git a/model_selection/output_cv_metrics.xlsx b/model_selection/output_cv_metrics.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..41849ebdca3a33114e62b3092daf8ca9f3f42c05 GIT binary patch literal 15625 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 literal 0 HcmV?d00001 -- 2.24.1