Gambling/XG
0
1import pandas as pd2from sklearn.ensemble import GradientBoostingClassifier3from sklearn.metrics import (4 average_precision_score,5 roc_auc_score,6 f1_score,7 precision_score,8 recall_score,9 cohen_kappa_score,10 classification_report,11 confusion_matrix12)13from hyperopt import (14 hp,15 Trials,16 STATUS_OK,17 fmin,18 tpe19)20from data.const import Color21 22 23class ModelOptimizer:24 def __init__(self, X_train, y_train, X_test, y_test):25 self.X_train = X_train26 self.y_train = y_train27 self.X_test = X_test28 self.y_test = y_test29 self.hyperparameter_space = {30 'learning_rate': hp.uniform('learning_rate', 0.05, 0.3),31 'min_samples_leaf': hp.choice('min_samples_leaf', range(15, 200)),32 'max_depth': hp.choice('max_depth', range(2, 20)),33 'max_features': hp.choice('max_features', range(3, 27))34 }35 self.trials = Trials()36 37 def evaluate_model(self, params):38 model = GradientBoostingClassifier(39 learning_rate=params['learning_rate'],40 min_samples_leaf=params['min_samples_leaf'],41 max_depth = params['max_depth'],42 max_features = params['max_features']43 )44 model.fit(self.X_train, self.y_train)45 return {46 'learning_rate': params['learning_rate'],47 'min_samples_leaf': params['min_samples_leaf'],48 'max_depth': params['max_depth'],49 'max_features': params['max_features'],50 'train_ROCAUC': roc_auc_score(self.y_train, model.predict_proba(self.X_train)[:, 1]),51 'test_ROCAUC': roc_auc_score(self.y_test, model.predict_proba(self.X_test)[:, 1]),52 'recall': recall_score(self.y_test, model.predict(self.X_test)),53 'precision': precision_score(self.y_test, model.predict(self.X_test)),54 'f1_score': f1_score(self.y_test, model.predict(self.X_test)),55 'train_accuracy': model.score(self.X_train, self.y_train),56 'test_accuracy': model.score(self.X_test, self.y_test),57 }58 59 def objective(self, params):60 res = self.evaluate_model(params)61 res['loss'] = - res['test_ROCAUC']62 res['status'] = STATUS_OK63 return res 64 65 def fmin(self, max_evals):66 fmin(67 self.objective,68 space=self.hyperparameter_space,69 algo=tpe.suggest,70 max_evals=max_evals,71 trials=self.trials72 )73 74 def get_best_score(self, metric='f1_score', ascending=False):75 best_score = pd.DataFrame(self.trials.results).sort_values(by=metric, ascending=ascending).head(5)76 print(best_score)77 return best_score78 79 def choice_best_params(self, best_score):80 model = GradientBoostingClassifier(81 learning_rate=best_score['learning_rate'][0],82 min_samples_leaf=best_score['min_samples_leaf'][0],83 max_depth = best_score['max_depth'][0],84 max_features = best_score['max_features'][0]85 )86 model.fit(self.X_train, self.y_train)87 return model88 89 def evaluate_metrics(self, model):90 print('Le jeu de test contient {} examples de tir et {} sont des buts.'.format(len(self.y_test), self.y_test.sum()))91 print('Le model obtien une ROC-AUC de {}%'.format(round(roc_auc_score(self.y_test, model.predict_proba(self.X_test)[:, 1])*100),2))92 print('La performance de base pour PR-AUC est de {}%.'.format(round(self.y_train.mean(),2)))93 print('Le modele obtien une PR-AUC de {}%.'.format(round(average_precision_score(self.y_test, model.predict_proba(self.X_test)[:, 1])*100,2)))94 print('Le modele obtien un Cohen Kappa de {}.'.format(round(cohen_kappa_score(self.y_test,model.predict(self.X_test)),2)))95 print(Color.BOLD + Color.YELLOW + 'Matrice de confusion:\n' + Color.END)96 print(confusion_matrix(self.y_test,model.predict(self.X_test)))97 print(Color.BOLD + Color.YELLOW + '\n Rapport de classification:' + Color.END)98 print(classification_report(self.y_test,model.predict(self.X_test)))99 print('\n Probabilités xGoal:', model.predict_proba(self.X_test))100 101 