L’apprentissage semi-supervisé est exactement ce que son nom suggère : le jeu de données d’entraînement contient à la fois des données étiquetées et des données non étiquetées. Cette méthode est particulièrement utile quand il est difficile d’extraire les caractéristiques pertinentes des données, ou quand étiqueter tous les exemples prendrait énormément de temps.
Les réseaux antagonistes génératifs (GAN) #
Une méthode d’entraînement populaire, qui démarre avec un jeu de données étiquetées relativement petit, utilise les réseaux antagonistes génératifs (GAN, Generative Adversarial Networks). Ce sont deux réseaux de Deep Learning en compétition, chacun essayant d’être plus malin que l’autre.
- le générateur tente de créer de nouveaux points de données qui imitent les données d’entraînement ;
- le discriminateur récupère les données générées et évalue si elles font partie des données d’entraînement ou si ce sont des faux.
Les réseaux s’améliorent dans une boucle de rétroaction : le discriminateur sépare de mieux en mieux les faux des originaux, et le générateur crée des faux de plus en plus convaincants. Exemple d’usage : générer des images médicales, comme des tomodensitogrammes ou des IRM.
Un exemple avec scikit-learn #
Il existe aussi des approches plus simples. Avec l’auto-apprentissage (self-training), un modèle entraîné sur les quelques données étiquetées étiquette lui-même les données non étiquetées dont il est suffisamment sûr, puis se ré-entraîne. Dans scikit-learn, les données non étiquetées se repèrent avec l’étiquette -1 :
import numpy as np
from sklearn.datasets import load_iris
from sklearn.semi_supervised import SelfTrainingClassifier
from sklearn.linear_model import LogisticRegression
X, y = load_iris(return_X_y=True)
# On masque 80 % des étiquettes : -1 signifie « non étiqueté »
rng = np.random.RandomState(42)
y_partiel = y.copy()
y_partiel[rng.rand(len(y)) < 0.8] = -1
modele = SelfTrainingClassifier(LogisticRegression(max_iter=1000))
modele.fit(X, y_partiel)
print("Données étiquetées au départ :", (y_partiel != -1).sum(), "sur", len(y))
print("Précision sur l'ensemble des données :", round(modele.score(X, y), 3))PythonDonnées étiquetées au départ : 31 sur 150
Précision sur l'ensemble des données : 0.96La suite et la fin de la série : l’apprentissage par renforcement.
Pour aller plus loin, consulte aussi notre sélection des 10 meilleurs algorithmes d’apprentissage automatique pour les data scientists débutants.
Les bases solides comptent avant les techniques avancées. Sur DataXp, tu les construis avec plus de 350 exercices et un coach IA.

