===== Augmentation de données d'un dataset =====
==== Généralités ====
Pour concevoir notre interface neuronale, il va nécessairement nous falloir récolter des données d'entraînement afin de former un ou plusieurs datasets. Cette problématique intervient d'ailleurs dans la grande majorité des applications de l'intelligence artificielle.
Cependant, au vu du temps nécessaire pour acquérir des signaux, il sera très difficile d'en acquérir un grand nombre.
Dans ce contexte, nous traiterons, dans cet article, d'un procédé permettant d'augmenter artificiellement le nombre de données d'entraînement disponible en limitant les risques de redondance et d'overfitting.
==== Présentation de la méthode ====
La méthode que nous allons présenter est largement basée sur celle décrite par [cet article paru en décembre 2020 |[https://arxiv.org/ftp/arxiv/papers/2101/2101.10932.pdf]].
Celle-ci se décompose en 4 grandes phases qui sont répétées autant de fois que nécessaire pour augmenter la taille d'un dataset.
{{:data_augmentation_graph.jpg?400|}}
Tout d'abord, on sélectionne aléatoirement un signal dans le dataset. On applique ensuite un filtre passe-haut à 100 Hz afin de ne recueillir que du bruit issu de ce signal.
Ensuite, on sélectionne un autre signal aléatoirement dans le dataset. On peut alors le fusionner avec le bruit que nous avons précédemment isolé.
Grâce à cette méthode, nous pouvons aller, d'après l'article précédemment cité, jusqu'à tripler le nombre d'essais d'un dataset pour un cas à deux classes et multiplier par 6 leur nombre dans un cas à 4 classes.
==== Utilisation de la classe développée pour réaliser l'augmentation de données ====
=== Étape 1 : Instanciation de la classe EEGDataEnhancer ===
Afin d'augmenter la taille du dataset, il sera possible d'utiliser la classe EEGDataEnhancer que nous avons développé.
Cette classe doit tout d'abord être instanciée et pour cela il faut lui passer 3 paramètres.
Le premier est la matrice de données issue du dataset (sous le format des données d'un objet de la classe Epochs : [essais, électrodes, valeurs]). Le second est le nombre de fois qu'on souhaite répliquer le dataset (par exemple la valeur 4 permettra de multiplier par 4 le nombre d'essais du dataset). Enfin, le dernier argument est la matrice des étiquettes originales du dataset.
Voici un exemple permettant de multiplier par 2 le nombre de données d'un dataset :
data_enhancer = EEGDataEnhancer(data,2,labels)
=== Étape 2 : Récupération du dataset augmenté ===
Enfin, pour récupérer notre dataset étendu des essais générés par notre algorithme, il suffit d'utiliser la méthode get_enhanced_data de notre instance de la classe EEGDataEnhancer :
final_data,final_labels = data_enhancer.get_enhanced_data()
Ainsi, la première valeur de retour correspond à la matrice des données au même format que les données initiales. La seconde valeur, quant à elle, est un tableau contenant l'ensemble des étiquettes (c'est-à-dire les étiquettes initiales et, en plus, celles des données issues de l'augmentation).