DJONG-WANG commited on
Commit
7a82bc6
·
verified ·
1 Parent(s): 01da876

Upload 15 files

Browse files
images/home.jpg ADDED
images/logo_isj.jpeg ADDED
images/model.jpg ADDED
images/model2.jpg ADDED
models/__pycache__/model.cpython-311.pyc ADDED
Binary file (4.82 kB). View file
 
models/h5/arbre_descision_model.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2aa37c8d7e4ec847326abe2996d57dcd720c0a163b9d8707facffcda35b9d488
3
+ size 2255705
models/h5/knn_model.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:fbf26f8d570afb310ea40014ef8692261ce31627565ee5d71f3df4a65c21a7ca
3
+ size 114602
models/h5/random_forest_model.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e6cac3b4c8aa449be4d8635200414c0473f7e352f88b580dc756b3811307ba1b
3
+ size 1328345
models/h5/svc_linear_model.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a45e038fcd338cb6320b0f6448125bb33bbb2c3436861cb1394fde64591444bf
3
+ size 81921
models/h5/svc_model.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a45e038fcd338cb6320b0f6448125bb33bbb2c3436861cb1394fde64591444bf
3
+ size 81921
models/h5/xgb_model.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6d129877a228a35b97f6d750e3744eb05e8c20f43f90e19ba8761820e9b7ecfa
3
+ size 180954
models/model.py ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from joblib import load
2
+ from sklearn.preprocessing import PowerTransformer
3
+ import os
4
+
5
+ #ENCODED CLASS IN ORDER
6
+ JOB_CLASSE = ['admin.','blue-collar','entrepreneur','housemaid','management','retired','self-employed','services','student','technician','unemployed','unknown']
7
+ EDUCATION_CLASSE = ['primary','secondary','tertiary','unknown']
8
+ MARITAL_CLASSE = ['divorced','married','single']
9
+ CONTACT_CLASSE = ['cellular','telephone','unknown']
10
+ MONTH_CLASSE = ['apr','aug','dec','feb','jan','jul','jun','mar','may','nov','oct','sep']
11
+ POUTCOME_CLASSE = ['failure','other','success','unknown']
12
+ BINARY_CLASSE = ['no','yes']
13
+
14
+ def transform_data(data):
15
+ # Initialisez PowerTransformer avec la méthode 'yeo-johnson'
16
+ transformer = PowerTransformer(method='yeo-johnson')
17
+ # Ajustez le transformer aux données et transformez les données en les normalisant
18
+ pdays_normalized = transformer.fit_transform(data[['pdays']])
19
+ day_normalized = transformer.fit_transform(data[['day']])
20
+ age_normalized = transformer.fit_transform(data[['age']])
21
+ balance_normalized = transformer.fit_transform(data[['balance']])
22
+ duration_normalized = transformer.fit_transform(data[['duration']])
23
+ campaign_normalized = transformer.fit_transform(data[['campaign']])
24
+ previous_normalized = transformer.fit_transform(data[['previous']])
25
+ # Remplacez les valeurs dans le DataFrame original par les valeurs normalisées
26
+ data['pdays'] = pdays_normalized
27
+ data['age'] = age_normalized
28
+ data['balance'] = balance_normalized
29
+ data['duration'] = duration_normalized
30
+ data['campaign'] = campaign_normalized
31
+ data['day'] = day_normalized
32
+ data['previous'] = previous_normalized
33
+
34
+ #categorical variable
35
+ data['job'] = [JOB_CLASSE.index(data['job'][0])]
36
+ data['marital'] = [MARITAL_CLASSE.index(data['marital'][0])]
37
+ data['education'] = [EDUCATION_CLASSE.index(data['education'][0])]
38
+ data['default'] = [BINARY_CLASSE.index(data['default'][0])]
39
+ data['housing'] = [BINARY_CLASSE.index(data['housing'][0])]
40
+ data['loan'] = [BINARY_CLASSE.index(data['loan'][0])]
41
+ data['contact'] = [CONTACT_CLASSE.index(data['contact'][0])]
42
+ data['month'] = [MONTH_CLASSE.index(data['month'][0])]
43
+ data['poutcome'] = [POUTCOME_CLASSE.index(data['poutcome'][0])]
44
+
45
+ return data
46
+
47
+ def xg_boost_model(data):
48
+ path = os.path.abspath('models/h5/xgb_model.h5')
49
+ model = load(path)
50
+ return model.predict(data)
51
+
52
+ def svc_model(data):
53
+ path = os.path.abspath('models/h5/svc_model.h5')
54
+ model = load(path)
55
+ return model.predict(data)
56
+
57
+ def knn_model(data):
58
+ path = os.path.abspath('models/h5/knn_model.h5')
59
+ model = load(path)
60
+ return model.predict(data)
61
+
62
+ def ramdom_forest_model(data):
63
+ path = os.path.abspath('models/h5/random_forest_model.h5')
64
+ model = load(path)
65
+ return model.predict(data)
66
+
67
+ def svc_linear_model(data):
68
+ path = os.path.abspath('models/h5/svc_linear_model.h5')
69
+ model = load(path)
70
+ return model.predict(data)
pages/Analyse.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ from ydata_profiling import ProfileReport
4
+ from streamlit_ydata_profiling import st_profile_report
5
+ from menu import get_menu
6
+
7
+ st.set_page_config(
8
+ layout="wide"
9
+ )
10
+
11
+ get_menu()
12
+
13
+ df = pd.read_csv('bank_data.csv').drop(columns=['Unnamed: 0'])
14
+
15
+ report = ProfileReport(df, title="Analyse des données")
16
+
17
+ st_profile_report(report, navbar=True)
pages/Models.py ADDED
@@ -0,0 +1,487 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from menu import get_menu
3
+
4
+ st.set_page_config(
5
+ layout="wide"
6
+ )
7
+
8
+ get_menu()
9
+
10
+
11
+ st.image('images/model2.jpg', use_column_width='always')
12
+ st.markdown(
13
+ """
14
+ <style>
15
+ img {
16
+ object-fit: cover;
17
+ max-height: 500px;
18
+ border-radius: 5px;
19
+ position: relative;
20
+ z-index: 0;
21
+ }
22
+ </style>
23
+ """,
24
+ unsafe_allow_html=True,
25
+ )
26
+ st.title("Résultats statistique")
27
+ st.markdown(
28
+ """
29
+ Apres une etude de notre jeux de donnés nous avons tirré quelques conclusions :
30
+ - les données sont desequilibré car nous avons **500 client qui disent oui et 4000 non**.
31
+ Au vue de cela nous avons decider de **reduire le jeux de données (ramené les nom à 500)** pour que nos model puissent bien s'entrainer.
32
+ - les distribution des variables **[age, balance, duration, campaign, pdays]** ne sont pas bonne
33
+ donc nous avons fais une transformation de ses variables avec **PowerTransformer de sklearn.preprocessing** en utlisant la méthode **yeo-johnson**.
34
+ """
35
+ )
36
+
37
+ col1, col2 = st.columns([2, .5])
38
+ selected_model = col2.selectbox(label="", options=["XGBOOST", "KNN", "SVC LINEAIRE","SVC", "RAMDOM FOREST"])
39
+ message = f"Description du model {selected_model}"
40
+ col1.title(message)
41
+
42
+ if selected_model == "KNN":
43
+ st.markdown(
44
+ """
45
+ ### #Méthode des k plus proches voisins(KNN)
46
+ C'est un algorithme d'apprentissage automatique supervisé qui attribue une catégorie à un élément
47
+ en fonction de la classe majoritaire des ses plus proches voisins dans l'échantillon d'entraînement.
48
+ #### #Code
49
+ ```python
50
+ from sklearn.neighbors import KNeighborsClassifier
51
+ from sklearn.model_selection import GridSearchCV
52
+ from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
53
+ import seaborn as sns
54
+ import matplotlib.pyplot as plt
55
+
56
+ # Définissez la grille des hyperparamètres à explorer
57
+ param_grid = {
58
+ 'n_neighbors': [3, 5, 7, 8, 9], # Nombre de voisins à considérer
59
+ 'weights': ['uniform', 'distance'], # Méthode de pondération des voisins
60
+ 'p': [1, 2] # Paramètre de distance (1 pour la distance de Manhattan, 2 pour la distance euclidienne)
61
+ }
62
+
63
+ # Initialisez le modèle KNeighborsClassifier
64
+ knn_model = KNeighborsClassifier()
65
+
66
+ # Initialisez GridSearchCV avec le modèle, la grille de paramètres et la méthode de validation croisée
67
+ grid_search = GridSearchCV(estimator=knn_model, param_grid=param_grid, cv=5)
68
+
69
+ # Ajustez GridSearchCV aux données d'entraînement
70
+ grid_search.fit(X_train, y_train)
71
+
72
+ # Affichez les meilleurs paramètres et la meilleure précision
73
+ print("Meilleurs paramètres:", grid_search.best_params_)
74
+ print("Meilleure précision:", grid_search.best_score_)
75
+
76
+ # Créez un nouveau modèle KNeighborsClassifier avec les meilleurs paramètres identifiés
77
+ best_knn_model = KNeighborsClassifier(**grid_search.best_params_)
78
+
79
+ # Entraînez le modèle sur l'ensemble des données d'entraînement
80
+ best_knn_model.fit(X_train, y_train)
81
+
82
+ # Prédictions sur l'ensemble de test
83
+ y_pred_knn = best_knn_model.predict(X_test)
84
+
85
+ # Calcul de la précision
86
+ accuracy_knn = accuracy_score(y_test, y_pred_knn)
87
+ print("Précision sur l'ensemble de test:", accuracy_knn)
88
+
89
+ # Calcul de la précision
90
+ precision_knn = precision_score(y_test, y_pred_knn)
91
+ print("Précision sur l'ensemble de test:", precision_knn)
92
+
93
+ # Calcul du rappel
94
+ recall_knn = recall_score(y_test, y_pred_knn)
95
+ print("Rappel sur l'ensemble de test:", recall_knn)
96
+
97
+ # Calcul du score F1
98
+ f1_knn = f1_score(y_test, y_pred_knn)
99
+ print("Score F1 sur l'ensemble de test:", f1_knn)
100
+
101
+ # Calculer la matrice de confusion
102
+ conf_matrix_knn = confusion_matrix(y_test, y_pred_knn)
103
+
104
+ # Afficher la matrice de confusion avec seaborn
105
+ plt.figure(figsize=(8, 6))
106
+ sns.heatmap(conf_matrix_knn, annot=True, cmap='Blues', fmt='d', cbar=False)
107
+ plt.xlabel('Prédictions')
108
+ plt.ylabel('Vraies étiquettes')
109
+ plt.title('Matrice de Confusion - KNeighborsClassifier')
110
+ plt.show()
111
+ ```
112
+ #### #Résultats
113
+ - Meilleurs paramètres:
114
+ ```json
115
+ {
116
+ k_voisins : 5,
117
+ p : 1,
118
+ weights : 'distance'
119
+ }
120
+ ```
121
+ - Meilleure précision: **70%**
122
+ - Précision sur l'ensemble de test: **69%**
123
+ - Précision sur l'ensemble de test: **73%**
124
+ - Rappel sur l'ensemble de test: **64%**
125
+ - Score F1 sur l'ensemble de test: **68%**
126
+ """
127
+ )
128
+
129
+ if selected_model == "SVC LINEAIRE":
130
+ st.markdown(
131
+ """
132
+ ### #Méthode SVC LINEAIRE
133
+ Les machines à vecteurs de support (SVM) sont un ensemble de techniques d'apprentissage supervisé destinées à résoudre des problèmes de discrimination et de régression.
134
+ Le SVM et le SVC implémentent le même algorithme mais de maniere différente.
135
+ Le module SVM (SVC, NuSVC, etc.) est une enveloppe autour de la bibliothèque libsvm et prend en charge différents noyaux,
136
+ tandis que LinearSVC est basé sur liblinear et ne prend en charge qu'un noyau linéaire.
137
+ #### #Code
138
+ ```python
139
+ # Définissez la grille des hyperparamètres à explorer
140
+ param_grid = {
141
+ 'C': [0.01, 0.1, 0.9, 1, 1.1, 1.2, 1.5, ], # Paramètre de régularisation
142
+ 'loss': ['hinge', 'squared_hinge'], # Fonction de perte
143
+ 'max_iter': [900,1000, 1500, 2000] # Nombre maximum d'itérations
144
+ }
145
+
146
+ # Initialisez le modèle LinearSVC
147
+ svc_model = LinearSVC()
148
+
149
+ # Initialisez GridSearchCV avec le modèle, la grille de paramètres et la méthode de validation croisée
150
+ grid_search = GridSearchCV(estimator=svc_model, param_grid=param_grid, cv=5)
151
+
152
+ # Ajustez GridSearchCV aux données d'entraînement
153
+ grid_search.fit(X_train, y_train)
154
+ from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
155
+
156
+ # Prédiction sur l'ensemble de test
157
+ y_pred = best_svc_model.predict(X_test)
158
+
159
+ # Calcul de la précision
160
+ accuracy = accuracy_score(y_test, y_pred)
161
+ print("Précision sur l'ensemble de test:", accuracy)
162
+
163
+ # Calcul de la précision
164
+ precision = precision_score(y_test, y_pred)
165
+ print("Précision sur l'ensemble de test:", precision)
166
+
167
+ # Calcul du rappel
168
+ recall = recall_score(y_test, y_pred)
169
+ print("Rappel sur l'ensemble de test:", recall)
170
+
171
+ # Calcul du score F1
172
+ f1 = f1_score(y_test, y_pred)
173
+ print("Score F1 sur l'ensemble de test:", f1)from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
174
+
175
+ # Prédiction sur l'ensemble de test
176
+ y_pred = best_svc_model.predict(X_test)
177
+
178
+ # Calcul de la précision
179
+ accuracy = accuracy_score(y_test, y_pred)
180
+ print("Précision sur l'ensemble de test:", accuracy)
181
+
182
+ # Calcul de la précision
183
+ precision = precision_score(y_test, y_pred)
184
+ print("Précision sur l'ensemble de test:", precision)
185
+
186
+ # Calcul du rappel
187
+ recall = recall_score(y_test, y_pred)
188
+ print("Rappel sur l'ensemble de test:", recall)
189
+
190
+ # Calcul du score F1
191
+ f1 = f1_score(y_test, y_pred)
192
+ print("Score F1 sur l'ensemble de test:", f1)
193
+
194
+ from sklearn.metrics import confusion_matrix
195
+ import seaborn as sns
196
+ import matplotlib.pyplot as plt
197
+
198
+ # Calculer la matrice de confusion
199
+ conf_matrix = confusion_matrix(y_test, y_pred)
200
+
201
+ # Afficher la matrice de confusion avec seaborn
202
+ plt.figure(figsize=(8, 6))
203
+ sns.heatmap(conf_matrix, annot=True, cmap='Blues', fmt='d', cbar=False)
204
+ plt.xlabel('Prédictions')
205
+ plt.ylabel('Vraies étiquettes')
206
+ plt.title('Matrice de Confusion')
207
+ plt.show()
208
+ ```
209
+ #### #Résultats
210
+ - Meilleurs paramètres:
211
+ ```json
212
+ {
213
+ C : 0.01,
214
+ loss : 'hinge',
215
+ max_iter : 900,
216
+ }
217
+ ```
218
+ - Meilleure précision: **79%**
219
+ - Précision sur l'ensemble de test: **78%**
220
+ - Précision sur l'ensemble de test: **77%**
221
+ - Rappel sur l'ensemble de test: **80%**
222
+ - Score F1 sur l'ensemble de test: **79%**
223
+ """
224
+ )
225
+
226
+ if selected_model == "SVC":
227
+ st.markdown(
228
+ """
229
+ ### #Méthode SVC
230
+ Les machines à vecteurs de support (SVM) sont un ensemble de techniques d'apprentissage supervisé destinées à résoudre des problèmes de discrimination et de régression.
231
+ Le SVM et le SVC implémentent le même algorithme mais de maniere différente.
232
+ Le module SVM (SVC, NuSVC, etc.) est une enveloppe autour de la bibliothèque libsvm et prend en charge différents noyaux,
233
+ tandis que LinearSVC est basé sur liblinear et ne prend en charge qu'un noyau linéaire.
234
+ #### #Code
235
+ ```python
236
+ from sklearn.svm import SVC
237
+ from sklearn.model_selection import GridSearchCV
238
+ from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
239
+ import seaborn as sns
240
+ import matplotlib.pyplot as plt
241
+
242
+ # Définissez la grille des hyperparamètres à explorer
243
+ param_grid = {
244
+ 'C': [1e-5, 1e-4, 1e-3, 1e-2, 1e-1], # Paramètre de régularisation
245
+ 'kernel': ['linear', 'rbf', 'poly'], # Type de noyau
246
+ 'gamma': ['scale', 'auto'], # Coefficient gamma pour le noyau RBF
247
+ }
248
+
249
+ # Initialisez le modèle SVC
250
+ svc_model = SVC()
251
+
252
+ # Initialisez GridSearchCV avec le modèle, la grille de paramètres et la méthode de validation croisée
253
+ grid_search = GridSearchCV(estimator=svc_model, param_grid=param_grid, cv=5, n_jobs=-1)
254
+
255
+ # Ajustez GridSearchCV aux données d'entraînement
256
+ grid_search.fit(X_train, y_train)
257
+
258
+ # Affichez les meilleurs paramètres et la meilleure précision
259
+ print("Meilleurs paramètres:", grid_search.best_params_)
260
+ print("Meilleure précision:", grid_search.best_score_)
261
+
262
+ # Créez un nouveau modèle SVC avec les meilleurs paramètres identifiés
263
+ best_svc_model = SVC(**grid_search.best_params_)
264
+
265
+ # Entraînez le modèle sur l'ensemble des données d'entraînement
266
+ best_svc_model.fit(X_train, y_train)
267
+
268
+ # Prédictions sur l'ensemble de test
269
+ y_pred_svc = best_svc_model.predict(X_test)
270
+
271
+ # Calcul de la précision
272
+ accuracy_svc = accuracy_score(y_test, y_pred_svc)
273
+ print("Précision sur l'ensemble de test:", accuracy_svc)
274
+
275
+ # Calcul de la précision
276
+ precision_svc = precision_score(y_test, y_pred_svc)
277
+ print("Précision sur l'ensemble de test:", precision_svc)
278
+
279
+ # Calcul du rappel
280
+ recall_svc = recall_score(y_test, y_pred_svc)
281
+ print("Rappel sur l'ensemble de test:", recall_svc)
282
+
283
+ # Calcul du score F1
284
+ f1_svc = f1_score(y_test, y_pred_svc)
285
+ print("Score F1 sur l'ensemble de test:", f1_svc)
286
+
287
+ # Calculer la matrice de confusion
288
+ conf_matrix_svc = confusion_matrix(y_test, y_pred_svc)
289
+
290
+ # Afficher la matrice de confusion avec seaborn
291
+ plt.figure(figsize=(8, 6))
292
+ sns.heatmap(conf_matrix_svc, annot=True, cmap='Blues', fmt='d', cbar=False)
293
+ plt.xlabel('Prédictions')
294
+ plt.ylabel('Vraies étiquettes')
295
+ plt.title('Matrice de Confusion - SVC')
296
+ plt.show()
297
+ ```
298
+ #### #Résultats
299
+ - Meilleurs paramètres:
300
+ ```json
301
+ {
302
+ C : 0.01,
303
+ gamma : 'scale',
304
+ kernel : 'linear'
305
+ }
306
+ ```
307
+ - Meilleure précision: **79%**
308
+ - Précision sur l'ensemble de test: **78%**
309
+ - Précision sur l'ensemble de test: **77%**
310
+ - Rappel sur l'ensemble de test: **80%**
311
+ - Score F1 sur l'ensemble de test: **79%**
312
+ """
313
+ )
314
+
315
+ if selected_model == "RAMDOM FOREST":
316
+ st.markdown(
317
+ """
318
+ ### #Méthode de la forêt aléatoire (RAMDOM FOREST)
319
+ La forêt aléatoire est un algorithme d'apprentissage automatique couramment utilisé, qui permet d'assembler les sorties de plusieurs arbres de décision pour atteindre un résultat unique.
320
+ Sa souplesse d'utilisation et sa flexibilité ont favorisé son adoption, car il gère à la fois les problèmes de classification et de régression.
321
+ #### #Code
322
+ ```python
323
+ from sklearn.ensemble import RandomForestClassifier
324
+ from sklearn.model_selection import GridSearchCV
325
+ from sklearn.metrics import confusion_matrix, accuracy_score, roc_curve
326
+ import matplotlib.pyplot as plt
327
+ import seaborn as sns
328
+ from sklearn.metrics import confusion_matrix, accuracy_score, roc_curve, precision_score, recall_score, f1_score
329
+ # Définir la grille des hyperparamètres à explorer
330
+ param_grid = {
331
+ 'n_estimators': [25,50, 100, 150],
332
+ 'max_depth': [None, 10, 20,25],
333
+ 'min_samples_split': [2, 5, 10,15],
334
+ 'min_samples_leaf': [1, 2, 4,6]
335
+ }
336
+
337
+ # Initialiser le modèle Random Forest
338
+ rf_model = RandomForestClassifier()
339
+
340
+ # Initialiser GridSearchCV avec le modèle, la grille des hyperparamètres et la méthode de validation croisée
341
+ grid_search = GridSearchCV(estimator=rf_model, param_grid=param_grid, cv=5, n_jobs=-1)
342
+
343
+ # Ajuster GridSearchCV aux données d'entraînement
344
+ grid_search.fit(X_train, y_train)
345
+
346
+ # Afficher les meilleurs paramètres et la meilleure précision
347
+ print("Meilleurs paramètres:", grid_search.best_params_)
348
+ #print("Meilleure précision:", grid_search.best_score_)
349
+
350
+ # Créer un nouveau modèle Random Forest avec les meilleurs paramètres identifiés
351
+ best_rf_model = RandomForestClassifier(**grid_search.best_params_)
352
+
353
+ # Entraîner le modèle sur l'ensemble des données d'entraînement
354
+ best_rf_model.fit(X_train, y_train)
355
+
356
+ # Faire des prédictions sur l'ensemble de test
357
+ y_pred = best_rf_model.predict(X_test)
358
+
359
+ # Calculer la matrice de confusion
360
+ conf_matrix = confusion_matrix(y_test, y_pred)
361
+
362
+ # Afficher la matrice de confusion avec seaborn
363
+ plt.figure(figsize=(8, 6))
364
+ sns.heatmap(conf_matrix, annot=True, cmap='Blues', fmt='d', cbar=False)
365
+ plt.xlabel('Prédictions')
366
+ plt.ylabel('Vraies étiquettes')
367
+ plt.title('Matrice de Confusion - Random Forest')
368
+ plt.show()
369
+
370
+ # Calculer les probabilités prédites pour la classe positive (utilisé pour tracer la courbe ROC)
371
+ y_probs = best_rf_model.predict_proba(X_test)[:, 1]
372
+
373
+ # Calculer la courbe ROC
374
+ fpr, tpr, thresholds = roc_curve(y_test, y_probs)
375
+
376
+ # Afficher la courbe ROC
377
+ plt.figure(figsize=(8, 6))
378
+ plt.plot(fpr, tpr, label='Random Forest')
379
+ plt.plot([0, 1], [0, 1], 'k--', label='Random')
380
+ plt.xlabel('Taux de Faux Positifs')
381
+ plt.ylabel('Taux de Vrais Positifs')
382
+ plt.title('Courbe ROC - Random Forest')
383
+ plt.legend()
384
+ plt.show()
385
+
386
+ # Calculer et afficher l'accuracy
387
+ accuracy = accuracy_score(y_test, y_pred)
388
+ # Calculer la précision
389
+ precision = precision_score(y_test, y_pred)
390
+
391
+ # Calculer le rappel
392
+ recall = recall_score(y_test, y_pred)
393
+
394
+ # Calculer le F1-score
395
+ f1 = f1_score(y_test, y_pred)
396
+
397
+ ```
398
+ #### #Résultats
399
+ - Meilleurs paramètres:
400
+ ```json
401
+ {
402
+ max_depth : 10,
403
+ min_samples_leaf : 2,
404
+ min_samples_split : 5,
405
+ n_estimators : 100,
406
+ }
407
+ ```
408
+ - Accuracy: 82%
409
+ - Précision: 80%
410
+ - Rappel: 88%
411
+ - F1-score: 84%
412
+ """
413
+ )
414
+
415
+
416
+ if selected_model == "XGBOOST":
417
+ st.markdown(
418
+ """
419
+ ### #Méthode XGBOOST
420
+ **XGBOOST** ( eXtreme Gradient Boosting ) est une bibliothèque permettant d’entraîner des algorithmes de Gradient Boosting.
421
+ Le **Gradient Boosting** consiste à entraîner une série de modèles. Chaque modèle est entraîné dans le but de corriger les erreurs du modèle précédent. La prédiction finale est faite en combinant les prédictions de tous les modèles de la série.
422
+ #### #Code
423
+ ```python
424
+ from xgboost import XGBClassifier
425
+ from sklearn.model_selection import GridSearchCV
426
+ from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score
427
+ import matplotlib.pyplot as plt
428
+ import seaborn as sns
429
+
430
+ # Définir la grille des hyperparamètres à explorer
431
+ param_grid = {
432
+ 'n_estimators': [100, 200, 300],
433
+ 'max_depth': [3, 4, 5],
434
+ 'learning_rate': [0.01, 0.05, 0.1],
435
+ }
436
+
437
+ # Initialiser le modèle XGBClassifier
438
+ xgb_model = XGBClassifier()
439
+
440
+ # Initialiser GridSearchCV avec le modèle, la grille des hyperparamètres et la méthode de validation croisée
441
+ grid_search = GridSearchCV(estimator=xgb_model, param_grid=param_grid, cv=5, n_jobs=-1)
442
+
443
+ # Ajuster GridSearchCV aux données d'entraînement
444
+ grid_search.fit(X_train, y_train)
445
+
446
+ # Afficher les meilleurs paramètres et la meilleure précision
447
+ print("Meilleurs paramètres:", grid_search.best_params_)
448
+
449
+ # Créer un nouveau modèle XGBClassifier avec les meilleurs paramètres identifiés
450
+ best_xgb_model = XGBClassifier(**grid_search.best_params_)
451
+
452
+ # Entraîner le modèle sur l'ensemble des données d'entraînement
453
+ best_xgb_model.fit(X_train, y_train)
454
+
455
+ # Faire des prédictions sur l'ensemble de test
456
+ y_pred = best_xgb_model.predict(X_test)
457
+
458
+ # Afficher la matrice de confusion
459
+ conf_matrix = confusion_matrix(y_test, y_pred)
460
+ plt.figure(figsize=(8, 6))
461
+ sns.heatmap(conf_matrix, annot=True, cmap='Blues', fmt='d', cbar=False)
462
+ plt.xlabel('Prédictions')
463
+ plt.ylabel('Vraies étiquettes')
464
+ plt.title('Matrice de Confusion - XGBClassifier')
465
+ plt.show()
466
+
467
+ # Afficher les métriques
468
+ accuracy = accuracy_score(y_test, y_pred)
469
+ precision = precision_score(y_test, y_pred)
470
+ recall = recall_score(y_test, y_pred)
471
+ f1 = f1_score(y_test, y_pred)
472
+ ```
473
+ #### #Résultats
474
+ - Meilleurs paramètres:
475
+ ```json
476
+ {
477
+ learning_rate : 0.1,
478
+ max_depth : 5,
479
+ n_estimators : 100
480
+ }
481
+ ```
482
+ - Accuracy: **83%**
483
+ - Précision: **81%**
484
+ - Rappel: **87%**
485
+ - F1-score: **84%**
486
+ """
487
+ )
pages/Prediction.py ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import models.model as mod
4
+ from menu import get_menu
5
+
6
+ st.set_page_config(
7
+ layout="centered"
8
+ )
9
+ get_menu()
10
+
11
+
12
+
13
+ st.title("Formulaire")
14
+
15
+ with st.form("prediction_form", border=False):
16
+ # info bancaire
17
+ name = st.text_input('Votre nom')
18
+ age = st.number_input('Votre age', min_value=16)
19
+
20
+ job,education = st.columns(2)
21
+ job_val = job.selectbox('Votre metier', ["admin.","unknown","unemployed","management","housemaid","entrepreneur","student","blue-collar","self-employed","retired","technician","services"])
22
+ education_val = education.selectbox('Votre niveau d\'etude', ["unknown","secondary","primary","tertiary"])
23
+ marital = st.selectbox('Votre status marital', ["married","divorced","single"])
24
+
25
+ balance = st.number_input('Votre solde annuel moyen (en euro)', min_value=1)
26
+
27
+ default = st.checkbox('Avez vous un crédit en déficite ?')
28
+ housing = st.checkbox('Avez vous un pret logement ?')
29
+ loan = st.checkbox('Avez vous un pret ?')
30
+
31
+ #informations contact
32
+
33
+ contact = st.selectbox('Moyen de contact', ["unknown","telephone","cellular"])
34
+ day,month = st.columns([2,2])
35
+
36
+ day_val = day.number_input('Dernier jours de contact du mois', min_value=0)
37
+ month_val = month.selectbox('Dernier mois de contact de l\'année', ['jan','fed','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'])
38
+ duration = st.number_input('Durée de la derniere conversation', min_value=0)
39
+
40
+ #autres infos
41
+ campaign = st.number_input('Nombre de contact effectuer pour cette campagne', min_value=0)
42
+ pdays = st.number_input('Nombre de jours ecoulé depuis le dernier contact', min_value=0)
43
+ previous = st.number_input('Nombre de contact effectuer avant cette campagne', min_value=0)
44
+ poutcome = st.selectbox('Resultat de la derniere campagne', ["unknown","other","failure","success"])
45
+
46
+
47
+ selected_model = st.selectbox('Choisir le model', ["XGBOOST", "KNN", "SVC LINEAIRE","SVC", "RAMDOM FOREST"])
48
+
49
+
50
+ submitted = st.form_submit_button('Predire le choix', use_container_width=True)
51
+
52
+ if submitted:
53
+ if name == "":
54
+ st.error('Le nom est obligatoire !')
55
+ else:
56
+ data_vals = [
57
+ age,
58
+ job_val,
59
+ marital,
60
+ education_val,
61
+ 'yes' if default else 'no',
62
+ balance,
63
+ 'yes' if housing else 'no',
64
+ 'yes' if loan else 'no',
65
+ contact,
66
+ day_val,
67
+ month_val,
68
+ duration,
69
+ campaign,
70
+ pdays,
71
+ previous,
72
+ poutcome
73
+ ]
74
+ index = [
75
+ "age",
76
+ "job",
77
+ "marital",
78
+ "education",
79
+ "default",
80
+ "balance",
81
+ "housing",
82
+ "loan",
83
+ "contact",
84
+ "day",
85
+ "month",
86
+ "duration",
87
+ "campaign",
88
+ "pdays",
89
+ "previous",
90
+ "poutcome"
91
+ ]
92
+ data = pd.DataFrame([data_vals], columns=index)
93
+ data_transform = mod.transform_data(data)
94
+
95
+ if selected_model == "XGBOOST":
96
+ res = mod.xg_boost_model(data_transform)
97
+ elif selected_model == "KNN":
98
+ res = mod.knn_model(data_transform)
99
+ elif selected_model == "SVC LINEAIRE":
100
+ res = mod.svc_linear_model(data_transform)
101
+ elif selected_model == "SVC":
102
+ res = mod.svc_model(data_transform)
103
+ else:
104
+ res = mod.ramdom_forest_model(data_transform)
105
+
106
+ msg = f"D'apres notre model {selected_model} le client {name} "
107
+ if res == 0:
108
+ st.error(f"{msg} ne va pas souscrire à l'offre.")
109
+ else:
110
+ st.success(f"{msg} va pas souscrire à l'offre.")
111
+
112
+