fioriclass commited on
Commit
024f027
·
1 Parent(s): 65e5e42

plus de bug metrics bonnes

Browse files
src/conf/config.yaml CHANGED
@@ -5,7 +5,7 @@ defaults:
5
  - _self_ # Applique les valeurs définies dans ce fichier
6
 
7
  model:
8
- type: "svm" # Définit quel modèle choisir
9
  # Interpolation directe : Récupère les paramètres depuis la structure 'models'
10
  # (chargée via 'defaults: - model') en utilisant le 'type' défini ci-dessus.
11
  params: ${models.${model.type}}
 
5
  - _self_ # Applique les valeurs définies dans ce fichier
6
 
7
  model:
8
+ type: "bert" # Définit quel modèle choisir
9
  # Interpolation directe : Récupère les paramètres depuis la structure 'models'
10
  # (chargée via 'defaults: - model') en utilisant le 'type' défini ci-dessus.
11
  params: ${models.${model.type}}
src/cuml_trainer.py CHANGED
@@ -5,6 +5,7 @@
5
  from abc import ABC, abstractmethod
6
  from typing import Optional, Union, Tuple
7
  import cupy as cp
 
8
  from scipy.sparse import csr_matrix
9
  import cudf
10
  from cuml.model_selection import train_test_split
@@ -69,6 +70,7 @@ class CuMLTrainer(BaseTrainer, ABC):
69
  if self.X_train_text is not None: # Évite de recharger/resplitter
70
  return
71
 
 
72
  data = cudf.read_csv(self.data_path)
73
 
74
  # Identification des features
@@ -83,20 +85,33 @@ class CuMLTrainer(BaseTrainer, ABC):
83
  # Ajouter les autres colonnes avec un espace comme séparateur
84
  for col in feature_columns[1:]:
85
  texts_concatenated = texts_concatenated.str.cat(data[col].astype(str), sep=' ')
86
-
 
87
  labels = data[self.target_column].astype(self._get_label_dtype()).values
88
-
 
 
 
 
 
 
 
 
 
89
  # Premier split: 80% train, 20% temp (pour val+test)
90
- X_train, X_temp, y_train, y_temp = train_test_split(
91
- texts_concatenated, labels, test_size=test_size, random_state=random_state, stratify=labels
92
  )
93
-
94
  # Deuxième split: 50% validation, 50% test sur l'ensemble temp
95
- # (val_size=0.5 sur 20% donne 10% du total pour val et 10% pour test)
96
- # Utilisation de stratify=y_temp pour maintenir la distribution des classes
97
- X_val, X_test, y_val, y_test = train_test_split(
98
- X_temp, y_temp, test_size=val_size, random_state=random_state, stratify=y_temp
99
  )
 
 
 
 
 
100
 
101
  # Stockage des résultats
102
  self.X_train_text = X_train
 
5
  from abc import ABC, abstractmethod
6
  from typing import Optional, Union, Tuple
7
  import cupy as cp
8
+ import numpy as np
9
  from scipy.sparse import csr_matrix
10
  import cudf
11
  from cuml.model_selection import train_test_split
 
70
  if self.X_train_text is not None: # Évite de recharger/resplitter
71
  return
72
 
73
+ # Charger les données
74
  data = cudf.read_csv(self.data_path)
75
 
76
  # Identification des features
 
85
  # Ajouter les autres colonnes avec un espace comme séparateur
86
  for col in feature_columns[1:]:
87
  texts_concatenated = texts_concatenated.str.cat(data[col].astype(str), sep=' ')
88
+
89
+ # Convertir les labels en format compatible avec cuML
90
  labels = data[self.target_column].astype(self._get_label_dtype()).values
91
+
92
+ # Créer une copie des textes pour le stockage
93
+ texts_for_storage = texts_concatenated.copy()
94
+
95
+ # Convertir les textes en indices numériques pour le split
96
+ # Cette étape est nécessaire car cuML ne peut pas gérer directement les objets string
97
+ # Nous utilisons une représentation numérique simple pour le split uniquement
98
+ # Les textes originaux seront stockés pour la vectorisation ultérieure
99
+ indices = cp.arange(len(texts_concatenated))
100
+
101
  # Premier split: 80% train, 20% temp (pour val+test)
102
+ train_indices, temp_indices, y_train, y_temp = train_test_split(
103
+ indices, labels, test_size=test_size, random_state=random_state, stratify=labels
104
  )
105
+
106
  # Deuxième split: 50% validation, 50% test sur l'ensemble temp
107
+ val_indices, test_indices, y_val, y_test = train_test_split(
108
+ temp_indices, y_temp, test_size=val_size, random_state=random_state, stratify=y_temp
 
 
109
  )
110
+
111
+ # Récupérer les textes correspondant aux indices
112
+ X_train = texts_for_storage.iloc[train_indices.get()]
113
+ X_val = texts_for_storage.iloc[val_indices.get()]
114
+ X_test = texts_for_storage.iloc[test_indices.get()]
115
 
116
  # Stockage des résultats
117
  self.X_train_text = X_train
src/trainers/huggingface/huggingface_transformer_trainer.py CHANGED
@@ -159,16 +159,28 @@ class HuggingFaceTransformerTrainer(BaseTrainer):
159
  texts = features_df[features_df.columns[0]]
160
  for col in features_df.columns[1:]:
161
  texts = texts.str.cat(features_df[col], sep=' ')
162
- # texts est une cudf.Series, labels est un cp.ndarray
163
- # Utiliser cuml.model_selection.train_test_split directement
164
- # Premier split: 80% train, 20% temp
165
- X_train_text, X_temp_text, y_train, y_temp = train_test_split(
166
- texts, labels, test_size=0.2, random_state=42, stratify=labels
 
 
 
 
 
 
167
  )
168
- # Deuxième split: 50% validation, 50% test sur temp (donne 10% val, 10% test du total)
169
- X_val_text, X_test_text, y_val, y_test = train_test_split(
170
- X_temp_text, y_temp, test_size=0.5, random_state=42, stratify=y_temp
 
171
  )
 
 
 
 
 
172
 
173
  # Fonction pour créer un dataset Hugging Face à partir de cudf.Series et cp.ndarray
174
  def create_hf_dataset(text_series: cudf.Series, label_array: cp.ndarray) -> HFDataset:
@@ -246,18 +258,15 @@ class HuggingFaceTransformerTrainer(BaseTrainer):
246
  params = self.config.model.params
247
  return TrainingArguments(
248
  output_dir=params.get("output_dir", "./results"),
249
- num_train_epochs=params.get("epochs"),
250
- per_device_train_batch_size=params.get("batch_size"),
251
- per_device_eval_batch_size=params.get("batch_size"),
252
- learning_rate=params.get("learning_rate"),
253
- warmup_steps=params.get("warmup_steps"),
254
- weight_decay=params.get("weight_decay"),
255
- adam_epsilon=params.get("adam_epsilon"),
256
- # Ajout de paramètres importants pour l'évaluation
257
- evaluation_strategy="epoch", # Évaluer à chaque époque
258
- save_strategy="epoch", # Sauvegarder le modèle à chaque époque
259
- load_best_model_at_end=True, # Charger le meilleur modèle à la fin
260
- metric_for_best_model="f1", # Utiliser F1 pour déterminer le meilleur modèle (ou 'accuracy')
261
- logging_dir=params.get("logging_dir", "./logs"), # Pour les logs TensorBoard
262
- logging_steps=params.get("logging_steps", 10), # Fréquence des logs
263
  )
 
159
  texts = features_df[features_df.columns[0]]
160
  for col in features_df.columns[1:]:
161
  texts = texts.str.cat(features_df[col], sep=' ')
162
+
163
+ # Créer une copie des textes pour le stockage
164
+ texts_for_storage = texts.copy()
165
+
166
+ # Utiliser des indices numériques pour le split au lieu des textes directement
167
+ # Cette approche évite les problèmes de conversion des objets string en tableaux CUDA
168
+ indices = cp.arange(len(texts))
169
+
170
+ # Premier split: 80% train, 20% temp en utilisant les indices
171
+ train_indices, temp_indices, y_train, y_temp = train_test_split(
172
+ indices, labels, test_size=0.2, random_state=42, stratify=labels
173
  )
174
+
175
+ # Deuxième split: 50% validation, 50% test sur temp
176
+ val_indices, test_indices, y_val, y_test = train_test_split(
177
+ temp_indices, y_temp, test_size=0.5, random_state=42, stratify=y_temp
178
  )
179
+
180
+ # Récupérer les textes correspondant aux indices
181
+ X_train_text = texts_for_storage.iloc[train_indices.get()]
182
+ X_val_text = texts_for_storage.iloc[val_indices.get()]
183
+ X_test_text = texts_for_storage.iloc[test_indices.get()]
184
 
185
  # Fonction pour créer un dataset Hugging Face à partir de cudf.Series et cp.ndarray
186
  def create_hf_dataset(text_series: cudf.Series, label_array: cp.ndarray) -> HFDataset:
 
258
  params = self.config.model.params
259
  return TrainingArguments(
260
  output_dir=params.get("output_dir", "./results"),
261
+ num_train_epochs=float(params.get("epochs", 3)),
262
+ per_device_train_batch_size=int(params.get("batch_size", 8)),
263
+ per_device_eval_batch_size=int(params.get("batch_size", 8)),
264
+ learning_rate=float(params.get("learning_rate", 5e-5)),
265
+ warmup_steps=int(params.get("warmup_steps", 0)),
266
+ weight_decay=float(params.get("weight_decay", 0.0)),
267
+ # Paramètres d'évaluation simplifiés pour compatibilité
268
+ eval_steps=100, # Évaluer tous les 100 pas
269
+ save_steps=100, # Sauvegarder tous les 100 pas
270
+ logging_dir=params.get("logging_dir", "./logs"),
271
+ logging_steps=int(params.get("logging_steps", 10))
 
 
 
272
  )