はじめに
この実験では、scikit-learn を使って 0 から 9 までの手書き数字の画像を認識する方法を示します。
VM のヒント
VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替えて、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
ライブラリのインポート
まず、必要なライブラリをインポートする必要があります。可視化には matplotlib を、データセットを読み込み評価するために sklearn の datasets と metrics を、サポートベクターマシンを学習するために svm を使用します。
import matplotlib.pyplot as plt
from sklearn import datasets, svm, metrics
from sklearn.model_selection import train_test_split
数字のデータセットを読み込んで可視化する
8x8 ピクセルの数字の画像から構成される数字のデータセットを読み込みます。最初の 4 つの画像とそれに対応するラベルを可視化するために、matplotlib の imshow() メソッドを使用します。
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_selection の train_test_split() メソッドを使用して、データセットを 50% の学習用と 50% のテスト用のサブセットに分割します。
X_train, X_test, y_train, y_test = train_test_split(
data, digits.target, test_size=0.5, shuffle=False
)
サポートベクターマシンを学習する
sklearn の svm.SVC() メソッドを使用して、学習用サンプルに対してサポートベクター分類器を学習します。
clf = svm.SVC(gamma=0.001)
clf.fit(X_train, y_train)
モデルを予測して評価する
学習済みのモデルを使用して、テスト用サブセット内のサンプルに対する数字の値を予測します。その後、sklearn.metrics の metrics.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_true と y_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 を使って学びました。数字のデータセットを読み込み、可視化し、データセットを準備して分割し、モデルを学習し、分類レポートと混同行列を使ってモデルを予測して評価しました。