手書き数字の認識

Beginner

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

はじめに

この実験では、scikit-learn を使って 0 から 9 までの手書き数字の画像を認識する方法を示します。

VM のヒント

VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替えて、Jupyter Notebook を使って練習しましょう。

時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証は自動化できません。

学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

ライブラリのインポート

まず、必要なライブラリをインポートする必要があります。可視化には matplotlib を、データセットを読み込み評価するために sklearndatasetsmetrics を、サポートベクターマシンを学習するために svm を使用します。

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

数字のデータセットを読み込んで可視化する

8x8 ピクセルの数字の画像から構成される数字のデータセットを読み込みます。最初の 4 つの画像とそれに対応するラベルを可視化するために、matplotlibimshow() メソッドを使用します。

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)

データセットの準備

画像をフラットにする必要があります。これにより、グレースケール値の各 2 次元配列を形状 (8, 8) から形状 (64,) に変換します。これにより、形状 (n_samples, n_features) のデータセットが得られます。ここで、n_samples は画像の数であり、n_features は各画像のピクセルの総数です。

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

データセットを分割する

sklearn.model_selectiontrain_test_split() メソッドを使用して、データセットを 50% の学習用と 50% のテスト用のサブセットに分割します。

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

サポートベクターマシンを学習する

sklearnsvm.SVC() メソッドを使用して、学習用サンプルに対してサポートベクター分類器を学習します。

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

モデルを予測して評価する

学習済みのモデルを使用して、テスト用サブセット内のサンプルに対する数字の値を予測します。その後、sklearn.metricsmetrics.classification_report() および metrics.ConfusionMatrixDisplay.from_predictions() メソッドを使用してモデルを評価します。

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}")

混同行列から分類レポートを再構築する

分類器の評価結果が混同行列の形式で保存されており、y_truey_pred の形式ではない場合でも、metrics.classification_report() メソッドを使用して以下のように分類レポートを作成することができます。

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"
)

まとめ

この実験では、サポートベクターマシンを使って 0 から 9 までの手書き数字を認識する方法を scikit - learn を使って学びました。数字のデータセットを読み込み、可視化し、データセットを準備して分割し、モデルを学習し、分類レポートと混同行列を使ってモデルを予測して評価しました。