Aktives Lernen mit Labelpropagation

Machine LearningMachine LearningBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup(["Advanced Data Analysis and Dimensionality Reduction"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/semi_supervised("Semi-Supervised Learning") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/semi_supervised -.-> lab-49184{{"Aktives Lernen mit Labelpropagation"}} ml/sklearn -.-> lab-49184{{"Aktives Lernen mit Labelpropagation"}} end

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.