Einführung
Dieses Lab demonstriert, wie man halbsupervisionierte Lernverfahren mit dem Label Spreading - Algorithmus durchführt. Wir werden eine Teilmenge des Datensatzes mit handschriftlichen Ziffern verwenden, und nur 40 dieser Stichproben werden gelabelt sein. Anschließend werden wir Label Spreading nutzen, um die verbleibenden 300 Stichproben vorherzusagen.
Tipps für die virtuelle Maschine (VM)
Nachdem die VM gestartet wurde, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und auf Jupyter Notebook für die Übung zuzugreifen.
Manchmal müssen Sie möglicherweise einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Aufgrund von Einschränkungen in Jupyter Notebook kann die Validierung von Operationen nicht automatisiert werden.
Wenn Sie während des Lernens Probleme haben, können Sie sich gerne an Labby wenden. Geben Sie uns nach der Sitzung Feedback, und wir werden das Problem umgehend für Sie lösen.
Daten laden und mischen
Zunächst laden wir den Datensatz mit den handschriftlichen Ziffern (digits dataset) und mischen die Daten zufällig.
digits = datasets.load_digits()
rng = np.random.RandomState(2)
indices = np.arange(len(digits.data))
rng.shuffle(indices)
Daten für halbsupervisioniertes Lernen vorbereiten
Wir wählen 340 Stichproben aus, und nur 40 dieser Stichproben sind mit einem bekannten Label (Kategorie) verknüpft. Wir speichern die Indizes der anderen 300 Stichproben, für die wir die Labels nicht kennen sollen. Anschließend mischen wir die Labels so, dass die ungelabelten Stichproben mit -1 markiert werden.
X = digits.data[indices[:340]]
y = digits.target[indices[:340]]
n_total_samples = len(y)
n_labeled_points = 40
indices = np.arange(n_total_samples)
unlabeled_set = indices[n_labeled_points:]
y_train = np.copy(y)
y_train[unlabeled_set] = -1
Das Label Spreading - Modell trainieren
Wir trainieren das Label Spreading - Modell mit gamma = 0,25 und max_iter = 20.
lp_model = LabelSpreading(gamma=0.25, max_iter=20)
lp_model.fit(X, y_train)
Modellleistung auswerten
Wir bewerten die Leistung des Modells, indem wir einen Klassifikationsbericht (classification report) und eine Konfusionsmatrix (confusion matrix) generieren.
predicted_labels = lp_model.transduction_[unlabeled_set]
true_labels = y[unlabeled_set]
print(
"Label Spreading model: %d labeled & %d unlabeled points (%d total)"
% (n_labeled_points, n_total_samples - n_labeled_points, n_total_samples)
)
print(classification_report(true_labels, predicted_labels))
ConfusionMatrixDisplay.from_predictions(
true_labels, predicted_labels, labels=lp_model.classes_
)
Die unsichersten Vorhersagen visualisieren
Wir wählen die 10 unsichersten Vorhersagen aus und zeigen sie an.
pred_entropies = stats.distributions.entropy(lp_model.label_distributions_.T)
uncertainty_index = np.argsort(pred_entropies)[-10:]
f = plt.figure(figsize=(7, 5))
for index, image_index in enumerate(uncertainty_index):
image = images[image_index]
sub = f.add_subplot(2, 5, index + 1)
sub.imshow(image, cmap=plt.cm.gray_r)
plt.xticks([])
plt.yticks([])
sub.set_title(
"predict: %i\ntrue: %i" % (lp_model.transduction_[image_index], y[image_index])
)
f.suptitle("Learning with small amount of labeled data")
plt.show()
Zusammenfassung
In diesem Lab haben wir gezeigt, wie man halbsupervisioniertes Lernen mit dem Label Spreading - Algorithmus durchführt. Wir haben das Modell mit einer geringen Menge an gelabelten Daten trainiert und es verwendet, um die Labels der verbleibenden Stichproben vorherzusagen. Das Modell hat gut funktioniert und die Labels der meisten Stichproben korrekt vorhergesagt.