Toutes les modifications notables de ce projet sont documentées ici. Format basé sur Keep a Changelog.
Optimisations grande échelle pour l'article DMKD (passage à >>1 000 exemples).
04_model_training.py—make_mlna_1_variable_v2:config_df2non chargé lors deboth=True→TypeError: 'NoneType' object is not subscriptableà la ligne 179. Correction : chargement symétrique àmake_mlna_top_k_variable_v2.modules/graph.py—build_modalities_graph():data.astype('int')no-op (résultat non assigné) ; corrigé endata = data.astype('int').
03_graph_construction.py—extract_descriptors_from_graph_model: remplacement des 6 appelsnx.pagerank()séquentiels par un power iteration batché(N×6)avecscipy.sparse(1 conversion graph→scipy + 1 SpMM/itération au lieu de 6 SpMV). Gain ~3.5x sur la construction des descripteurs. Bloc de validation iso-résultat disponible en commentaire.modules/modeling.py—train_classifier():SVC(kernel='linear'): passage deKernelExplainer(O(n_train × n_features × n_test)) àLinearExplainer(O(n_features × n_test)), gain ×100-1000.TreeExplainer: ajout decheck_additivity=False, évite une vérification O(n_test × n_features) redondante.KernelExplainerfallback : fond d'échantillonnage limité à 100 samples au lieu deX_traincomplet.- 6 appels
print()de diagnostic commentés (exécutés en boucle interne).
modules/statistical.py—load_results(): 22×N appelsos.walk()(un par combinaison(approach, logic, config, attribut)) remplacés par 1 walk unique + helpercollect()en mémoire. Gain O(22×N) → O(1) I/O.modules/preprocessing.py:- Boucle row-by-row
.loc[]pour la normalisation →np.wherevectorisé (×10–100). - 7 appels
.quantile()séparés → 1 appel vectorisé.quantile([0.05, 0.15, ...])
- Boucle row-by-row
modules/statistical.py—load_results:attributs=[](mutable default) →attributs=Noneavec guard.BRAINSTORMING.md— créé : document complet de session couvrant architecture, optimisations, bugs, estimations de temps, GPU, issues restantes.CLAUDE.md— créé : guide d'architecture pour Claude Code.
- README mis à jour avec instructions détaillées d'exécution.
- Template de fichier
.envpour la configuration des variables d'environnement.
- Données d'exemple compressées (
data.zip). - Analyse par niveau de classe (class level 1) et par métrique dans les rapports.
- Réorganisation du code : étape 1 de refactoring structurel.
- Pipeline stable pour dépôt DMKD #1.
- Point de référence avant optimisations grande échelle.
- Amélioration du reporting basé sur LaTeX : mise en page des tableaux, figures, et statistiques comparatives.
- Conversion du diviseur en
floatau lieu deint(division entière silencieuse).
- Optimisation de l'utilisation des cœurs CPU (limitation via
cpu_limitation_usage). - Correction des logiques analytiques.
- Configuration rendue portable pour tout utilisateur (chemins relatifs, setup universel).
- Révision du flux d'exécution (
launch.sh).
- Pipeline complet et stable (100%) : prétraitement → graphes → entraînement → rapports.
- Script de reporting (
05_report_generation.py). - Suppression des mentions "Test" dans les e-mails de notification.
- Correction des proportions pour l'exécution sur données allemandes.
- Fichiers d'initialisation des datasets.
- Démarrage du nouveau pipeline unifié (remplacement de l'ancienne version).
- Progression à 45 % des fonctionnalités cibles.
- Premières modifications structurelles du projet.
- Mise en place de l'architecture initiale du pipeline MLNA.
| ID | Fichier | Description | Priorité |
|---|---|---|---|
| ERR-2 | modules/modeling.py:336 |
shap_vals_mean : mauvaise forme pour cas multiclasse (axis=0 au lieu de axis=(0,1)) |
Grave |
| ERR-3 | modules/graph.py |
build_mlg_with_class : nœuds modaux dupliqués (list_of_nodes vs nodes_dict) |
Grave |
| WARN-1 | 03_graph_construction.py |
Ordre de suppression inversé dans les boucles de nettoyage CX (×3 fonctions) | Moyen |
| WARN-2 | 03_graph_construction.py |
os.walk() par variable pour vérification de complétion → os.path.exists() suffisant |
Moyen |
| ERR-1* | modules/graph.py |
nx.pagerank() sans max_iter=500 hors de extract_descriptors_from_graph_model |
Faible |
*ERR-1 résolu dans extract_descriptors_from_graph_model (batched PR, max_iter=500). Vérifier les appels restants dans modules/graph.py.