Co-training
Le Co-Training est une méthode d’apprentissage semi-supervisé utilisée pour améliorer la performance des modèles lorsque seules certaines données sont étiquetées. L’objectif est de tirer parti des données non étiquetées en combinant les prédictions de plusieurs modèles ou vues différentes des données.
Le principe consiste à entraîner deux modèles distincts sur des sous-ensembles de caractéristiques différents. Chaque modèle prédit les étiquettes des données non étiquetées, puis les prédictions les plus fiables de chaque modèle sont ajoutées au jeu de données étiquetées de l’autre modèle. Ce processus est répété de manière itérative pour améliorer la précision globale.
Le Co-Training est utilisé en science des données, traitement du langage naturel, vision par ordinateur et autres domaines où l’annotation complète des données est coûteuse ou difficile.
La performance du modèle peut être évaluée à l’aide de métriques classiques d’apprentissage supervisé, comme l’exactitude, la précision, le rappel ou la F1-score.
En résumé, le Co-Training permet d’améliorer les modèles en exploitant des données non étiquetées à partir de plusieurs perspectives ou sous-ensembles de caractéristiques.
Fonctions :
-
Co-training (exemple)
Le Co-training est une technique d’apprentissage semi-supervisé qui exploite deux (ou plusieurs) vues différentes des données, c’est-à-dire des ensembles de caractéristiques complémentaires. Chaque vue est utilisée pour entraîner un classificateur séparé. Ces deux classificateurs s’entraînent mutuellement en s’échangeant des pseudo-étiquettes sur les données non étiquetées, ce qui permet d’augmenter progressivement le volume de données étiquetées utilisées.
Exemple de code :
import numpy as np from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.tree import DecisionTreeClassifier 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_informative=10, 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 des classificateurs classifier1 = SVC(probability=True, kernel='linear') classifier2 = DecisionTreeClassifier() # Initialisation des labels y_train_1 = y_train.copy() y_train_2 = y_train.copy() # Phase d'apprentissage initiale sur les données étiquetées classifier1.fit(X_train[y_train != -1], y_train[y_train != -1]) classifier2.fit(X_train[y_train != -1], y_train[y_train != -1]) # Co-training : itérations pour étiqueter les données non étiquetées for iteration in range(10): # Utilisation de classifier1 pour étiqueter les données non étiquetées probas1 = classifier1.predict_proba(X_train[y_train == -1]) confident1 = np.max(probas1, axis=1) > 0.9 # Si la prédiction est confiante y_train_1[y_train == -1] = np.where(confident1, classifier1.predict(X_train[y_train == -1]), -1) # Utilisation de classifier2 pour étiqueter les données non étiquetées probas2 = classifier2.predict_proba(X_train[y_train == -1]) confident2 = np.max(probas2, axis=1) > 0.9 # Si la prédiction est confiante y_train_2[y_train == -1] = np.where(confident2, classifier2.predict(X_train[y_train == -1]), -1) # Réentraîner les classificateurs sur les données étiquetées augmentées classifier1.fit(X_train[y_train_1 != -1], y_train_1[y_train_1 != -1]) classifier2.fit(X_train[y_train_2 != -1], y_train_2[y_train_2 != -1]) # Évaluation du modèle y_pred = classifier1.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy after Co-training: {accuracy:.4f}")
Explication du code :
import numpy as npimporte la bibliothèque NumPy pour la gestion efficace des tableaux numériques.
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.
from sklearn.model_selection import train_test_splitimporte la fonction pour diviser les données en ensembles d’entraînement et de test.
from sklearn.svm import SVCimporte le classifieur SVC (Support Vector Classifier) basé sur les machines à vecteurs de support.
from sklearn.tree import DecisionTreeClassifierimporte le classifieur par arbre de décision.
from sklearn.metrics import accuracy_scoreimporte la fonction pour calculer la précision d’un modèle.Création d’un jeu de données
X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_classes=2, random_state=42)génère un dataset avec 1000 échantillons, 20 caractéristiques dont 10 informatives, répartis en 2 classes.Simulation de données non étiquetées
y[400:] = -1remplace les labels des 600 derniers échantillons par -1, indiquant qu’ils sont non étiquetés.Séparation train/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 et 30 % pour le test.Création des deux classificateurs
classifier1 = SVC(probability=True, kernel='linear')crée un classifieur SVM linéaire avec estimation de probabilité activée.
classifier2 = DecisionTreeClassifier()crée un classifieur par arbre de décision.Initialisation des labels pour chaque classifieur
y_train_1 = y_train.copy()ety_train_2 = y_train.copy()font des copies indépendantes des labels pour chaque classifieur, pour gérer séparément leurs étiquetages.Phase d’apprentissage initiale
classifier1.fit(X_train[y_train != -1], y_train[y_train != -1])etclassifier2.fit(X_train[y_train != -1], y_train[y_train != -1])entraînent les classifieurs uniquement sur les données étiquetées (labels != -1).Itérations de Co-training
Pouriteration in range(10)(10 tours) :
-probas1 = classifier1.predict_proba(X_train[y_train == -1])prédit les probabilités de classe sur les données non étiquetées avec le classifieur 1.
-confident1 = np.max(probas1, axis=1) > 0.9identifie les prédictions très confiantes (probabilité max > 0.9).
-y_train_1[y_train == -1] = np.where(confident1, classifier1.predict(X_train[y_train == -1]), -1)assigne des labels prévus uniquement si la confiance est élevée, sinon garde -1. Même procédé est appliqué avec le classifieur 2 :
probas2 = classifier2.predict_proba(X_train[y_train == -1])
confident2 = np.max(probas2, axis=1) > 0.9
y_train_2[y_train == -1] = np.where(confident2, classifier2.predict(X_train[y_train == -1]), -1)
Enfin, les classifieurs sont ré-entrainés sur les labels augmentés :
classifier1.fit(X_train[y_train_1 != -1], y_train_1[y_train_1 != -1])
classifier2.fit(X_train[y_train_2 != -1], y_train_2[y_train_2 != -1])Évaluation finale
y_pred = classifier1.predict(X_test)prédit les classes du jeu de test avec le classifieur 1 final.
accuracy = accuracy_score(y_test, y_pred)calcule la précision.print(f"Accuracy after Co-training: {accuracy:.4f}")affiche la précision obtenue.
Ce code illustre la méthode Co-training, où deux classifieurs collaborent pour labelliser des données non étiquetées avec confiance élevée, augmentant ainsi leurs données d’apprentissage respectives et améliorant la performance sur un problème semi-supervisé.