Pseudo-labeling
Fonctions :
-
Pseudo-labeling (exemple)
Le pseudo-labelling est une technique d'apprentissage semi-supervisé où un modèle est d'abord entraîné sur un petit ensemble de données étiquetées. Ensuite, ce modèle est utilisé pour prédire des étiquettes pour un grand ensemble de données non étiquetées. Ces prédictions sont ensuite utilisées comme pseudo-étiquettes pour réentraîner le modèle. L'idée est que les prédictions d'un modèle déjà entraîné sur des données étiquetées peuvent être suffisamment fiables pour améliorer l'entraînement du modèle en utilisant des données non étiquetées. Cela permet de faire une utilisation optimale des données disponibles, même lorsque les données étiquetées sont limitées, ce qui est souvent le cas dans les problèmes réels.
Exemple de code :
import numpy as np from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score # Création d'un jeu de données fictif X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42) # Simulation de données non étiquetées (par exemple, 40% des données sont non étiquetées) y[400:] = -1 # -1 indique des étiquettes non étiquetées # Séparation en données d'entraînement et de test X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # Création du classificateur classifier = RandomForestClassifier(n_estimators=100, random_state=42) # Phase d'apprentissage initiale sur les données étiquetées classifier.fit(X_train[y_train != -1], y_train[y_train != -1]) # Méthode de Pseudo-labelling : générer des pseudo-étiquettes pour les données non étiquetées pseudo_labels = classifier.predict(X_train[y_train == -1]) confidence_threshold = 0.9 # Application d'un seuil de confiance pour considérer les pseudo-étiquettes probas = classifier.predict_proba(X_train[y_train == -1]) confident_indices = np.max(probas, axis=1) > confidence_threshold y_train_copy = y_train.copy() # Attribuer les pseudo-étiquettes uniquement pour les prédictions confiantes y_train_copy[y_train == -1] = np.where(confident_indices, pseudo_labels, -1) # Réentraîner le modèle avec les pseudo-étiquettes classifier.fit(X_train[y_train_copy != -1], y_train_copy[y_train_copy != -1]) # Évaluation du modèle y_pred = classifier.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy with Pseudo-labelling: {accuracy:.4f}")
Explication du code :
import numpy as np
importe la bibliothèque NumPy, utilisée ici pour la manipulation efficace des tableaux numériques.from sklearn.datasets import make_classification
importe la fonction make_classification, qui permet de générer un jeu de données synthétique pour un problème de classification.from sklearn.model_selection import train_test_split
importe la fonction train_test_split, utilisée pour diviser les données en ensembles d’entraînement et de test.from sklearn.ensemble import RandomForestClassifier
importe la classe RandomForestClassifier, un algorithme d’ensemble basé sur de multiples arbres de décision (bagging).from sklearn.metrics import accuracy_score
importe la fonction accuracy_score, utilisée pour évaluer la précision du modèle en comparant les prédictions avec les vraies étiquettes.Création du jeu de données
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
génère un jeu de 1000 échantillons avec 20 caractéristiques, répartis en 2 classes. Le paramètrerandom_state
garantit la reproductibilité.Simulation de données non étiquetées
y[400:] = -1
marque 60% des échantillons (à partir du 400e) comme non étiquetés en leur assignant la valeur-1
, ce qui simule un contexte semi-supervisé.Séparation en données d'entraînement et de test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
divise les données en 70% pour l’entraînement (avec et sans étiquettes) et 30% pour le test, de manière aléatoire mais reproductible.Entraînement initial du modèle sur les données étiquetées
classifier = RandomForestClassifier(n_estimators=100, random_state=42)
crée un modèle de forêt aléatoire avec 100 arbres, dont le comportement est reproductible viarandom_state
.classifier.fit(X_train[y_train != -1], y_train[y_train != -1])
entraîne le modèle uniquement sur les données étiquetées (oùy ≠ -1
), en ignorant les échantillons non étiquetés.Génération des pseudo-étiquettes
pseudo_labels = classifier.predict(X_train[y_train == -1])
applique le modèle pour prédire des étiquettes provisoires (pseudo-labels) pour les données non étiquetées.probas = classifier.predict_proba(X_train[y_train == -1])
retourne la probabilité de chaque classe prédite pour ces exemples non étiquetés.Filtrage des prédictions selon un seuil de confiance
confidence_threshold = 0.9
définit un seuil à partir duquel une prédiction est jugée suffisamment fiable pour être utilisée.confident_indices = np.max(probas, axis=1) > confidence_threshold
repère les indices des exemples non étiquetés dont la probabilité maximale dépasse ce seuil, indiquant une prédiction confiante.y_train_copy = y_train.copy()
crée une copie du vecteur d’étiquettes afin de pouvoir le modifier sans altérer les données originales.y_train_copy[y_train == -1] = np.where(confident_indices, pseudo_labels, -1)
insère les pseudo-labels uniquement pour les échantillons jugés confiants, les autres restant marqués comme non étiquetés.Réentraîner le modèle avec les pseudo-étiquettes fiables
classifier.fit(X_train[y_train_copy != -1], y_train_copy[y_train_copy != -1])
entraîne un nouveau modèle en combinant les données initialement étiquetées et les exemples non étiquetés ayant reçu une pseudo-étiquette confiante.Évaluation du modèle
y_pred = classifier.predict(X_test)
prédit les classes des données de test à l’aide du modèle final.accuracy = accuracy_score(y_test, y_pred)
calcule la proportion de prédictions correctes, donnant une mesure de la performance du modèle.print(f"Accuracy with Pseudo-labelling: {accuracy:.4f}")
affiche la précision du modèle avec 4 décimales, illustrant l’impact du pseudo-labelling. Ce code met en œuvre la stratégie de Pseudo-labelling, une technique d’apprentissage semi-supervisé consistant à exploiter les prédictions les plus sûres d’un modèle pour étiqueter artificiellement des données non annotées. Cela permet d’augmenter la taille du jeu d’entraînement de manière contrôlée, tout en limitant les erreurs dues à de fausses étiquettes.