Erkennen von handschriftlichen Ziffern

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 gezeigt, wie man scikit-learn verwendet, um handschriftliche Ziffern von 0-9 zu erkennen.

Tipps für die VM

Nachdem der VM-Start 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 ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/metrics("Metrics") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/model_selection -.-> lab-49107{{"Erkennen von handschriftlichen Ziffern"}} sklearn/metrics -.-> lab-49107{{"Erkennen von handschriftlichen Ziffern"}} ml/sklearn -.-> lab-49107{{"Erkennen von handschriftlichen Ziffern"}} end

Bibliotheken importieren

Zunächst müssen wir die erforderlichen Bibliotheken importieren. Wir werden matplotlib für die Visualisierung, datasets und metrics aus sklearn verwenden, um den Datensatz zu laden und zu evaluieren, und svm für das Training der Support-Vector-Maschine.

import matplotlib.pyplot as plt
from sklearn import datasets, svm, metrics
from sklearn.model_selection import train_test_split

Den Ziffern-Datensatz laden und visualisieren

Wir werden den Ziffern-Datensatz laden, der aus 8x8-Pixel-Bildern von Ziffern besteht. Wir werden die imshow()-Methode aus matplotlib verwenden, um die ersten 4 Bilder zusammen mit ihren zugehörigen Labels zu visualisieren.

digits = datasets.load_digits()

_, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3))
for ax, image, label in zip(axes, digits.images, digits.target):
    ax.set_axis_off()
    ax.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest")
    ax.set_title("Training: %i" % label)

Den Datensatz vorbereiten

Wir müssen die Bilder flach drehen, um jedes 2D-Array von Graustufenwerten von der Form (8, 8) in die Form (64,) zu bringen. Dies wird uns einen Datensatz der Form (n_samples, n_features) geben, wobei n_samples die Anzahl der Bilder und n_features die Gesamtzahl der Pixel in jedem Bild ist.

n_samples = len(digits.images)
data = digits.images.reshape((n_samples, -1))

Den Datensatz aufteilen

Wir werden den Datensatz in einen Trainings- und einen Testdatensatz von jeweils 50% unter Verwendung der train_test_split()-Methode aus sklearn.model_selection aufteilen.

X_train, X_test, y_train, y_test = train_test_split(
    data, digits.target, test_size=0.5, shuffle=False
)

Den Support-Vector-Maschinen trainieren

Wir werden einen Support-Vector-Klassifizierer auf den Trainingsbeispielen mit der svm.SVC()-Methode aus sklearn trainieren.

clf = svm.SVC(gamma=0.001)
clf.fit(X_train, y_train)

Vorhersagen und Auswerten des Modells

Wir werden das trainierte Modell verwenden, um die Ziffernwerte für die Proben im Testdatensatz zu prognostizieren. Anschließend werden wir das Modell mit den Methoden metrics.classification_report() und metrics.ConfusionMatrixDisplay.from_predictions() aus sklearn.metrics auswerten.

predicted = clf.predict(X_test)

print(
    f"Classification report for classifier {clf}:\n"
    f"{metrics.classification_report(y_test, predicted)}\n"
)

disp = metrics.ConfusionMatrixDisplay.from_predictions(y_test, predicted)
disp.figure_.suptitle("Confusion Matrix")
print(f"Confusion matrix:\n{disp.confusion_matrix}")

Klassifikationsbericht aus der Konfusionsmatrix rekonstruieren

Wenn die Ergebnisse der Auswertung eines Klassifizierers in Form einer Konfusionsmatrix und nicht in Form von y_true und y_pred gespeichert sind, können wir immer noch einen Klassifikationsbericht mit der metrics.classification_report()-Methode wie folgt erstellen:

y_true = []
y_pred = []
cm = disp.confusion_matrix

for gt in range(len(cm)):
    for pred in range(len(cm)):
        y_true += [gt] * cm[gt][pred]
        y_pred += [pred] * cm[gt][pred]

print(
    "Classification report rebuilt from confusion matrix:\n"
    f"{metrics.classification_report(y_true, y_pred)}\n"
)

Zusammenfassung

In diesem Lab haben wir gelernt, wie man mit scikit-learn handschriftliche Ziffern von 0 bis 9 mithilfe einer Support-Vector-Maschine erkennt. Wir haben den Ziffern-Datensatz geladen und visualisiert, den Datensatz vorbereitet und aufgeteilt, das Modell trainiert, und das Modell mithilfe eines Klassifikationsberichts und einer Konfusionsmatrix vorhergesagt und ausgewertet.