Einführung
In diesem Lab wird eine Aktiv-Lern-Technik demonstriert, um handschriftliche Ziffern mithilfe von Labelpropagation zu lernen. Die Labelpropagation ist eine halbüberwachte Lernmethode, die einen graphenbasierten Ansatz verwendet, um Labels über Datenpunkte zu propagieren. Aktiv-Lernen ist ein Prozess, der uns ermöglicht, iterativ Datenpunkte auszuwählen, um sie zu labeln, und diese gelabelten Punkte verwenden, um das Modell erneut zu trainieren.
Tipps für die virtuelle Maschine
Nachdem der Start der virtuellen Maschine abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.
Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.
Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback ab, und wir werden das Problem für Sie prompt beheben.
Lade den Digits-Datensatz
Wir beginnen mit dem Laden des Digits-Datensatzes aus der scikit-learn-Bibliothek.
from sklearn import datasets
digits = datasets.load_digits()
Mische und teile die Daten auf
Als nächstes werden wir den Datensatz mischen und in gelabelte und ungelabelte Teile aufteilen. Wir beginnen zunächst mit nur 10 gelabelten Punkten.
import numpy as np
rng = np.random.RandomState(0)
indices = np.arange(len(digits.data))
rng.shuffle(indices)
X = digits.data[indices[:330]]
y = digits.target[indices[:330]]
images = digits.images[indices[:330]]
n_total_samples = len(y)
n_labeled_points = 10
unlabeled_indices = np.arange(n_total_samples)[n_labeled_points:]
Trainiere das Labelpropagation-Modell
Wir werden nun ein Labelpropagation-Modell mit den gelabelten Datenpunkten trainieren und es verwenden, um die Labels der verbleibenden ungelabelten Datenpunkte vorherzusagen.
from sklearn.semi_supervised import LabelSpreading
lp_model = LabelSpreading(gamma=0.25, max_iter=20)
lp_model.fit(X, y_train)
predicted_labels = lp_model.transduction_[unlabeled_indices]
Wähle die am ungewissesten Punkte
Wir werden die fünf am ungewissesten Punkte basierend auf ihren vorhergesagten Label-Verteilungen auswählen und für sie menschliche Labels anfordern.
from scipy import stats
pred_entropies = stats.distributions.entropy(lp_model.label_distributions_.T)
uncertainty_index = np.argsort(pred_entropies)[::-1]
uncertainty_index = uncertainty_index[np.in1d(uncertainty_index, unlabeled_indices)][:5]
Label die am ungewissesten Punkte
Wir werden die menschlichen Labels zu den gelabelten Datenpunkten hinzufügen und das Modell mit ihnen trainieren.
y_train[uncertainty_index] = y[uncertainty_index]
lp_model.fit(X, y_train)
Wiederhole
Wir werden den Prozess wiederholen, bei dem die fünf am ungewissesten Punkte ausgewählt werden, ihre Labels zu den gelabelten Datenpunkten hinzugefügt werden und das Modell trainiert wird, bis wir 30 gelabelte Datenpunkte haben.
max_iterations = 3
for i in range(max_iterations):
if len(unlabeled_indices) == 0:
print("No unlabeled items left to label.")
break
## select top five uncertain points
pred_entropies = stats.distributions.entropy(lp_model.label_distributions_.T)
uncertainty_index = np.argsort(pred_entropies)[::-1]
uncertainty_index = uncertainty_index[np.in1d(uncertainty_index, unlabeled_indices)][:5]
## add labels to labeled data points
y_train[uncertainty_index] = y[uncertainty_index]
## train the model
lp_model.fit(X, y_train)
## remove labeled data points from the unlabeled set
delete_indices = np.array([], dtype=int)
for index, image_index in enumerate(uncertainty_index):
(delete_index,) = np.where(unlabeled_indices == image_index)
delete_indices = np.concatenate((delete_indices, delete_index))
unlabeled_indices = np.delete(unlabeled_indices, delete_indices)
n_labeled_points += len(uncertainty_index)
Zusammenfassung
Zusammenfassend lässt sich sagen, dass in diesem Lab eine aktive Lerntechnik mit Labelpropagation zur Erkennung von handschriftlichen Ziffern demonstriert wurde. Wir begannen mit dem Training eines Labelpropagation-Modells mit nur 10 gelabelten Punkten und wählten iterativ die fünf am ungewissesten Punkte aus, um sie zu labeln, bis wir 30 gelabelte Datenpunkte hatten. Diese aktive Lerntechnik kann hilfreich sein, um die Anzahl der erforderlichen gelabelten Datenpunkte für das Training eines Modells zu minimieren und gleichzeitig dessen Leistung zu maximieren.