Graph-based learning
Fonctions :
-
LabelPropagation()
La fonction LabelPropagation() de sklearn.semi_supervised implémente un algorithme d'apprentissage semi-supervisé qui permet de prédire les étiquettes des données non étiquetées en utilisant des informations provenant des étiquettes de données étiquetées. L'algorithme fonctionne en propagant les étiquettes à travers un graphe de similarités entre les échantillons. Les échantillons étiquetés sont utilisés pour initier la propagation, et les étiquettes sont ensuite propagées aux voisins les plus similaires dans le graphe. Cela permet au modèle d'apprendre à partir de données étiquetées et non étiquetées.
Importation :
from sklearn.semi_supervised import LabelPropagationAttributs :
Paramètre
Description
kernelLe type de noyau à utiliser pour construire le graphe de similarité. Les options sont 'rbf' (par défaut), 'knn' et 'cosine'. gammaParamètre du noyau RBF. Plus la valeur est élevée, plus l'influence des voisins proches est grande. Ignoré si le noyau n'est pas 'rbf'. Par défaut, c'est 1 / n_features. n_neighborsLe nombre de voisins à utiliser pour le noyau 'knn' (k plus proches voisins) pour calculer les similarités. Par défaut, c'est 7. max_iterLe nombre maximum d'itérations de propagation des étiquettes. Par défaut, c'est 30. tolLe critère de tolérance pour arrêter l'itération. Si la différence entre les nouvelles et anciennes étiquettes est inférieure à cette tolérance, l'algorithme s'arrête. Par défaut, c'est 1e-3. n_jobsLe nombre de processus à utiliser pour calculer les similarités. Par défaut, c'est None (utilise un seul processus). verboseSi True, affiche des informations supplémentaires pendant l'exécution de l'algorithme. Par défaut, c'est False. random_stateContrôle la reproductibilité des résultats. Il est utilisé pour initialiser le générateur de nombres aléatoires. Par défaut, c'est None. Exemple de code :
# Importation des bibliothèques nécessaires from sklearn.datasets import make_classification from sklearn.semi_supervised import LabelPropagation from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # Création d'un jeu de données d'exemple X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_classes=3, random_state=42) # Simulation de données non étiquetées (par exemple, 20% des données sont non étiquetées) y[200:] = -1 # -1 indique que la donnée est non étiquetée # 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 LabelPropagation label_propagation_model = LabelPropagation(kernel='rbf', max_iter=100) # Entraînement du modèle sur les données étiquetées et non étiquetées label_propagation_model.fit(X_train, y_train) # Prédictions sur les données de test y_pred = label_propagation_model.predict(X_test) # Évaluation de la précision accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy:.4f}")
Explication du code :
from sklearn.datasets import make_classificationimporte la fonction make_classification qui génère un jeu de données synthétique pour des tâches de classification, avec un certain nombre de caractéristiques informatives et redondantes.
from sklearn.semi_supervised import LabelPropagationimporte la classe LabelPropagation du module semi-supervisé de scikit-learn, qui implémente un algorithme permettant de propager les étiquettes connues à travers un graphe de similarité vers les données non étiquetées.
from sklearn.model_selection import train_test_splitimporte la fonction train_test_split qui divise un jeu de données en deux ensembles distincts (entraînement et test), facilitant ainsi l’évaluation des performances du modèle.
from sklearn.metrics import accuracy_scoreimporte la fonction accuracy_score qui calcule la précision d’un modèle en comparant les étiquettes prédites avec les vraies étiquettes.Création d’un jeu de données synthétique
X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_classes=3, random_state=42)génère un jeu de données contenant 1000 échantillons, chacun ayant 20 caractéristiques, dont 10 sont réellement informatives pour distinguer entre 3 classes différentes.
Le paramètrerandom_statepermet de rendre les résultats reproductibles.Simulation de données non étiquetées
y[200:] = -1remplace les étiquettes de 800 exemples (à partir du 201e) par-1, ce qui signifie que ces données sont considérées comme non étiquetées pour l’apprentissage semi-supervisé.Séparation du jeu de données
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 deux ensembles : 70% pour l’entraînement (y compris les exemples non étiquetés) et 30% pour le test.
Cette séparation permet d’évaluer la performance du modèle sur des données totalement nouvelles.Création du modèle LabelPropagation
label_propagation_model = LabelPropagation(kernel='rbf', max_iter=100)crée un modèle LabelPropagation en utilisant un noyau radial (rbf) pour mesurer la similarité entre les échantillons, et limite le nombre d’itérations de propagation à 100.Entraînement du modèle
label_propagation_model.fit(X_train, y_train)ajuste le modèle LabelPropagation sur les données d'entraînement contenant à la fois des étiquettes connues et inconnues.
Le modèle propage les labels connus aux exemples non étiquetés en se basant sur leur proximité dans l’espace des caractéristiques.Prédiction sur les données de test
y_pred = label_propagation_model.predict(X_test)applique le modèle appris pour prédire les classes des données de test (initialement connues mais non utilisées dans l’apprentissage).Évaluation de la précision
accuracy = accuracy_score(y_test, y_pred)calcule la précision globale du modèle en comparant les prédictions avec les vraies étiquettes du jeu de test.print(f"Accuracy: {accuracy:.4f}")affiche cette précision avec 4 chiffres après la virgule.
Ce code illustre comment un modèle semi-supervisé comme LabelPropagation peut tirer parti d’un petit sous-ensemble de données étiquetées pour généraliser à l’ensemble du jeu, en propageant les étiquettes aux exemples similaires dans un espace de caractéristiques partagé. C’est particulièrement utile lorsqu’on dispose de peu de données annotées mais de nombreuses données brutes.