|
|
|
|
|
|
|
|
|
from abc import ABC, abstractmethod |
|
from typing import Union |
|
import cupy as cp |
|
from scipy.sparse import csr_matrix |
|
import cudf |
|
|
|
from config import Config |
|
from base_trainer import BaseTrainer |
|
from interfaces.vectorizer import Vectorizer |
|
|
|
|
|
class CuMLTrainer(BaseTrainer, ABC): |
|
""" |
|
Classe abstraite, héritée de BaseTrainer, représentant un entraîneur |
|
basé sur la librairie cuML. Elle ajoute notamment le concept de vectoriseur |
|
et force le passage de la matrice d'entrée en cupy.ndarray pour la plupart |
|
des opérations. |
|
|
|
Attributs: |
|
vectorizer (Vectorizer): Objet responsable de la vectorisation du texte. |
|
""" |
|
|
|
def __init__(self, config: Config, data_path: str, |
|
target_column: str) -> None: |
|
""" |
|
Initialise un CuMLTrainer avec la configuration. |
|
Appelle également le constructeur de BaseTrainer. |
|
|
|
:param config: Configuration globale du système. |
|
:param data_path: Chemin vers le fichier de données. |
|
:param target_column: Nom de la colonne cible dans les données. |
|
""" |
|
super().__init__(config, data_path, target_column) |
|
self.vectorizer: Vectorizer = None |
|
|
|
|
|
|
|
@abstractmethod |
|
def build_components(self) -> None: |
|
""" |
|
Méthode abstraite. Instancie concrètement le vectorizer et le classifieur, |
|
selon la configuration (ex. 'svm', 'random_forest', etc.). |
|
""" |
|
pass |
|
|
|
def train(self) -> None: |
|
""" |
|
Entraîne le classifieur sur les données vectorisées. |
|
Cette implémentation générique fonctionne pour tous les trainers cuML. |
|
""" |
|
|
|
|
|
data = cudf.read_csv(self.data_path) |
|
|
|
|
|
|
|
text_column = [col for col in data.columns if col != self.target_column][0] |
|
texts = data[text_column] |
|
labels = data[self.target_column].values |
|
|
|
|
|
X = self.vectorizer.fit_transform(texts) |
|
X_prepared = self._prepare_input_for_fit(X) |
|
|
|
self.classifier.fit(X_prepared, labels) |
|
|
|
def evaluate(self) -> dict: |
|
""" |
|
Évalue le classifieur et calcule les métriques. |
|
Cette implémentation générique fonctionne pour tous les trainers cuML. |
|
""" |
|
|
|
data = cudf.read_csv(self.data_path) |
|
|
|
|
|
|
|
text_column = [col for col in data.columns if col != self.target_column][0] |
|
texts = data[text_column] |
|
y_true = data[self.target_column].values |
|
|
|
|
|
X = self.vectorizer.transform(texts) |
|
X_prepared = self._prepare_input_for_predict(X) |
|
y_pred = self.classifier.predict(X_prepared) |
|
|
|
|
|
prefix = self.config.model.type.lower() |
|
metrics = self.metrics_calculator.calculate_and_log( |
|
y_true=y_true, |
|
y_pred=y_pred, |
|
prefix=prefix |
|
) |
|
|
|
|
|
print(f"Métriques d'évaluation {prefix}: {metrics}") |
|
|
|
return metrics |
|
|
|
def _prepare_input_for_fit(self, X: Union[cp.ndarray, |
|
csr_matrix]) -> cp.ndarray: |
|
""" |
|
Convertit, si nécessaire, la matrice en cupy.ndarray pour l'entraînement. |
|
|
|
:param X: Données d'entraînement (cupy.ndarray ou scipy.sparse.csr_matrix). |
|
:return: Données converties en cupy.ndarray, pour compatibilité cuML. |
|
""" |
|
if isinstance(X, csr_matrix): |
|
return cp.asarray(X.toarray()) |
|
return X |
|
|
|
def _prepare_input_for_predict( |
|
self, X: Union[cp.ndarray, csr_matrix]) -> cp.ndarray: |
|
""" |
|
Convertit, si nécessaire, la matrice en cupy.ndarray pour la prédiction. |
|
|
|
:param X: Données de prédiction (cupy.ndarray ou scipy.sparse.csr_matrix). |
|
:return: Données converties en cupy.ndarray, pour compatibilité cuML. |
|
""" |
|
if isinstance(X, csr_matrix): |
|
return cp.asarray(X.toarray()) |
|
return X |
|
|