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.
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.