手書き数字の認識

Machine LearningMachine LearningBeginner
今すぐ練習

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

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

VM のヒント

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) 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{{"手書き数字の認識"}} sklearn/metrics -.-> lab-49107{{"手書き数字の認識"}} ml/sklearn -.-> lab-49107{{"手書き数字の認識"}} end

ライブラリのインポート

まず、必要なライブラリをインポートする必要があります。可視化には 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 を使って学びました。数字のデータセットを読み込み、可視化し、データセットを準備して分割し、モデルを学習し、分類レポートと混同行列を使ってモデルを予測して評価しました。