diff --git a/explicability/shap_vals.py b/explicability/shap_vals.py new file mode 100644 index 0000000000000000000000000000000000000000..09a7cda36c555c3605d1259bc0055aed078f3708 --- /dev/null +++ b/explicability/shap_vals.py @@ -0,0 +1,13 @@ +# Libraries +# -------------------------------------------------------------------------------------------------------- +import pandas as pd +import numpy as np +from xgboost import XGBClassifier +from sklearn.metrics import confusion_matrix +from sklearn.metrics import f1_score, make_scorer, precision_score, recall_score, accuracy_score +from sklearn.ensemble import RandomForestClassifier, BaggingClassifier, AdaBoostClassifier +from sklearn.neural_network import MLPClassifier +from sklearn.svm import SVC +from sklearn.linear_model import LogisticRegression +from sklearn.tree import DecisionTreeClassifier +# -------------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/models/hyperparam_tuning.py b/model_selection/hyperparam_tuning.py similarity index 94% rename from models/hyperparam_tuning.py rename to model_selection/hyperparam_tuning.py index 311a7187f8126fb71c868ff104dc102c23e2c157..a404562cda4b8c259ee3408e98b601175ed8c145 100644 --- a/models/hyperparam_tuning.py +++ b/model_selection/hyperparam_tuning.py @@ -86,10 +86,10 @@ if __name__ == "__main__": models_1 = {"DT" : DecisionTreeClassifier(), "RF" : RandomForestClassifier(), "Bagging" : BaggingClassifier(), - "AB" : AdaBoostClassifier(), + "AB" : AdaBoostClassifier(algorithm='SAMME'), "XGB": XGBClassifier(), "LR" : LogisticRegression(max_iter=1000), - "ElNet" : LogisticRegression(max_iter=1000, penalty='elasticnet'), + # "ElNet" : LogisticRegression(max_iter=1000, penalty='elasticnet'), "SVM" : SVC(probability=True), "MLP" : MLPClassifier(max_iter=500) } @@ -98,12 +98,12 @@ if __name__ == "__main__": models_2 = {"DT" : DecisionTreeClassifier(class_weight='balanced'), "RF" : RandomForestClassifier(class_weight='balanced'), "Bagging" : BaggingClassifier(estimator= DecisionTreeClassifier(class_weight='balanced')), - "AB" : AdaBoostClassifier(estimator= DecisionTreeClassifier(class_weight='balanced')), + "AB" : AdaBoostClassifier(estimator= DecisionTreeClassifier(class_weight='balanced'), algorithm='SAMME'), # "XGB": XGBClassifier(), # <- "LR" : LogisticRegression(max_iter=1000, class_weight='balanced'), - "ElNet" : LogisticRegression(max_iter=1000, penalty='elasticnet', class_weight='balanced'), + # "ElNet" : LogisticRegression(max_iter=1000, penalty='elasticnet', class_weight='balanced'), "SVM" : SVC(probability=True, class_weight='balanced'), - # "MLP" : MLPClassifier(max_iter=500) + # "MLP" : MLPClassifier(max_iter=500) # <- } # Hyperparameter tuning setup @@ -124,9 +124,9 @@ if __name__ == "__main__": "XGB": {'n_estimators': randint(100, 1000), 'max_depth': randint(3, 10), 'learning_rate': uniform(0.01, 0.3)}, - "LR": {'penalty': ['l1', 'l2', None], + "LR": {'penalty': ['l1', 'l2', 'elasticnet', None], 'solver': ['lbfgs', 'sag', 'saga']}, - "EL": {'solver': ['lbfgs', 'sag', 'saga']}, + # "ElNet": {'solver': ['lbfgs', 'sag', 'saga']}, "SVM": {'C': uniform(0.8, 1.2), 'kernel': ['linear', 'poly', 'rbf', 'sigmoid']}, "MLP": {'activation': ['identity', 'logistic', 'tanh', 'relu'], diff --git a/models/output/hyperparam.xlsx b/model_selection/output/hyperparam.xlsx similarity index 100% rename from models/output/hyperparam.xlsx rename to model_selection/output/hyperparam.xlsx diff --git a/models/test_models.py b/model_selection/test_models.py similarity index 100% rename from models/test_models.py rename to model_selection/test_models.py diff --git a/models/eval_models.py b/models/eval_models.py deleted file mode 100644 index ad3a781233f8ccddae6779cc928cbc476b8c40af..0000000000000000000000000000000000000000 --- a/models/eval_models.py +++ /dev/null @@ -1,147 +0,0 @@ -""" - Selecting best models through cross validation and hyperparameter tunning - for each method: - 1. Original training dataset - 2. Original training dataset - Cost sensitive - 3. Oversampling - 4. Undersampling -""" - -# Libraries -# -------------------------------------------------------------------------------------------------------- -import pandas as pd -import numpy as np -from xgboost import XGBClassifier -from sklearn.metrics import confusion_matrix -from sklearn.metrics import f1_score, make_scorer, precision_score, recall_score -from sklearn.model_selection import StratifiedKFold, cross_validate -from sklearn.ensemble import RandomForestClassifier, BaggingClassifier, AdaBoostClassifier -from sklearn.neural_network import MLPClassifier -from sklearn.svm import SVC -from sklearn.linear_model import LogisticRegression -from sklearn.tree import DecisionTreeClassifier -# -------------------------------------------------------------------------------------------------------- - -def read_data(): - import numpy as np - - # Load test data - X_test_pre = np.load('gen_train_data/data/output/pre/X_test_pre.npy', allow_pickle=True) - y_test_pre = np.load('gen_train_data/data/output/pre/y_test_pre.npy', allow_pickle=True) - X_test_post = np.load('gen_train_data/data/output/post/X_test_post.npy', allow_pickle=True) - y_test_post = np.load('gen_train_data/data/output/post/y_test_post.npy', allow_pickle=True) - - # Load ORIGINAL training data - X_train_pre = np.load('gen_train_data/data/output/pre/X_train_pre.npy', allow_pickle=True) - y_train_pre = np.load('gen_train_data/data/output/pre/y_train_pre.npy', allow_pickle=True) - X_train_post = np.load('gen_train_data/data/output/post/X_train_post.npy', allow_pickle=True) - y_train_post = np.load('gen_train_data/data/output/post/y_train_post.npy', allow_pickle=True) - - # Load oversampled training data - X_train_over_pre = np.load('gen_train_data/data/output/pre/X_train_over_pre.npy', allow_pickle=True) - y_train_over_pre = np.load('gen_train_data/data/output/pre/y_train_over_pre.npy', allow_pickle=True) - X_train_over_post = np.load('gen_train_data/data/output/post/X_train_over_post.npy', allow_pickle=True) - y_train_over_post = np.load('gen_train_data/data/output/post/y_train_over_post.npy', allow_pickle=True) - - # Load undersampled training data - X_train_under_pre = np.load('gen_train_data/data/output/pre/X_train_under_pre.npy', allow_pickle=True) - y_train_under_pre = np.load('gen_train_data/data/output/pre/y_train_under_pre.npy', allow_pickle=True) - X_train_under_post = np.load('gen_train_data/data/output/post/X_train_under_post.npy', allow_pickle=True) - y_train_under_post = np.load('gen_train_data/data/output/post/y_train_under_post.npy', allow_pickle=True) - - data_dic = { - "X_test_pre": X_test_pre, - "y_test_pre": y_test_pre, - "X_test_post": X_test_post, - "y_test_post": y_test_post, - "X_train_pre": X_train_pre, - "y_train_pre": y_train_pre, - "X_train_post": X_train_post, - "y_train_post": y_train_post, - "X_train_over_pre": X_train_over_pre, - "y_train_over_pre": y_train_over_pre, - "X_train_over_post": X_train_over_post, - "y_train_over_post": y_train_over_post, - "X_train_under_pre": X_train_under_pre, - "y_train_under_pre": y_train_under_pre, - "X_train_under_post": X_train_under_post, - "y_train_under_post": y_train_under_post, - } - - return data_dic - -if __name__ == "__main__": - - # Reading training data - data_dic = read_data() - - # Defining the models to train - # -------------------------------------------------------------------------------------------------------- - # 1. No class weight - models_1 = {#"DT" : DecisionTreeClassifier(), - "RF" : RandomForestClassifier(n_estimators=50), - # "Bagging" : BaggingClassifier(), - # "AB" : AdaBoostClassifier(), - # "XGB": XGBClassifier(), - # "LR" : LogisticRegression(max_iter=1000), - # "ElNet" : LogisticRegression(max_iter=1000, penalty='elasticnet'), - # "SVM" : SVC(probability=True), - # "MLP" : MLPClassifier(max_iter=500), - } - - # 2. Class weight - models_2 = {#"DT" : DecisionTreeClassifier(class_weight='balanced'), - "RF" : RandomForestClassifier(n_estimators=50, class_weight='balanced'), - # "Bagging" : BaggingClassifier(), # <- - # "AB" : AdaBoostClassifier(), # <- - # "XGB": XGBClassifier(), # <- - # "LR" : LogisticRegression(max_iter=1000, class_weight='balanced'), - # "ElNet" : LogisticRegression(max_iter=1000, penalty='elasticnet', class_weight='balanced'), - # "SVM" : SVC(probability=True, class_weight='balanced'), - # "MLP" : MLPClassifier(max_iter=500), # <- - } - # -------------------------------------------------------------------------------------------------------- - - # Setup - # -------------------------------------------------------------------------------------------------------- - # Scorings to use for model evaluation - scorings = {'recall':make_scorer(recall_score), 'precision':make_scorer(precision_score)} - # Defining cross-validation protocol - cv = StratifiedKFold(n_splits=10, shuffle=True, random_state=1) - result_cols = [f"{model}_{metric}" for model in models_1.keys() for metric in ['PREC', 'REC']] - method_names = { - 0: "ORIG", - 1: "ORIG_CW", - 2: "OVER", - 3: "UNDER" - } - # -------------------------------------------------------------------------------------------------------- - - # Evaluating performance through cross validation and exporting results - # -------------------------------------------------------------------------------------------------------- - # Store each df as a sheet in an excel file - sheets_dict = {} - for i, group in enumerate(['pre', 'post']): - for j, method in enumerate(['', '', 'over_', 'under_']): - # Get dataset based on group and method - X = data_dic['X_train_' + method + group] - y = data_dic['y_train_' + method + group] - # Use group of models with class weight if needed - models = models_2 if j == 2 else models_1 - # Save results in dataframe (10 columns since 10-fold cv) - res_df = pd.DataFrame(columns=range(1,11), index=result_cols) - for model_name, model in models.items(): - cv_scores = cross_validate(model, X, y, scoring=scorings, cv=cv, return_train_score=True, n_jobs=1) - res_df.loc[model_name + '_PREC'] = list(np.around(np.array(cv_scores["test_precision"]),4)) - res_df.loc[model_name + '_REC'] = list(np.around(np.array(cv_scores["test_recall"]),4)) - - # Store the DataFrame in the dictionary with a unique key for each sheet - sheet_name = f"{group}_{method_names[j]}" - sheets_dict[sheet_name] = res_df - # Write results to Excel file - with pd.ExcelWriter('./training_models/output/cross_val_res.xlsx') as writer: - for sheet_name, data in sheets_dict.items(): - data.to_excel(writer, sheet_name=sheet_name) - # -------------------------------------------------------------------------------------------------------- - - diff --git a/models/output/cross_val_res.xlsx b/models/output/cross_val_res.xlsx deleted file mode 100644 index f1c0c3b472619e5938ec3f287c8972f748dd36ac..0000000000000000000000000000000000000000 Binary files a/models/output/cross_val_res.xlsx and /dev/null differ diff --git a/models/shap.py b/models/shap.py deleted file mode 100644 index afca58d504b45cfe4f6b3f5a90bd8f062d1aed00..0000000000000000000000000000000000000000 --- a/models/shap.py +++ /dev/null @@ -1,10 +0,0 @@ -# Libraries -# -------------------------------------------------------------------------------------------------------- -import shap -import numpy as np -# -------------------------------------------------------------------------------------------------------- - -# Load test data -X_test_pre = np.load('../gen_train_data/data/output/pre/X_test_pre.npy', allow_pickle=True) - -print(list(X_test_pre.columns.values)) \ No newline at end of file